2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RAPでSM30のような複数アイテム編集用画面を作る

Last updated at Posted at 2025-02-10

はじめに

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から行を選択する
    image.png
  • 編集ボタンをクリックする
    image.png
  • 新規行を作成
    image.png
  • ダイアログでキーを入力
    image.png
  • Object Pageで他の項目を入力して適用
    image.png

このブログで実施すること

このブログでは、上記のヘルプを参考にアプリケーションを作成し、追加で以下のことができるようにします。
①行追加をインラインで行う
②List Reportを経由せず、直接Object Pageを編集モードで開く

①はRAP BO側の設定で、②はBuild Work Zoneのパラメータ設定で行います。

1. 行追加をインラインで行う

1.1. Creation ModeにInlineを設定

行追加をインラインで行うには、Page Mapからテーブルを選択し、Cration ModeにInlineを設定します。
image.png

ただし、単にInlineを設定しただけでは行追加をクリックしたときに必須項目であるキー項目が未入力のため、エラーになります。
image.png

もともとのアプリケーションでは、テーブルのキーはUUIDではなく、ユーザが入力する項目になっています。そのためBehavior Definitionでmandatory : createが設定されています。

field ( mandatory : create, readonly : update ) AirlineID;

単にmandatoryとした場合はキーがブランクの状態でドラフトが登録され、2回目以降はキーの重複でエラーになります。
image.png

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;

こうすることで、ビジネス上のキーにはアスタリスクがつき、必須項目であることがわかります。
image.png

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件なので、固定のキーを設定します。

image.png

以上で、タイルをクリックしたときに直接Object Pageが編集モードで開くようになります。
image.png
image.png

おわりに

これでSM30に近いテーブル更新画面ができました。
なお、BTP ABAP EnvironmentおよびS/4HANA(オンプレミスの場合、2022~)にはBusiness Configuration Maintenance Objectという類似の機能がありますので、そちらを使うこともできます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?