はじめに
ABAP Restful Application Programming Model (RAP)で、マスタデータなどの複数行を同時に編集する画面を作る方法が以下のヘルプに載っています。
Developing Transactional Apps with Multi-Inline-Edit Capabilities
解説
List Report画面のテーブルは編集することができないので、Object Pageに遷移してからテーブルを編集します。このために親子の関係を持つビジネスオブジェクトを作る必要があります。実際に編集するのは子側のエンティティです。
親は1件だけあればよいので、「シングルトン」として作ります。具体的には、必ず結果が1件になるような条件で任意のデータソースを取得し、そこに子のエンティティの最大の更新日時をEtag用の項目として追加します。以下の例ではI_Language
のビューからログイン言語をキーに取得しています。
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Carrier Singleton Root View'
define root view entity /DMO/I_CarriersLockSingleton_S
as select from I_Language
left outer join /dmo/carrier as carr on 0 = 0
composition [0..*] of /DMO/I_Carrier_S as _Airline
{
key 1 as CarrierSingletonID,
max (carr.last_changed_at) as LastChangedAtMax,
_Airline
}
where
I_Language.Language = $session.system_language
ポイントはこれだけで、あとは子のエンティティを追加し、通常通りBehavior Definitionなどを作るだけです。
動作
ヘルプの通りに作ると、次のような動作になります。このままではステップ数が多すぎてSM30の操作感とは程遠いと言わざるを得ません。
このブログで実施すること
このブログでは、上記のヘルプを参考にアプリケーションを作成し、追加で以下のことができるようにします。
①行追加をインラインで行う
②List Reportを経由せず、直接Object Pageを編集モードで開く
①はRAP BO側の設定で、②はBuild Work Zoneのパラメータ設定で行います。
1. 行追加をインラインで行う
1.1. Creation ModeにInlineを設定
行追加をインラインで行うには、Page Mapからテーブルを選択し、Cration ModeにInline
を設定します。
ただし、単にInline
を設定しただけでは行追加をクリックしたときに必須項目であるキー項目が未入力のため、エラーになります。
もともとのアプリケーションでは、テーブルのキーはUUIDではなく、ユーザが入力する項目になっています。そのためBehavior Definitionでmandatory : create
が設定されています。
field ( mandatory : create, readonly : update ) AirlineID;
単にmandatory
とした場合はキーがブランクの状態でドラフトが登録され、2回目以降はキーの重複でエラーになります。
1.2. UUIDをキーにする
エラーを出さないためには、キーを自動採番にする必要があります。今回、ビジネス上のキーはユーザが入力するので、技術的なキーをUUIDとして自動採番させるようにします。以下のテーブルはヘルプの例とは違いますが、UUIDをキーとし、division_code
をユーザが入力する項目としています。
@EndUserText.label : 'Division Code Master'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zyasu_division {
key client : abap.clnt not null;
key uuid : sysuuid_x16 not null;
division_code : abap.char(2) not null;
name : text100;
local_created_by : abp_creation_user;
local_created_at : abp_creation_tstmpl;
local_last_changed_by : abp_locinst_lastchange_user;
local_last_changed_at : abp_locinst_lastchange_tstmpl;
last_changed_at : abp_lastchange_tstmpl;
}
1.3. UUIDを自動採番とし、ビジネス上のキーを"mandatory"にする
Behavior DefinitionでUUIDを自動採番にし、ビジネス上のキーをmandatory
に設定します。
field ( numbering: managed, readonly ) ID;
field ( mandatory ) DivisionCode;
こうすることで、ビジネス上のキーにはアスタリスクがつき、必須項目であることがわかります。
1.4. オプション:バリデーションと機能制御
オプションで以下のロジックを追加します。今回は実装していません。
- バリデーション:必須項目が未入力のまま保存した場合、エラーにする
- 機能制御:ビジネス上のキーは、登録時のみ入力可能とする
2. List Reportを経由せず、直接Object Pageを編集モードで開く
List Reportを開く際、URLパラメータに親のエンティティをキーを渡すと直接Object Pageが開きます。これに加えてpreferredMode=edit
を指定すると、Object Pageが編集モードで開きます。
例:#?DivisionSingletonID=1&Division-edit
参考:Handling of the preferredMode Parameter
SAP Build Work Zone, standard editionの場合、アプリケーションの"Visualization"タブでパラメータを設定します。親のエンティティは必ず1件なので、固定のキーを設定します。
以上で、タイルをクリックしたときに直接Object Pageが編集モードで開くようになります。
おわりに
これでSM30に近いテーブル更新画面ができました。
なお、BTP ABAP EnvironmentおよびS/4HANA(オンプレミスの場合、2022~)にはBusiness Configuration Maintenance Objectという類似の機能がありますので、そちらを使うこともできます。