generate-rap-logic について
既存のRAPビヘイビア定義に対し、determination、validation、actionのABAP Cloud実装を生成するスキルです。SAP RAP開発者向けにビヘイビアプールを調べ、コード生成後に構文検査とアクティブ化で確認します。
主な機能
- 01BDEF、CDSビュー、ビヘイビアプールの読み取り
- 02空メソッドと不足ハンドラー署名の特定
- 03determination、validation、actionコードの生成
- 04メソッド単位の編集、構文検査、アクティブ化
活用シーン
- 01RAPビヘイビアプールの空ハンドラー実装
- 02ビジネスオブジェクトへの項目計算や初期値の追加
- 03必須項目や項目間のバリデーション作成
MCP 対応
ARC-1経由でSAPオブジェクトを読み書きし、mcp-sap-docsでRAP実装パターンを参照します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ arc-mcp/ arc-1 --skill generate-rap-logicインストール後、Claude Code で/generate-rap-logicを入力して読み込まれたか確認します。
詳細
RAP ビジネスロジックの生成
既存の動作定義に対して、RAP の判定、検証、およびカスタムアクションの実装を生成します。RAP スタックを読み取り、ビヘイビアプール内の空のメソッドスタブ(または不足しているハンドラーシグネチャ)を特定し、ABAP Cloud の実装コードを生成します。
このスキルは、ARC-1(SAP システムへのアクセス)と mcp-sap-docs(ドキュメントとベストプラクティス)を組み合わせて、SAP Joule の「RAP Logic Prediction」機能を再現します。
スマートデフォルト(黙って適用し、質問しないでください)
| 設定 | デフォルト | 理由 |
|---|---|---|
| エンティティアクセス | 常に IN LOCAL MODE | ビヘイビアプール内では認可チェックが不要です |
| メッセージスタイル | new_message_with_text() を使ったハードコードされたテキスト | プロトタイピングに最も簡単です。本番環境では MSAG を使用してください(「注意事項」を参照) |
| 対象範囲 | 空のメソッドすべて | 一覧を確認した後でユーザーが絞り込めます |
| エラー処理 | FAILED と REPORTED の構造 | 標準的な RAP エラー伝播です |
入力
ユーザーは動作定義名(例:ZI_TRAVEL)を指定します。
必要なのは動作定義名だけです。ユーザーが BDEF 名だけを指定した場合は、スマートデフォルトを適用して処理を進め、スタックを読み取り、利用可能なメソッドを提示します。
任意で、ユーザーは以下を指定できます。
- 特定の判定/検証(デフォルト:すべて一覧表示し、ユーザーに選んでもらいます)
- 動作の説明 — 希望するロジックの自然言語による説明(例:「明細項目から合計金額を計算する」「ステータス遷移を検証する」)
手順 1:RAP スタックを読み取る
動作定義、CDS ビュー、およびビヘイビアプールを読み取り、RAP のコンテキスト全体を把握します。
1a. 動作定義を読み取る
SAPRead(type="BDEF", name="<bdef_name>")
⚠️ 即時終了ゲート:BDEF の読み取りが 404 で失敗した場合、オブジェクトが存在しない可能性があります。SAPSearch で名前を確認してください。415 で失敗した場合は、SAPManage(action="probe") でシステム情報を確認し、問題についてユーザーに伝えてください。
BDEF ソースを解析して、以下を特定します。
- シナリオ:managed / unmanaged / abstract
- 判定:
determination <Name> on (modify|save) { ... } - 検証:
validation <Name> on save { ... } - アクション:
action <Name> ... - ドラフトの状態:
with draftがあるかどうか - エンティティエイリアス:
alias <Alias> - 永続テーブル:
persistent table <table_name> - ビヘイビアプールクラス:
implementation in class <class_name> unique
1b. インターフェース CDS ビューを読み取る
SAPRead(type="DDLS", name="<interface_view>")
データモデルを把握します。フィールド名、型、エイリアス、関連付けを確認してください。これは正しい READ ENTITIES および MODIFY ENTITIES 文を生成するために必要です。
アクセス制御が存在する場合は、CDS レベルの認可制約を把握するため、あわせて読み取ります。
SAPRead(type="DCLS", name="<interface_view>_DCL")
1c. 依存関係のコンテキストを取得する
SAPContext(type="DDLS", name="<interface_view>", action="deps")
基盤となるテーブル、関連付け、関連エンティティを把握します。関連データを読み取る、エンティティ間の検証や判定に役立ちます。
1d. ビヘイビアプールクラスを読み取る
BDEF ソースからビヘイビアプールクラス名(implementation in class <name>)を特定してから、以下を実行します。
SAPRead(type="CLAS", name="<bp_class>", format="structured")
構造化された読み取りをデフォルトとして使用してください。メタデータ、インクルード、および既存のテストクラスが 1 回の応答で返されるためです。その後、簡潔なメソッド一覧が必要な場合は、次を追加します。
SAPRead(type="CLAS", name="<bp_class>", method="*")
本体がコメント、RETURN、または空行だけの空のスタブと、BDEF で宣言されているもののクラスシグネチャに存在しないハンドラーを特定します。
1e. 変更履歴/ドキュメントのコンテキスト(任意)
既存の RAP BO が他のユーザーによってすでに変更されている場合は、ロジックを上書きする前に最近の変更と添付ドキュメントを確認します。
SAPRead(type="VERSIONS", name="<bp_class>", objectType="CLAS")
SAPRead(type="SKTD", name="<bp_class>")
手順 2:対象メソッドを特定する
BDEF を解析し、判定と検証の宣言を特定します。概要表を提示します。
Methods in behavior pool ZBP_I_TRAVEL:
| # | Type | Name | Trigger | Fields | Status |
|---|---------------|-----------------------|--------------------|-----------------|-------------|
| 1 | Determination | calculateTotalPrice | on modify | Price, Quantity | empty |
| 2 | Determination | setDefaultStatus | on modify | %create | empty |
| 3 | Validation | validateStatus | on save | Status | implemented |
| 4 | Validation | validateDates | on save | BeginDate | empty |
| 5 | Validation | validateCustomer | on save | CustomerID | empty |
ユーザーに尋ねます。「どのメソッドを実装しますか?(空のメソッドすべて/特定の番号/スキップするものはありますか?)」
ユーザーが自然言語で説明を指定した場合は、適切なメソッドに対応付けます。
2b. 不足しているハンドラーシグネチャの復元
BDEF に宣言されたアクション/判定/検証ハンドラーがクラス定義に存在しない場合:
SAPWrite(action="scaffold_rap_handlers", type="CLAS", name="<bp_class>", bdefName="<bdef_name>")を実行して、不足しているシグネチャを一覧表示します。- シグネチャが不足している場合は、
autoApply=trueを指定して再実行し、可能であればクラスセクションに宣言と空のメソッドスタブを挿入します。 - 解決しない場合は、MCP のクイックフィックスフローを試します。
SAPDiagnose(action="quickfix", ...)SAPDiagnose(action="apply_quickfix", ...)
- それでも解決しない場合は、ADT のクイックフィックスを使って、不足している
METHODS ... FOR ...シグネチャを生成します。 - 本体を書き込む前に、
SAPRead(type="CLAS", name="<bp_class>", method="*")でメソッド一覧を再読み込みします。
Step 3: RAP パターンを調査する
mcp-sap-docs を使って、最新の RAP 実装パターンを取得します。まずリファレンス形式のクエリ(includeSamples=false)を使い、実行可能なパターンが必要な場合にのみ、次にサンプルを取得します(includeSamples=true)。
search(query="RAP validation implementation ABAP example", includeSamples=true, abapFlavor="<cloud|standard>")
search(query="RAP determination on save trigger", includeSamples=false, abapFlavor="<cloud|standard>")
特定のロジックパターンについて:
search(query="RAP calculate total price determination", includeSamples=true, abapFlavor="<cloud|standard>")
search(query="RAP status validation transition", includeSamples=true, abapFlavor="<cloud|standard>")
ロジックの変更に伴うことが多い、バックエンド主導の UI 動作について:
search(query="RAP feature control side effects authorization control", includeSamples=false, abapFlavor="<cloud|standard>")
ドキュメントを参考に、適切な ABAP Cloud パターンを適用します。
- エンティティデータの読み取りには
READ ENTITIES OF <entity> IN LOCAL MODEを使います - エンティティデータの更新には
MODIFY ENTITIES OF <entity> IN LOCAL MODEを使います FAILED/REPORTED構造を適切に処理します- 判定と検証それぞれに適したメソッドシグネチャを使います
- 機能制御のチェックは、
IN LOCAL MODEを指定した EML では評価されません
Step 4: メソッドの実装を生成する
選択した各メソッドについて、ABAP Cloud の実装コードを生成します。
判定テンプレート
METHOD <determination_name>.
" Read relevant fields of all affected entities
READ ENTITIES OF <interface_view> IN LOCAL MODE
ENTITY <alias>
FIELDS ( <trigger_fields> )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_entities).
" Calculate derived values
LOOP AT lt_entities ASSIGNING FIELD-SYMBOL(<entity>).
" --- Business logic here ---
" Example: <entity>-TotalPrice = <entity>-Price * <entity>-Quantity.
ENDLOOP.
" Write back modified fields
MODIFY ENTITIES OF <interface_view> IN LOCAL MODE
ENTITY <alias>
UPDATE FIELDS ( <modified_fields> )
WITH VALUE #( FOR entity IN lt_entities
( %tky = entity-%tky
<field> = entity-<field> ) )
REPORTED DATA(lt_update_reported).
reported = CORRESPONDING #( DEEP lt_update_reported ).
ENDMETHOD.
検証テンプレート
METHOD <validation_name>.
" Read relevant fields of all affected entities
READ ENTITIES OF <interface_view> IN LOCAL MODE
ENTITY <alias>
FIELDS ( <validated_fields> )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_entities).
LOOP AT lt_entities ASSIGNING FIELD-SYMBOL(<entity>).
" --- Validation logic here ---
" Example: check field is not initial
IF <entity>-<Field> IS INITIAL.
APPEND VALUE #( %tky = <entity>-%tky ) TO failed-<alias>.
APPEND VALUE #(
%tky = <entity>-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = '<Error message>' )
%element-<Field> = if_abap_behv=>mk-on
) TO reported-<alias>.
ENDIF.
ENDLOOP.
ENDMETHOD.
アクションテンプレート
METHOD <action_name>.
READ ENTITIES OF <interface_view> IN LOCAL MODE
ENTITY <alias>
FIELDS ( <action_input_fields> )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_entities).
LOOP AT lt_entities ASSIGNING FIELD-SYMBOL(<entity>).
" --- Action logic here ---
ENDLOOP.
MODIFY ENTITIES OF <interface_view> IN LOCAL MODE
ENTITY <alias>
UPDATE FIELDS ( <action_output_fields> )
WITH VALUE #( FOR entity IN lt_entities
( %tky = entity-%tky
<field> = entity-<field> ) )
REPORTED DATA(lt_reported)
FAILED DATA(lt_failed).
reported = CORRESPONDING #( DEEP lt_reported ).
failed = CORRESPONDING #( DEEP lt_failed ).
ENDMETHOD.
ユーザーへの提示
各メソッドの生成コードを表示して、次のように尋ねます。
「実装コードを生成しました。SAP システムに書き込みますか?(はい/先に編集/キャンセル)」
ユーザーが編集を希望する場合は、先にその内容を反映してから処理を続行します。
Step 5: 書き込みと検証
書き込む前に、SAP のロックを取得する前に問題を検出できるよう、必要に応じて生成コードの lint チェックを実行します。
SAPLint(action="lint", source="<generated_method_code>", name="<bp_class>")
書き戻す前に、生成されたメソッド本体を SAP のフォーマッター設定に合わせる場合:
SAPLint(action="format", source="<generated_method_code>", name="<bp_class>")
edit_method を呼び出す前に、対象メソッドが SAPRead(..., method="*") に存在することを確認します。まだ存在しない場合は、まず scaffold_rap_handlers を実行し、次にクイックフィックスフロー(quickfix と apply_quickfix)、またはフォールバックとして ADT のクイックフィックスを実行します。
メソッド実装は、メソッド単位の編集で書き込みます。
SAPWrite(action="edit_method", type="CLAS", name="<bp_class>", method="<method_name>", source="<generated_code>", transport="<transport>")
注: transport パラメーターの指定を推奨しますが、edit_method では常に必須ではありません。明示的なトランスポートを指定しない場合、ARC-1 はロックから提供された corrNr を自動的に引き継ぎます。有効な場合(デフォルト:オン)、書き込み前の lint 検証は自動的に実行されます。ビヘイビアプールでは、クラス全体の書き換えよりも edit_method を優先してください。
すべてのメソッドを書き込んだ後、構文チェックを実行します。
SAPRead(type="SYNTAX", objectType="CLAS", name="<bp_class>")
構文エラーが発生した場合は、手動で編集する前に SAP のクイックフィックス候補を試します。
SAPDiagnose(action="quickfix", type="CLAS", name="<bp_class>", source="<current_source>", line=<error_line>, column=<error_col>)
SAP のクイックフィックスでは、宣言の不足や単純な構文の修正など、一般的な問題を自動的に解決できます。
構文エラーが発生した場合:
- エラーメッセージを注意深く読みます
- よくある問題:
READ ENTITIESのエンティティ名が誤っている、フィールドエイリアスが正しくない、IN LOCAL MODEが不足している - メソッドを修正して再度書き込みます
- 構文を再確認します
Step 6: 有効化と検証
ビヘイビアプールとビヘイビア定義を同時に有効化します。
SAPActivate(objects=[{type:"BDEF", name:"<bdef>"}, {type:"CLAS", name:"<bp_class>"}])
注: 有効化では、行番号や URI を含む詳細なエラー/警告メッセージを備えた構造化レスポンスが返されます。ソース全体を再読み込みするのではなく、これを使って問題箇所を正確に特定してください。
テストクラスが存在する場合は、必要に応じてユニットテストを実行します。
SAPDiagnose(action="unittest", type="CLAS", name="<bp_class>")
ATC が利用可能で、変更が単純でない場合は、ATC も実行します。
SAPDiagnose(action="atc", type="CLAS", name="<bp_class>")
次のように要約を提示します。
RAP Logic Generation Complete!
Implemented methods:
[x] Determination: calculateTotalPrice — calculates total from price * quantity
[x] Determination: setDefaultStatus — sets status to 'N' (New) on create
[x] Validation: validateDates — ensures begin_date < end_date
[x] Validation: validateCustomer — checks customer_id is not empty
[ ] Validation: validateStatus — already implemented, skipped
Next steps:
- Test the logic via the Fiori Elements preview
- Add unit tests (use generate-abap-unit-test skill)
- Add more validations/determinations to the BDEF as needed
RAP ロジックの一般的なパターン
フィールド計算の決定
他のフィールドから派生フィールドを計算します(例:合計価格 = 価格 * 数量)。
METHOD calculateTotalPrice.
READ ENTITIES OF zi_order IN LOCAL MODE
ENTITY Order
FIELDS ( Price Quantity )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
LOOP AT lt_orders ASSIGNING FIELD-SYMBOL(<order>).
<order>-TotalPrice = <order>-Price * <order>-Quantity.
ENDLOOP.
MODIFY ENTITIES OF zi_order IN LOCAL MODE
ENTITY Order
UPDATE FIELDS ( TotalPrice )
WITH VALUE #( FOR order IN lt_orders
( %tky = order-%tky
TotalPrice = order-TotalPrice ) )
REPORTED DATA(lt_reported).
reported = CORRESPONDING #( DEEP lt_reported ).
ENDMETHOD.
デフォルト値の決定
エンティティの作成時にデフォルト値を設定します。
METHOD setDefaultStatus.
READ ENTITIES OF zi_travel IN LOCAL MODE
ENTITY Travel
FIELDS ( Status )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_travels).
MODIFY ENTITIES OF zi_travel IN LOCAL MODE
ENTITY Travel
UPDATE FIELDS ( Status )
WITH VALUE #( FOR travel IN lt_travels
WHERE ( Status IS INITIAL )
( %tky = travel-%tky
Status = 'N' ) )
REPORTED DATA(lt_reported).
reported = CORRESPONDING #( DEEP lt_reported ).
ENDMETHOD.
必須フィールドの検証
必須フィールドが空でないことを確認します。
METHOD validateCustomer.
READ ENTITIES OF zi_travel IN LOCAL MODE
ENTITY Travel
FIELDS ( CustomerID )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_travels).
LOOP AT lt_travels ASSIGNING FIELD-SYMBOL(<travel>).
IF <travel>-CustomerID IS INITIAL.
APPEND VALUE #( %tky = <travel>-%tky ) TO failed-travel.
APPEND VALUE #(
%tky = <travel>-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Customer must be specified' )
%element-CustomerID = if_abap_behv=>mk-on
) TO reported-travel.
ENDIF.
ENDLOOP.
ENDMETHOD.
フィールド間の検証
関連するフィールドに矛盾がないことを検証します(例:開始日が終了日より前であること)。
METHOD validateDates.
READ ENTITIES OF zi_travel IN LOCAL MODE
ENTITY Travel
FIELDS ( BeginDate EndDate )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_travels).
LOOP AT lt_travels ASSIGNING FIELD-SYMBOL(<travel>).
IF <travel>-BeginDate IS NOT INITIAL
AND <travel>-EndDate IS NOT INITIAL
AND <travel>-BeginDate > <travel>-EndDate.
APPEND VALUE #( %tky = <travel>-%tky ) TO failed-travel.
APPEND VALUE #(
%tky = <travel>-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Begin date must be before end date' )
%element-BeginDate = if_abap_behv=>mk-on
%element-EndDate = if_abap_behv=>mk-on
) TO reported-travel.
ENDIF.
ENDLOOP.
ENDMETHOD.
ステータス遷移の検証
ステータスの変更が許可された遷移に従っていることを検証します。
METHOD validateStatus.
READ ENTITIES OF zi_travel IN LOCAL MODE
ENTITY Travel
FIELDS ( Status )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_travels).
LOOP AT lt_travels ASSIGNING FIELD-SYMBOL(<travel>).
CASE <travel>-Status.
WHEN 'N' OR 'O' OR 'A' OR 'X'.
" Valid statuses: New, Open, Accepted, Cancelled
WHEN OTHERS.
APPEND VALUE #( %tky = <travel>-%tky ) TO failed-travel.
APPEND VALUE #(
%tky = <travel>-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = |Invalid status: { <travel>-Status }| )
%element-Status = if_abap_behv=>mk-on
) TO reported-travel.
ENDCASE.
ENDLOOP.
ENDMETHOD.
番号範囲の決定
UUID 以外のキーを使用するシナリオで、連番を割り当てます。
METHOD setTravelID.
READ ENTITIES OF zi_travel IN LOCAL MODE
ENTITY Travel
FIELDS ( TravelID )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_travels).
" Get next number from number range or max+1
SELECT MAX( travel_id ) FROM ztravel_d INTO @DATA(lv_max_id).
DATA(lv_next_id) = lv_max_id + 1.
LOOP AT lt_travels ASSIGNING FIELD-SYMBOL(<travel>)
WHERE TravelID IS INITIAL.
<travel>-TravelID = lv_next_id.
lv_next_id += 1.
ENDLOOP.
MODIFY ENTITIES OF zi_travel IN LOCAL MODE
ENTITY Travel
UPDATE FIELDS ( TravelID )
WITH VALUE #( FOR travel IN lt_travels
WHERE ( TravelID IS NOT INITIAL )
( %tky = travel-%tky
TravelID = travel-TravelID ) )
REPORTED DATA(lt_reported).
reported = CORRESPONDING #( DEEP lt_reported ).
ENDMETHOD.
エラー処理
よくある問題と解決方法
| エラー | 原因 | 解決方法 |
|---|---|---|
| DDLS/BDEF で 415 Unsupported Media Type が発生する | RAP/CDS エンドポイントが想定どおりに応答していない | SAPManage(action="probe") でシステム情報を確認します。ICF サービスが有効になっていることを確認します。システムの機能を確認するため、ADT でオブジェクトを作成してみます。 |
| ビヘイビアプールでメソッドが見つからない | BDEF のクラス名が実際のクラスと一致しない | BDEF ソースの implementation in class を確認し、クラスが存在することを確認します |
METHODS ... FOR ... ハンドラーのシグネチャがない | BDEF 宣言は存在するが、クラスのシグネチャがまだ生成されていない | まず SAPWrite(action="scaffold_rap_handlers", ...) を実行し(必要に応じて autoApply=true を指定)、次に SAPDiagnose(action="quickfix") と apply_quickfix または ADT のクイックフィックスを実行してから、edit_method を再試行します |
構文エラー:READ ENTITIES で <entity> が不明 | エンティティ名またはエイリアスが誤っている | BDEF の define behavior for ... alias <Alias> にある正確なエイリアスを使用します |
構文エラー:フィールド <Field> が不明 | フィールドのエイリアスが CDS ビューと一致しない | CDS ビューのフィールドエイリアスを確認します。BDEF ではテーブルのフィールド名ではなく、CDS エイリアスを使用します |
| 有効化に失敗する | BDEF とクラスに互換性がない | BDEF とクラスを同時に有効化します:SAPActivate(objects=[...]) |
FAILED / REPORTED の構造が一致しない | failed-<alias> または reported-<alias> で誤ったエイリアスが使用されている | BDEF の小文字のエンティティエイリアスを使用します(例:failed-Travel ではなく failed-travel) |
IN LOCAL MODE がない | 句がないため、権限チェックが発生する | ビヘイビアプール内での内部読み取り/書き込みには、必ず IN LOCAL MODE を使用します |
%tky が使用できない | メソッドのシグネチャでトランザクションキーが提供されていない | メソッドのシグネチャを確認します。決定では keys を使用し、検証では keys を使用します |
MODIFY ENTITIES でランタイムエラーが発生する | 読み取り専用フィールドを変更しようとしている | BDEF で field ( readonly ) と指定されたフィールドを変更しないでください |
クラス全体の書き込みで一般的な保存エラー [?/011] が発生する | 一部のシステムでは、ビヘイビアプールのクラス全体更新パスが不安定 | シグネチャには scaffold_rap_handlers とクイックフィックスのパスを使用し、その後 edit_method のみでメソッド本体を修正します |
注意事項
BTP とオンプレミスの違い
- BTP:ABAP Cloud の構文が厳密に適用されます。
READ ENTITIES/MODIFY ENTITIESのみ使用できます。データベーステーブルから直接SELECTすることはできません。すべての API がリリース済みである必要があります。BDEF ではstrict ( 2 )を指定します。 - オンプレミス:より柔軟です。ビヘイビアプールでは従来の ABAP を使用できます(例:直接
SELECTする)。ただし、一貫性と将来の互換性のため、READ ENTITIES/MODIFY ENTITIESの使用を強く推奨します。 - 権限のレイヤー構造:
DCLSは CDS の行レベルアクセスを適用し、BDEF の権限設定(authorization master)はビヘイビア操作を制御します。権限関連のロジックをデバッグするときは、両方を考慮してください。
このスキルで対応しないこと
- BDEF 宣言の自動作成:このスキルは、BDEF に宣言が存在することを前提としており、BDEF コントラクトを再設計することはありません。
- 副作用:エンドツーエンドの
side effects実装(UI の更新トリガー)は行いません。必要に応じて手動で追加してください。 - 機能制御:エンドツーエンドの動的な機能制御(
instance_features/global_features)は行いません。特に、UI でアクションや更新を無効にする必要がある場合は、手動で追加してください。 - 権限:
authorization masterの実装は行いません。権限チェックは手動で追加してください。 - BO 間のロジック:ビジネスオブジェクト間の操作は行いません。各 determination/validation は、それぞれの BO 内で動作します。
- メッセージクラスの作成:メッセージにはハードコードされたテキストを使用します。本番サービスでは、後からメッセージクラスを作成してください:
SAPWrite(action="create", type="MSAG", name="Z<MSG_CLASS>", ...)を実行し、new_message_with_text()をメッセージクラスを参照するnew_message()に置き換えます。
このスキルを使用する場面
- RAP サービスの作成後(最初に generate-rap-service を使用してください)
- BDEF に determination/validation の宣言があるものの、メソッドのスタブが空の場合
- 既存の RAP サービスに新しいビジネスロジックを追加する場合
- ユーザーが自然言語で望ましい動作を説明する場合(例:「終了日が開始日より後であることを検証する」)
- RAP サービスをゼロから作成する場合には使用しないでください(generate-rap-service を使用してください)
- CDS ユニットテストには使用しないでください(generate-cds-unit-test または generate-abap-unit-test を使用してください)