1.はじめに
RAP(ABAP RESTful Application Programming Model)を学んでいると、factory actionという見慣れないキーワードに出会います。
例えば、Fiori app「受注管理」のBehavior Definitioinを見ることができます。
static factory action CreateWithReference deep parameter D_SalesDocCreateWithRefDocP [1];
名前から「新規作成系のアクションっぽい?」と想像できますが、
実際にはCreateでもActionでもない、中間的な立ち位置の機能です。
この記事では、
・Factory Actionの概要
・Create/Actionとの違い
・定義・実装の流れ
・使いどころと注意点
を初心者にも分かるように整理していきます。
2.Factory Actionとは?
RAPでは、エンティティに対する操作を大きく3種類に分類できます:
| 区分 | 対象 | 用途 | 例 |
|---|---|---|---|
| Create/Update/Delete | エンティティ | 標準的なCRUD操作 | 新規登録・変更・削除 |
| Action | 既存エンティティ | 独自処理・状態遷移 |
Approve, Cancel
|
| Factory Action | 新規エンティティ(=未存在) | 独自の生成ロジック |
CreateFromTemplate, CreateWithReference
|
つまり、「新しいエンティティを生成する」ためのActionがFactory Actionです。
通常のCreateと違って、生成の仕方を開発者が自由に制御できます。
3.Factory Actionを使うと何が嬉しい?
Createは「ユーザが入力した内容をそのまま登録」しますが、Factory Actionは「事前ロジックで値を加工・決定」してから作成します。
たとえば:
・既存データをもとに一部値をコピーして新規作成
・バリデーションや前処理を通して初期データを返す
・システム内部ルールに従って初期値をセット
など、“Createでは表現できない生成シナリオ”に対応できます。
4.定義方法(Behavior Definition)
define behavior for ZI_SalesOrder alias SalesOrder
~~~
{
~~~
factory action CreateWithTemplate parameter ZD_SALESORDER_TEMPLATE [1];
~~~
}
ここでの意味:
| 要素 | 説明 |
|---|---|
factory action |
通常の action ではなく「生成系」であることを明示 |
parameter |
Factory Action実行時に、ユーザから受け取る入力データを定義します。Fiori Elementsの場合、このパラメータ構造に基づいてポップアップ入力画面が自動生成され、ユーザが値を入力できます。 |
[1] |
単一入力(配列ではない) |
5.実装方法(Behavior Implementation)
METHOD CreateWithTemplate.
" 例: テンプレートIDから雛形データを取得
SELECT SINGLE * FROM zsales_template
WHERE TemplateID = @keys[ 1 ]-%param-template_id
INTO @DATA(ls_template).
lt_SalesOrder = VALUE #( ( %cid = keys[ 1 ]-%cid
%is_draft = '01'
%data = VALUE #( Product = ls_template-Product
Plant = ls_template-Plant
) ) ).
MODIFY ENTITIES OF ZI_SalesOrder IN LOCAL MODE
ENTITY SalesOrder
CREATE FIELDS ( Product Plant )
WITH lt_SalesOrder
MAPPED DATA(mapped_create).
mapped-SalesOrder = mapped_create-SalesOrder.
ENDMETHOD.
・%paramに外部入力(テンプレートIDなど)が入ります。
6.まとめ
・Factory Action = 「生成専用のAction」
・Createより柔軟に生成ロジックを定義できる
・コピー・テンプレート生成・初期値付与などに最適
・Fiori Elementsでも自動的に呼び出し可能