0
Help us understand the problem. What are the problem?

posted at

updated at

【RAP】ADTのRAP Generatorを使ってみる

はじめに

BTP ABAP Environmentの2111のリリースで、RAP Generatorが使えるようになりました。RAP Generatorとは、RAP(ABAP RESTful Application Programming Model)で必要な各種オブジェクトを自動生成してくれるツールです。

RAPに必要なオブジェクトは以下のように多数あり、マニュアルで生成するのは大変でした。

  • CDS View (Interface, Projection)
  • Behavior Definition (Interface, Projection)
  • Behavior Implementation
  • Service Definition
  • Service Binding

これまでのRAP Generator

これまでは、SAPのAndre Fischer氏が開発したRAP Generatorがあり、JSONの設定を貼り付けたABAPクラスを実行することによって必要なオブジェクトを自動生成することができました。区別のためこれを「既存Generator」と呼ぶことにします。
既存Generatorを使うためには、Gitリポジトリから必要なソースをダウンロードしてくる必要があります。会社によってはGitにつなぐことが許可されないため、既存Generatorを使いたくても使えないケースもあると思います。

新RAP Generator

新しいRAP GeneratorはADTに組み込まれているので、追加の設定なく使うことができます(※)。なお、ADTのバージョンは最新に上げる必要があります。

※2現在のところサポートされているのはBTP ABAP環境のみです。オンプレミスではS/4HANA 2022以降で使えるようになる予定です。
https://blogs.sap.com/2021/11/15/sap-btp-abap-environment-release-2111/comment-page-1/#comment-607332

新旧機能比較

新RAP Generatorは登場したばかりということもあって、機能は限定されています。既存RAP Generatorは2020年から存在し、徐々に拡張されてきたため、新RAP Generatorと比べて機能が充実しています。以下は2021年12月時点の機能比較です。

項目 既存Generator 新Generator
サポートするシナリオ Managed, Unmanaged Managedのみ
複数階層のビジネスオブジェクト 作れる 作れない
ドラフト有無 選べる 選べない(ドラフトありになる)
ODataバージョン V2, V4 V4のみ

このほか、既存GeneratorはJSONの設定によって生成されるオブジェクトを細かく設定することができます。これに対して新Generatorで設定できるのはオブジェクトの名称だけです。

新RAP Generatorを使ってみる

私はRAPについてOpenSAPのコースで学んだものの、自分が作りたいものを一から作った経験はありません。RAPに対しては「作るものが多い」「EMLなど、新しいABAPを覚える必要がある」「なんとなく難しそう」という印象を持っています。
しかし、RAP Generatorは少なくとも、最初のハードルを下げてくれるものにはなりそうです。以降では、RAP Generatorで土台を作り、そこに徐々に機能をつけ足していくことでRAPについて学んでいきます。長くなるので何回かの記事に分ける予定です。

今回は以下を実施します。

  1. テーブル定義
  2. Generatorで必要なオブジェクトを生成
  3. 実行してみる

<環境>
・BTPトライアルのABAP環境
・ADTの最新版
 ⇒参考チュートリアル

1. テーブル定義

以下のテーブルを定義します。

@EndUserText.label : 'Managed Person'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zperson_m {
  key client            : abap.clnt not null;
  key person_uuid       : sysuuid_x16 not null;
  first_name            : abap.char(100);
  last_name             : abap.char(100);
  email                 : abap.char(120);
  birthday              : abap.dats;
  created_by            : abp_creation_user;
  created_at            : abp_creation_tstmpl;
  last_changed_by       : abp_locinst_lastchange_user;
  local_last_changed_at : abp_locinst_lastchange_tstmpl;
  last_changed_at       : abp_lastchange_tstmpl;

}

キー項目について
キーを自動で生成させるため、データエレメントにsysuuid_x16を使用します。

管理項目について
created_by, created_atなどの管理項目については事前定義されたデータエレメントを使用します(RAP Reuse Data Elementsを参照)。

last_changed_atとlocal_last_changed_atの違い
最終更新日時を表す項目が2つありますが、それぞれ以下の意味を持っています。

  • last_changed_at:ビジネスオブジェクト全体(子のエンティティも含めて)が最後に更新されたときのタイムスタンプを保持する
  • local_last_changed_at:当該のエンティティについて、最後に更新されたときのタイムスタンプを保持する

ビジネスオブジェクト全体が更新されたときのタイムスタンプは、ドラフトの排他制御のため必要になります(詳しくはTotal ETagを参照)。当該のエンティティが更新されたときのタイムスタンプは、楽観的排他制御のためのEtag(Etag master)として使われます。
Total EtagとEtag masterは目的が異なるため、別々の項目を用意する必要があります。

2. Generatorで必要なオブジェクトを生成

テーブルを右クリックし、"Generate ABAP Repository Objects"をクリックします。
image.png

Generatorが二種類選べますが、ここでは"UI Service"を選択します。
image.png
次のウィザードでは、生成するオブジェクトの名称を指定します。今回は以下のように設定しました。
※大文字小文字は関係なくすべて大文字で生成されます

項目 設定値 説明
Data Definition Name zi_person_m CDS View(Interface View)の名前
Alias Name Person CDS Viewの中で使われるエイリアスの名前
Behavior Implementation Class zbp_person_m クラス名
Draft Table Name zperson_m_d ドラフトテーブルの名前
Service Projection Name zc_person_m CDS View(Consumption View)の名前
Service Definition Name zperson_m Service Definitionの名前
Service Binding Name zui_person_m_04 Service Bindingの名前

名称を入力し終わってNextを押すと、生成されるオブジェクトの一覧が表示されます。
image.png

Nextを押し、最後にFinishを押すとService Bindingの画面が表示されます。Publishを押して公開します。
image.png

3. 実行してみる

エンティティ"Person"を選択して"Preview"をクリックします。
image.png

List Reportの画面が開きました。Metadata Extensionにデフォルトでアノテーションが入っているので、テーブル項目が表示されています。
image.png

Person以外の項目のラベルがないので、ZI_PERSON_Mのビューで@EndUserText.labelのアノテーションを設定します。Personについてはデータエレメントからラベルが設定されています。

@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '##GENERATED Managed Person'
define root view entity ZI_PERSON_M
  as select from zperson_m as Person
{
  key person_uuid as PersonUUID,
  @EndUserText.label: 'First Name'
  first_name as FirstName,
  @EndUserText.label: 'Last Name'  
  last_name as LastName,
  @EndUserText.label: 'Email' 
  email as Email,
  @EndUserText.label: 'Birthday'
  birthday as Birthday,
  @Semantics.user.createdBy: true
  created_by as CreatedBy,
  @Semantics.systemDateTime.createdAt: true
  created_at as CreatedAt,
  @Semantics.user.localInstanceLastChangedBy: true
  last_changed_by as LastChangedBy,
  @Semantics.systemDateTime.localInstanceLastChangedAt: true
  local_last_changed_at as LocalLastChangedAt,
  @Semantics.systemDateTime.lastChangedAt: true
  last_changed_at as LastChangedAt

}

ラベルが表示されるようになりました。
image.png

Createボタンを押すとObject Pageが開きます。Metadata Extensionに@UI.identificationのアノテーションが定義されているので何もしなくても項目が表示されています。
image.png
項目に入力すると、右下に"Draft saved"というメッセージが出ます。"Create"を押すと、データが保存されます。
image.png
List Report画面に戻って"Go"を押すと保存したデータが表示されます。
image.png

ここまでで、RAP Generatorを使ってCRUD対応したアプリケーションができました。次回はこのアプリケーションに機能を追加していきます。

続編

リファレンス

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?