generate-rap-service について
generate-rap-serviceは、業務オブジェクトの自然言語による説明から、テーブル、CDSビュー、ビヘイビア定義、OData UIサービスを含むSAP RAPの成果物一式を生成します。SAP開発向けで、システムの機能や制約を踏まえて既定値を適用します。
主な機能
- 01説明からRAP成果物一式を生成
- 02テーブル、CDSビュー、ビヘイビア定義の作成
- 03メタデータ拡張とサービスバインディングの生成
- 04SAPシステムの機能と制約を確認
- 05SAPの命名規則と型規則を適用
活用シーン
- 01業務要件からRAPサービスを構築
- 02Fiori Elements向けOData UIサービスを準備
- 03SAPシステムのリリースに応じて生成方法を調整
MCP 対応
ARC-1経由でSAPシステムにアクセスし、mcp-sap-docsをドキュメント参照に利用できます。公式のabap-mcpサーバーが接続され、条件を満たす場合は生成を委任できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ arc-mcp/ arc-1 --skill generate-rap-serviceインストール後、Claude Code で/generate-rap-serviceを入力して読み込まれたか確認します。
詳細
RAP OData UI サービスを生成する
ビジネスオブジェクトの自然言語による説明から、完全な RAP OData UI サービスを生成します。データベーステーブル、CDS ビュー、ビヘイビア定義、メタデータ拡張、サービス定義、ビヘイビアプールクラスを含む、すべてのアーティファクトを作成します。
このスキルは、ARC-1(SAP システムへのアクセス)と mcp-sap-docs(ドキュメントとベストプラクティス)を組み合わせ、SAP Joule の「RAP Service Generation」機能を再現します。
v1 のガードレール(高速パス):マネージドシナリオのみ、UUID 内部早期採番、デフォルトで単一ルートエンティティ、まず標準 CRUD、ドラフトは任意、OData V4 を優先します。複数エンティティのコンポジションや複雑なカスタムアクションには、generate-rap-service-researched を優先してください。
スマートデフォルト(自動適用し、質問しない)
| 設定 | デフォルト | 理由 |
|---|---|---|
| パッケージ | トランスポート付きのユーザーの Z* パッケージ | 本番環境に対応します。ユーザーから明示的な指定がある場合のみ $TMP を使用します |
| キー戦略 | UUID(sysuuid_x16)、マネージド採番 | 最もシンプルで、競合のリスクがありません |
| ビヘイビアシナリオ | マネージド | フレームワークが CRUD を処理します |
| OData バージョン | V4 | 現在の SAP 標準です |
| ドラフト | トランザクション型 Fiori Elements UI サービスでは優先し、リリースや制約を確認します | 編集可能な FE アプリに最適なデフォルトですが、すべての RAP サービスにドラフトが必要なわけではありません |
| 管理フィールド | syuname/timestampl(オンプレミス)または abp_* 型(BTP) | システムに適した設定です |
| strict モード | システムのパターンや SAP の制約により正当化されない限り strict ( 2 ) | 現在の RAP のベストプラクティスですが、例外もあります |
| エンティティプレフィックス | Z + エンティティ名(例:ZTRAVEL) | SAP 標準の Z 名前空間です |
| 命名 | SAP 標準:ZI_、ZC_、ZSD_、ZSB_、ZBP_I_ | SAP ドキュメントとの一貫性を保ちます |
| サービス公開 | デフォルトで OData V4 UI プロバイダーコントラクト | API ファーストのユースケースを除き、Fiori Elements に最適です |
入力
ユーザーはビジネスオブジェクトを自然言語で説明します(例:「代理店、顧客、目的地、開始日/終了日、合計金額、通貨、ステータスのフィールドを含む旅行予約アプリ」)。
必要なのはビジネスオブジェクトの説明だけです。ユーザーが説明のみを提供した場合は、スマートデフォルトを適用してすぐに進めます。
必要に応じて、ユーザーは以下を指定できます。
- エンティティ名のプレフィックス(デフォルト:説明から自動生成)
- パッケージ(必須 — 指定されていない場合は質問します。ユーザーから明示的な指定がある場合のみ
$TMPをデフォルトにします) - トランスポート依頼(
$TMP以外のパッケージでのみ必要 — ステップ 1b を参照) - ドラフトの有効化(デフォルト:BTP でははい、オンプレミスではいいえ)
- OData バージョン(デフォルト:V4)
ステップ 1:システム機能を確認する
SAP システムが RAP/CDS に対応しているか確認し、システムタイプを検出します。
SAPManage(action="probe")
構文とフォーマッターの動作について、より確実な基準が必要な場合は、以下も読み取ります。
SAPRead(type="SYSTEM")
SAPLint(action="list_rules")
SAPLint(action="get_formatter_settings")
重要なゲート: プローブによって RAP/CDS が利用できないことが明確に報告された場合は停止し、エンドポイント/システムの設定が修正されるまで ARC-1 経由では RAP オブジェクトを作成できないことをユーザーに伝えます。
BTP かオンプレミスかを判定します。これは命名規則、言語バージョン、ドラフトの扱いに影響します。
ステップ 1b:パッケージとトランスポートを解決する
指定されていない場合は、対象パッケージをユーザーに確認します。その後、トランスポート依頼を解決します(パッケージが $TMP の場合のみ省略します)。
SAPTransport(action="check", objectType="DDLS", objectName="<first_object_name>", package="<package>")
これにより、トランスポートが必要かどうかを確認し、そのパッケージで既存のトランスポートを返します。トランスポートが必要な場合:
- ユーザーがトランスポートを指定した場合:すべての作成操作でそれを使用します
- 既存のトランスポートが見つかった場合:一覧を提示し、ユーザーに選択してもらいます
- 利用可能なトランスポートがない場合:作成します
SAPTransport(action="create", description="RAP Service: <Entity>", package="<package>")
トランスポートが必要なのに利用できない場合は、停止してください — $TMP 以外のパッケージでは、有効なトランスポートがないとすべての書き込み操作が失敗します。
パッケージがまだ存在せず、ユーザーが新規作成を希望する場合は、先に作成します。
SAPManage(action="create_package", name="<package>", description="<description>", transport="<transport_if_required>")
BTP とオンプレミスの違い
| Aspect | BTP(ABAP Cloud) | オンプレミス(ABAP Platform) |
|---|---|---|
| 名前空間 | Z*/Y* のみ | Z*/Y* または顧客名前空間 |
| 言語バージョン | ABAP for Cloud Development(厳格) | Standard ABAP または ABAP for Cloud |
| ドラフトテーブル | 明示的に作成する必要があります(フレームワークが管理するのはデータであり、テーブルではありません) | 明示的に作成する必要があります |
| OData バージョン | V4 を推奨 | V2 または V4 |
| ビヘイビアプール | ABSTRACT クラス、ABAP Cloud のみ | ABSTRACT クラス、クラシック ABAP も使用可能 |
| テーブルエンティティ | DEFINE TABLE ENTITY DDL 構文 | クラシック DDIC テーブル(SE11)またはテーブルエンティティ |
オンプレミス 7.5x の簡易ガードレール
- TABL ソースでは、
syuname+timestamplを使用します(abap.uname/abap.utclongは使用しません)。 - TABL のブール値相当のフラグには
abap.char(1)を使用します(abap.booleanは使用しません)。 - すべての
abap.curr(...)フィールドの上には、@Semantics.amount.currencyCodeが必要です。 - プロジェクション BDEF のヘッダーは
projection;のままにします(ヘッダー行にuse etagを追加しないでください)。 - RAP の事前チェックは有効(デフォルト)のままにし、決定的な TABL/BDEF/DDLX の問題が、有効化の繰り返しの前にブロックされるようにします。
preflightBeforeWrite=falseはローカルでの回避策としてのみ使用してください。 - ビヘイビアプールのクラス全体の書き込みで汎用的な保存エラーが発生する場合は、まず
SAPWrite(action="scaffold_rap_handlers", ...)を使用してシグネチャを導出・適用し、その後、クイックフィックスの代替手段とSAPWrite(action="edit_method")を使用してメソッド本体を記述します。
ステップ 2:データモデルを設計する
ユーザーの説明に基づいて、成果物一式を設計します。SAP の命名規則に従います。
命名規則
| 成果物 | パターン | 例 |
|---|---|---|
| データベーステーブル(テーブルエンティティ) | Z<ENTITY>_D | ZTRAVEL_D |
| インターフェイス CDS ビュー | ZI_<Entity> | ZI_TRAVEL |
| プロジェクション CDS ビュー | ZC_<Entity> | ZC_TRAVEL |
| メタデータ拡張 | ZC_<Entity> | ZC_TRAVEL |
| インターフェイスビヘイビア定義 | ZI_<Entity> | ZI_TRAVEL |
| プロジェクションビヘイビア定義 | ZC_<Entity> | ZC_TRAVEL |
| アクセス制御(DCL) | ZI_<Entity>_DCL | ZI_TRAVEL_DCL |
| サービス定義 | ZSD_<Entity> | ZSD_TRAVEL |
| サービスバインディング | ZSB_<Entity>_V4 | ZSB_TRAVEL_V4 |
| ビヘイビアプールクラス | ZBP_I_<Entity> | ZBP_I_TRAVEL |
| ドラフトテーブル(ドラフトの場合) | Z<ENTITY>_DD | ZTRAVEL_DD |
フィールド設計ルール
すべてのエンティティに次の標準フィールドを含めます。
| フィールド | 型 | 用途 |
|---|---|---|
key_uuid | sysuuid_x16 | UUID 主キー(内部の早期採番) |
created_by | syuname / abp_creation_user | 管理:作成者 |
created_at | timestampl / abp_creation_tstmpl | 管理:作成日時 |
last_changed_by | syuname / abp_locinst_lastchange_user | 管理:最終変更者 |
last_changed_at | timestampl / abp_locinst_lastchange_tstmpl | 管理:最終変更日時(ローカルインスタンス) |
local_last_changed_at | timestampl / abp_lastchange_tstmpl | 管理:合計 ETag フィールド |
ユーザーの説明に基づいて業務フィールドを追加します。適切な ABAP 型を選択します。
- テキスト:
abap.char(N)またはabap.sstring(N) - 金額:通貨コードフィールド(
abap.cuky(5))を伴うabap.curr(15,2) - 日付:
abap.dats - ステータス:固定値を持つ
abap.char(1) - 数量:単位フィールド(
abap.unit(3))を伴うabap.quan(13,3) - 整数:
abap.int4
ユーザーへの出力
設計全体を表として提示します。
Proposed artifact stack for "Travel Booking":
| # | Type | Name | Description |
|---|------|------|-------------|
| 1 | TABL | ZTRAVEL_D | Database table entity |
| 2 | DDLS | ZI_TRAVEL | Interface CDS view entity |
| 3 | DCLS | ZI_TRAVEL_DCL | CDS access control (authorization rules) |
| 4 | BDEF | ZI_TRAVEL | Interface behavior definition |
| 5 | DDLS | ZC_TRAVEL | Projection CDS view entity |
| 6 | BDEF | ZC_TRAVEL | Projection behavior definition |
| 7 | DDLX | ZC_TRAVEL | Metadata extension (UI annotations) |
| 8 | SRVD | ZSD_TRAVEL | Service definition |
| 9 | CLAS | ZBP_I_TRAVEL | Behavior pool class |
| 10 | SRVB | ZSB_TRAVEL_V4 | Service binding |
Fields: key_uuid, agency_id, customer_id, destination, begin_date, end_date,
total_price, currency_code, status, created_by, created_at,
last_changed_by, last_changed_at, local_last_changed_at
ユーザーに次のように尋ねます:「この設計で進めてもよろしいですか?(はい/フィールドを変更/名前を変更)」
ステップ 3:(任意)RAP パターンを調査する
mcp-sap-docs が利用できる場合は、最新の RAP ベストプラクティスを取得します。まず参照形式のクエリ(includeSamples=false)を使い、必要な場合にのみ例(includeSamples=true)を使用します。
search(query="RAP projection BO vs RAP BO interface", includeSamples=false, abapFlavor="<cloud|standard>")
search(query="RAP draft handling total etag draft-enabled associations", includeSamples=false, abapFlavor="<cloud|standard>")
search(query="service definition provider contracts odata_v4_ui odata_v4_webapi", includeSamples=false, abapFlavor="<cloud|standard>")
search(query="metadata-driven UI metadata extension RAP Fiori Elements", includeSamples=false, abapFlavor="<cloud|standard>")
取得したドキュメントを活用して、適切なアノテーションパターン、ドラフトの処理、プロバイダーコントラクト、ビヘイビア定義の構文を確認します。
ステップ 3b:(任意)ビルドを SAP 公式の ABAP ジェネレーターに委任する
公式 SAP ABAP MCP サーバーが ARC-1 とともに接続されている場合(ABAP Development Tools for VS Code に同梱されており、Eclipse ADT 3.60 以降では有効になっていて、abap-mcp サーバーとして表示されます)、単一ルートのビルドを SAP 独自の Generate ABAP Repository Objects フレームワークに任せ、ステップ 4〜13 の手動テンプレートを省略できます。これは任意です。以下の各ステップには ARC-1 を使う代替手段があり、ジェネレーターが適合するのは限られた構成だけです。
次の条件をすべて満たす場合にのみジェネレーターを使用してください(そうでなければ、以下の バッチ作成 に進んでください)。
- ルートエンティティがちょうど 1 つ — ジェネレーターは「最大 1 つのエンティティ」を対象としており、コンポジションや階層には対応しません。
- マネージド + ドラフト — 生成できるのはこのモードのみです。
- 基底テーブルに最新のタイムスタンプフィールド
last_changed : abp_lastchange_tstmplとlocal_last_changed : abp_locinst_lastchange_tstmplが含まれている(ジェネレーターが必須とします)、またはテーブルも生成される スクラッチから作成 のバリアントを使う。 - 一度限りであることを受け入れる — 「生成後の使用は想定されていません」。再実行しても既存の BO は拡張されず、以降の変更は手動で行います(ARC-1 の担当です)。
3b-1. サーバーを確認する
abap_generators-list_generators というツール(公式の abap-mcp サーバー)がない場合は、接続されていません。バッチ作成 に進んでください。ユーザーには確認せず、そのまま何も伝えずに代替手段へ切り替えてください。
3b-2. ジェネレーター ID を特定する(ID はリリースごとに異なります — 決してハードコードしないでください)
abap_generators-list_generators を呼び出し、表示名が「OData UI Service」(Fiori UI アプリ用)または「OData Web API Service」(ヘッドレス API 用)のジェネレーターを選び、返された id を使用してください。ID はリリースによって異なります。以下で実環境で確認されています。
| リリース | UI サービス | Web API サービス | スクラッチから作成(テーブルも生成) |
|---|---|---|---|
| S/4HANA 2023(SAP_BASIS 758) | uiservice | webapiservice | — |
| ABAP Platform 2025(SAP_BASIS 816) | ui-service | webapi-service | x-ui-service |
一致するジェネレーターが表示されない場合、このリリースではフレームワークを使用できません。バッチ作成 に進んでください。
3b-3. 入力スキーマを読む
abap_generators-get_schema には 5 つの入力が必要で、実在する参照テーブルがないとエラーになります。
abap_generators-get_schema(
generatorId = "<id from 3b-2>",
packageName = "<target package>", // your allowlisted package, or $TMP
referencedObjectType = "TABL",
referencedObjectName = "<existing base table>")
(スクラッチから作成する x-ui-service では参照テーブルは不要です。返されたスキーマで確認してください。)返されるスキーマで一般的な設定項目は、パッケージ、データモデル(ルートエンティティ名 + EML エイリアス)、ビヘイビア(ドラフトテーブル名)、サービスプロジェクション名、サービス定義、サービスバインディング(OData サービス名)、トランスポートです。実際のスキーマを読み、すべての必須フィールドに値を設定してください。このドキュメントにあるフィールド名を想定しないでください。リリースによって異なります。
S/4HANA 2023(uiservice、参照テーブル ZARC1_DEMO_BOOK)で確認された構成 — 実環境で検証済みです。異なる場合があるため、実際の応答を確認してください。
dataModelEntity.cdsName → ZR_ARC1_DEMO_BOOK (root CDS)
implementationClass → ZBP_ARC1_DEMO_BOOK (behavior pool class)
draftTable → ZARC1_DEMO_BOOKD
serviceProjection.name → ZC_ARC1_DEMO_BOOK (projection CDS, exposed by the service)
serviceDefinition.name → ZUI_ARC1_DEMO_BOOK_O4
serviceBinding.name → ZUI_ARC1_DEMO_BOOK_O4 (binding type: OData V4 - UI)
3b-4. 生成する
abap_generators-generate_objects(generatorId="<id>", <filled schema>) を実行します。これは変更操作です。ARC-1 の書き込みと同じ安全策(許可リストにあるパッケージ + 実際のトランスポート、または $TMP)を適用してください。1 回の呼び出しで、CDS ルート + プロジェクション、BDEF + ビヘイビアクラス、メタデータ拡張(DDLX)、ドラフトテーブル、サービス定義、サービスバインディングが作成されます。
3b-5. 検証してから、ARC-1 で続行する
ARC-1(SAPActivate、SAPRead)または公式の abap_activate_objects を使って、アクティブ化/検証します。ARC-1 でサービスバインディングを公開してください — SAPActivate(action="publish_srvb", name="<binding>") — 7.5x では、ジェネレーターが SRVB を作成してアクティブ化するものの、ジェネレーター自身の公開ステップが 406(公開ジョブのコンテンツネゴシエーション)を返し、published:false のままランタイム URL が設定されないためです。ARC-1 の publish_srvb は 758 のコンテンツタイプに対応し、published:true に切り替えます(S/4HANA 2023 で実際に検証済みです。生成されたバインディングは未公開から公開済みに変わり、その後 $metadata は HTTP 200 を返しました)。以降、単一エンティティを一度だけ生成するジェネレーターでは対応できない作業(フィールド、コンポジション/子要素、アクションとハンドラー本体(SAPWrite action="edit_method")、判定、検証、およびその後のすべての編集)には ARC-1 を使います。
どちらの方法を使ったかを明記してください(「ベース BO は abap-mcp <id> で生成し、ARC-1 で拡張」または「すべて ARC-1 で構築」)。これにより、実行内容を監査可能な状態に保てます。
バッチ作成(推奨)
ステップ 4~13 で各アーティファクトを個別に作成する代わりに、バッチ作成を使うと、1 回のツール呼び出しですべての RAP アーティファクトを作成できます。
SAPWrite(action="batch_create", objects=[
{type: "TABL", name: "<table_name>", description: "<Entity> Table", source: "<table_ddl>"},
{type: "DDLS", name: "ZI_<entity>", description: "<Entity> Interface View", source: "<interface_view_ddl>"},
{type: "DCLS", name: "ZI_<entity>_DCL", description: "<Entity> Access Control", source: "<interface_dcl_source>"},
{type: "DDLS", name: "ZC_<entity>", description: "<Entity> Projection View", source: "<projection_view_ddl>"},
{type: "BDEF", name: "ZI_<entity>", description: "<Entity> Interface Behavior", source: "<interface_bdef>"},
{type: "BDEF", name: "ZC_<entity>", description: "<Entity> Projection Behavior", source: "<projection_bdef>"},
{type: "DDLX", name: "ZC_<entity>", description: "<Entity> Metadata Extension", source: "<ddlx_source>"},
{type: "SRVD", name: "ZSD_<entity>", description: "<Entity> Service Definition", source: "<srvd_source>"},
{type: "CLAS", name: "ZBP_I_<entity>", description: "<Entity> Behavior Pool", source: "<class_source>"},
{type: "SRVB", name: "ZSB_<entity>_V4", description: "<Entity> Service Binding", serviceDefinition: "ZSD_<entity>", bindingType: "ODataV4-UI"}
], package="<package>", transport="<transport>")
オブジェクトは配列の順序どおりに作成およびアクティブ化されます。依存関係のあるものを先に配置してください(テーブルは CDS ビューより前、DCLS は DDLS の後、CDS ビューは BDEF より前、ビヘイビアプールはインターフェース BDEF より前)。バッチは最初の失敗時に停止し、成功したオブジェクトと失敗したオブジェクトを報告します。
すべてのアーティファクトで package と transport が共通の場合は、最上位に設定します。バッチ項目でいずれかの値を上書きする必要がある場合は、そのオブジェクトに package および/または transport を指定します。項目レベルの値が優先されます。
兄弟オブジェクト間の相互参照がある構成では activateAtEnd: true を渡してください(たとえば、親の composition [0..*] of ZR_CHILD が同じバッチ内の子を参照する、コンポジションでリンクされた DDLS)。ARC-1 はすべてのオブジェクトを非アクティブなドラフトとして書き込み、その後、最後に 1 回だけ activateBatch を実行します。SAP アクティベーターはグラフ全体を認識し、相互参照を一括で解決します。このフラグがない場合、親のインラインアクティブ化は "data source ZR_CHILD does not exist or is not active" で失敗します。
バッチ作成に失敗した場合は、以下の逐次方式(ステップ 4~13)に切り替えてください。
ステップ 4:データベーステーブルの作成(逐次方式の代替)
CDS DDL を使ってテーブルエンティティを作成します。
SAPWrite(action="create", type="TABL", name="<table_name>", package="<package>", transport="<transport>", source="<ddl_source>")
テーブルエンティティ DDL テンプレート
@EndUserText.label : '<Entity description>'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table <table_name> {
key client : abap.clnt not null;
key key_uuid : sysuuid_x16 not null;
<business_field_1> : <type>;
<business_field_2> : <type>;
// ... more business fields
created_by : syuname;
created_at : timestampl;
last_changed_by : syuname;
last_changed_at : timestampl;
local_last_changed_at : timestampl;
}
テーブルをアクティブ化します。
SAPActivate(type="TABL", name="<table_name>")
代替方法:テーブルエンティティの作成に失敗した場合(古いオンプレミスシステムなど)は、フィールド一覧と型を提示し、SE11 または ADT でテーブルを手動作成するようユーザーに案内します。
ステップ 5:インターフェース CDS ビューの作成
SAPWrite(action="create", type="DDLS", name="ZI_<entity>", package="<package>", transport="<transport>", source="<ddl_source>")
インターフェースビュー DDL テンプレート
@AccessControl.authorizationCheck: #MANDATORY
@EndUserText.label: '<Entity description>'
define root view entity ZI_<Entity>
as select from <table_name>
{
key key_uuid as KeyUuid,
<business_field_1> as <CamelCaseAlias1>,
<business_field_2> as <CamelCaseAlias2>,
// ... more business fields
@Semantics.amount.currencyCode: 'CurrencyCode'
total_price as TotalPrice,
currency_code as CurrencyCode,
@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
}
アクティブ化します。
SAPActivate(type="DDLS", name="ZI_<entity>")
ステップ 5a:インターフェースアクセス制御(DCLS)の作成
インターフェースビュー用に基本的な CDS アクセス制御ロールを作成します。
SAPWrite(action="create", type="DCLS", name="ZI_<entity>_DCL", package="<package>", transport="<transport>", source="<dcl_source>")
インターフェース DCL テンプレート
@EndUserText.label: '<Entity description> Access Control'
@MappingRole: true
define role ZI_<Entity>_DCL {
grant select on ZI_<Entity>
where inheriting conditions from super;
}
アクティブ化します。
SAPActivate(type="DCLS", name="ZI_<entity>_DCL")
ステップ 5b:ドラフトテーブルの作成(ドラフトが有効な場合)
ドラフトが有効な場合は、これを参照するビヘイビア定義を作成する前に、ドラフトテーブルエンティティを作成します。RAP フレームワークはこのテーブルへのドラフトデータのランタイム永続化を管理しますが、テーブル自体は明示的に作成する必要があります。
SAPWrite(action="create", type="TABL", name="<draft_table>", package="<package>", transport="<transport>", source="<ddl_source>")
ドラフトテーブルエンティティ DDL テンプレート
@EndUserText.label : '<Entity description> - Draft'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table <draft_table> {
key client : abap.clnt not null;
key key_uuid : sysuuid_x16 not null;
<business_field_1> : <type>;
<business_field_2> : <type>;
// ... same business fields as the main table
created_by : syuname;
created_at : timestampl;
last_changed_by : syuname;
last_changed_at : timestampl;
local_last_changed_at : timestampl;
}
ドラフトテーブルをアクティブ化します。
SAPActivate(type="TABL", name="<draft_table>")
注:BTP ABAP Environment でも、ドラフトテーブルは引き続き明示的に作成する必要があります。フレームワークが管理するのはランタイムでのドラフトデータの永続化であり、テーブルの存在ではありません。
ステップ 6:インターフェースビヘイビア定義の作成
SAPWrite(action="create", type="BDEF", name="ZI_<entity>", package="<package>", transport="<transport>", source="<bdef_source>")
ドラフトあり
managed implementation in class ZBP_I_<Entity> unique;
strict ( 2 );
with draft;
define behavior for ZI_<Entity> alias <Entity>
persistent table <table_name>
draft table <draft_table>
etag master LocalLastChangedAt
lock master total etag LastChangedAt
authorization master ( instance )
{
field ( readonly )
KeyUuid,
CreatedBy,
CreatedAt,
LastChangedBy,
LastChangedAt,
LocalLastChangedAt;
field ( numbering : managed )
KeyUuid;
create;
update;
delete;
draft action Resume;
draft action Edit;
draft action Activate optimized;
draft action Discard;
draft determine action Prepare;
}
ドラフトなし
managed implementation in class ZBP_I_<Entity> unique;
strict ( 2 );
define behavior for ZI_<Entity> alias <Entity>
persistent table <table_name>
etag master LocalLastChangedAt
lock master
authorization master ( instance )
{
field ( readonly )
KeyUuid,
CreatedBy,
CreatedAt,
LastChangedBy,
LastChangedAt,
LocalLastChangedAt;
field ( numbering : managed )
KeyUuid;
create;
update;
delete;
}
インターフェース BDEF を個別にアクティブ化しないでください。ビヘイビアプールクラス(ZBP_I_)を参照していますが、このクラスはまだ存在しないためです。クラスを作成した後、バッチアクティブ化のステップでアクティブ化します。
ステップ 7:プロジェクション CDS ビューの作成
SAPWrite(action="create", type="DDLS", name="ZC_<entity>", package="<package>", transport="<transport>", source="<ddl_source>")
プロジェクションビューのDDLテンプレート
@AccessControl.authorizationCheck: #MANDATORY
@EndUserText.label: '<Entity description> - Projection'
@Metadata.allowExtensions: true
@Search.searchable: true
define root view entity ZC_<Entity>
provider contract transactional_query
as projection on ZI_<Entity>
{
key KeyUuid,
@Search.defaultSearchElement: true
<BusinessField1>,
@Search.defaultSearchElement: true
<BusinessField2>,
// ... more business fields
TotalPrice,
CurrencyCode,
CreatedBy,
CreatedAt,
LastChangedBy,
LastChangedAt,
LocalLastChangedAt
}
最も重要なビジネスフィールド(通常は名前、ID、説明)に @Search.defaultSearchElement: true を指定します。
有効化します。
SAPActivate(type="DDLS", name="ZC_<entity>")
ステップ 8:プロジェクションの動作定義を作成する
SAPWrite(action="create", type="BDEF", name="ZC_<entity>", package="<package>", transport="<transport>", source="<bdef_source>")
ドラフトあり
projection;
strict ( 2 );
use draft;
define behavior for ZC_<Entity> alias <Entity>
{
use create;
use update;
use delete;
use action Resume;
use action Edit;
use action Activate;
use action Discard;
use action Prepare;
}
ドラフトなし
projection;
strict ( 2 );
define behavior for ZC_<Entity> alias <Entity>
{
use create;
use update;
use delete;
}
プロジェクションBDEFを個別に有効化しないでください。これはインターフェースBDEF(ZI_)を参照する use create、use update、use delete を使用しており、そのBDEFはまだ有効化されていないためです。すべてのアーティファクトを作成した後の一括有効化の手順で有効化されます。
ステップ 9:メタデータ拡張(DDLX)を作成する
SAPWrite(action="create", type="DDLX", name="ZC_<entity>", package="<package>", transport="<transport>", source="<ddlx_source>")
メタデータ拡張テンプレート
@Metadata.layer: #CUSTOMER
@UI: {
headerInfo: {
typeName: '<Entity Name>',
typeNamePlural: '<Entity Name Plural>',
title: { type: #STANDARD, value: '<MainBusinessField>' },
description: { type: #STANDARD, value: '<SecondaryField>' }
}
}
annotate view ZC_<Entity> with
{
@UI.facet: [
{
id: 'idIdentification',
type: #IDENTIFICATION_REFERENCE,
label: 'General Information',
position: 10
}
]
@UI.hidden: true
KeyUuid;
@UI: {
lineItem: [{ position: 10, importance: #HIGH }],
identification: [{ position: 10 }],
selectionField: [{ position: 10 }]
}
<BusinessField1>;
@UI: {
lineItem: [{ position: 20, importance: #HIGH }],
identification: [{ position: 20 }],
selectionField: [{ position: 20 }]
}
<BusinessField2>;
// ... more business fields with incrementing positions
@UI: {
lineItem: [{ position: 50, importance: #MEDIUM }],
identification: [{ position: 50 }]
}
TotalPrice;
@UI.hidden: true
CreatedBy;
@UI.hidden: true
CreatedAt;
@UI.hidden: true
LastChangedBy;
@UI.hidden: true
LastChangedAt;
@UI.hidden: true
LocalLastChangedAt;
}
位置番号は10ずつ増やします。最も関連性の高いビジネスフィールド(狭い画面に表示されるフィールド)には importance: #HIGH を、二次的なフィールドには #MEDIUM を指定します。ユーザーがフィルターに使うフィールドには @UI.selectionField を追加します。
有効化します。
SAPActivate(type="DDLX", name="ZC_<entity>")
ステップ 10:サービス定義を作成する
SAPWrite(action="create", type="SRVD", name="ZSD_<entity>", package="<package>", transport="<transport>", source="<srvd_source>")
サービス定義テンプレート
@EndUserText.label: '<Entity description> Service'
define service ZSD_<Entity>
provider contracts odata_v4_ui
{
expose ZC_<Entity> as <Entity>;
}
主な利用者がFiori Elementsではなく、API/統合のユースケースである場合は、プロバイダーコントラクトとバインディングタイプを同時に切り替えます。
define service ZSD_<Entity>
provider contracts odata_v4_webapi
{
expose ZC_<Entity> as <Entity>;
}
有効化します。
SAPActivate(type="SRVD", name="ZSD_<entity>")
ステップ 11:動作プールクラスを作成する
一括有効化の前に動作プールクラスを作成します。インターフェースBDEFは implementation in class ZBP_I_<Entity> を通じてこのクラスを参照するためです。
記述する前に、必要に応じてSAP PrettyPrinterを実行し、クラスソースをシステムのキーワードスタイルとインデントに合わせます。
SAPLint(action="format", source="<class_source>", name="ZBP_I_<entity>")
SAPWrite(action="create", type="CLAS", name="ZBP_I_<entity>", package="<package>", transport="<transport>", source="<class_source>")
動作プールクラスのテンプレート
CLASS zbp_i_<entity> DEFINITION
PUBLIC ABSTRACT FINAL
FOR BEHAVIOR OF zi_<entity>.
ENDCLASS.
CLASS zbp_i_<entity> IMPLEMENTATION.
ENDCLASS.
有効化します。
SAPActivate(type="CLAS", name="ZBP_I_<entity>")
ステップ 12:すべてのアーティファクトを一括有効化する
最初に、必要に応じて、妨げになる可能性のある未有効化オブジェクトが残っていないか確認します。
SAPRead(type="INACTIVE_OBJECTS")
注: /sap/bc/adt/activation/inactive エンドポイントが利用できないシステムでは、404が返される場合があります。その場合はこの確認を省略して、続行してください。
相互依存関係を解決するため、すべてのアーティファクトをまとめて有効化します。
SAPActivate(objects=[
{type:"TABL", name:"<table_name>"},
{type:"DDLS", name:"ZI_<entity>"},
{type:"DCLS", name:"ZI_<entity>_DCL"},
{type:"CLAS", name:"ZBP_I_<entity>"},
{type:"BDEF", name:"ZI_<entity>"},
{type:"DDLS", name:"ZC_<entity>"},
{type:"BDEF", name:"ZC_<entity>"},
{type:"DDLX", name:"ZC_<entity>"},
{type:"SRVD", name:"ZSD_<entity>"}
])
注: 有効化では、行番号とURIを含む詳細なエラー/警告メッセージが構造化レスポンスで返されます。エラーがあると有効化はブロックされます。警告があっても有効化はできますが、確認が必要です。
一括有効化に失敗した場合は、依存関係の順に個別に有効化します。
- テーブルエンティティ
- インターフェースCDSビュー
- インターフェースアクセス制御(DCLS)
- 動作プールクラス
- インターフェース動作定義
- プロジェクションCDSビュー
- プロジェクション動作定義
- メタデータ拡張
- サービス定義
METHODS ... FOR ... シグネチャが不足しているために動作プールの有効化に失敗した場合:
SAPWrite(action="scaffold_rap_handlers", type="CLAS", name="<bp_class>", bdefName="ZI_<entity>")を使用して、不足しているシグネチャを一覧表示します。- 必要に応じて
autoApply=trueを指定して再実行し、クラス宣言にシグネチャを挿入するとともに、空のメソッドスタブを追加します。 - それでもシグネチャが解決しない場合は、修正候補があれば
SAPDiagnose(action="quickfix", ...)とSAPDiagnose(action="apply_quickfix", ...)を使用します。 - それでも解決しない場合は、ADTエディターのクイックフィックス生成を使用し、その後
SAPWrite(action="edit_method", ...)でメソッド本体を修正します。
失敗したオブジェクトについては、構文チェックを実行して問題を特定します。
SAPRead(type="SYNTAX", objectType="<type>", name="<name>")
ステップ 13:サービスバインディングを作成して公開する
サービスバインディングを作成します。
SAPWrite(action="create", type="SRVB", name="ZSB_<entity>_V4", package="<package>", transport="<transport>",
serviceDefinition="ZSD_<entity>", bindingType="ODataV4-UI", description="<Entity> OData V4 Service")
サービスバインディングを有効化します。
SAPActivate(type="SRVB", name="ZSB_<entity>_V4")
サービスバインディングを公開します(ODataサービスが利用可能になります)。
SAPActivate(action="publish_srvb", name="ZSB_<entity>_V4")
公開ステータスとサービスURLを確認します。
SAPRead(type="SRVB", name="ZSB_<entity>_V4")
⚠️ 確認ポイント:SRVBの読み取り結果で、published: true、想定されるバインディングタイプ、サービスURLが表示されることを確認します。OData V4バインディングでは、公開/非公開の操作はバインディング全体に適用されます。
ステップ 14:サービス全体を検証する
主要なアーティファクトを読み戻し、最終チェックを実行します。
SAPRead(type="DDLS", name="ZI_<entity>")
SAPRead(type="DCLS", name="ZI_<entity>_DCL")
SAPRead(type="BDEF", name="ZI_<entity>")
SAPRead(type="DDLS", name="ZC_<entity>")
SAPRead(type="SYNTAX", objectType="CLAS", name="ZBP_I_<entity>")
チェックリスト形式で概要を示します。
RAP Service Generation Complete!
Created artifacts:
[x] Database table entity: <table_name>
[x] Interface CDS view: ZI_<Entity>
[x] Interface access control: ZI_<Entity>_DCL
[x] Interface behavior definition: ZI_<Entity>
[x] Projection CDS view: ZC_<Entity>
[x] Projection behavior definition: ZC_<Entity>
[x] Metadata extension: ZC_<Entity>
[x] Service definition: ZSD_<Entity>
[x] Behavior pool class: ZBP_I_<Entity>
[x] Service binding: ZSB_<Entity>_V4
[x] Service binding published
Next steps:
- Add validations and determinations (use generate-rap-logic skill)
- Add value helps for business fields
- Add custom actions if needed
- Generate unit tests (use generate-abap-unit-test skill)
- Register in FLP launchpad (use SAPManage flp_create_catalog, flp_create_tile, flp_create_group)
- Create proper DOMA/DTEL for reusable typing (use SAPWrite with type=DOMA/DTEL)
- Attach SKTD documentation to the service or BDEF (optional)
- Review later iterations with `SAPTransport(action="history", type=…, name=…)` for current lock/assignment status plus `SAPRead(type="VERSIONS", ...)` for actual revision history
エラー処理
よくある問題と解決方法
| エラー | 原因 | 解決方法 |
|---|---|---|
| DDLS/BDEF で 415 Unsupported Media Type | RAP/CDS エンドポイントが期待どおりに応答していない | システム情報を確認するには SAPManage(action="probe") を確認してください。ICF サービスが有効化されていることを確認してください。システムの対応状況を確認するため、ADT でオブジェクトの作成を試してください。 |
作成時に Resource X does already exist | 既存オブジェクトまたはスタブとの競合 | SAPWrite(action="update", ...) に切り替え、ソース全体を再送信してください。むやみに作成を再試行しないでください。 |
| 有効化エラー:依存関係が見つからない | オブジェクトが誤った順序で有効化されている | 依存関係の順序に従って逐次的に有効化してください(ステップ 12 の代替手順)。 |
| ドラフトテーブルが見つからない | ドラフトテーブルがまだ作成されていない | 先にドラフトテーブルエンティティを作成するか、BDEF から with draft を削除してください。 |
| フィールドマッピングが不完全 | BDEF のフィールド名が CDS エイリアスと一致しない | CDS フィールドエイリアスが BDEF のフィールド参照と完全に一致していることを確認してください。 |
| ETag フィールドが見つからない | LocalLastChangedAt が存在しないか、名前が異なる | 管理フィールドが CDS ビューに正しいエイリアスで存在することを確認してください。 |
| ビヘイビアプールが見つからない | クラス名が BDEF の implementation in class と一致しない | BDEF のクラス名が作成したクラス名と完全に一致していることを確認してください。 |
BDEF の作成/保存が汎用的な [?/011] で失敗する | RAP ハンドラー宣言では、ビヘイビアプールの完全クラス保存パスが不安定 | クラスを最小限に保ち、クイックフィックス(MCP または ADT)でシグネチャを生成してから、本文には edit_method を使用してください。 |
| Lint によって書き込みがブロックされる | 生成されたコードに Lint 警告がある | Lint の指摘内容を確認し、Lint ルールに適合するようコードパターンを調整してください。 |
| テーブルエンティティの作成がサポートされていない | 古いオンプレミスシステム | SE11 でテーブルを手動作成し、フィールド一覧を指定してください。 |
| トランスポートが必要 | トランスポートのない $TMP 以外のパッケージ | トランスポートを検索または作成するには SAPTransport(action="check") を使用してください — ステップ 1b を参照してください。 |
| 作成時にロックが競合する | オブジェクトが別のユーザー/トランスポートによってロックされている | 待つか、別の名前を使用してください。競合するトランスポートがないか SAPTransport(action="list") で確認してください。 |
| 通貨参照アノテーションがない | abap.curr フィールドに通貨セマンティクスのアノテーションがない | 各金額フィールドの上に @Semantics.amount.currencyCode を追加し、abap.cuky フィールドが存在することを確認してください。 |
"draft or side" was expected, not "etag" | 7.5x で無効なプロジェクション BDEF ヘッダー構文 | ヘッダーは projection; のみとしてください。 |
注意事項
BTP とオンプレミスの概要
- BTP:Z*/Y* 名前空間のみ、ABAP Cloud 構文が適用されます。ドラフトテーブルは明示的に作成する必要があります(フレームワークが実行時にドラフトデータを管理します)。V4 OData を推奨します。BDEF では
strict ( 2 )を使用します。テーブルエンティティの DDL 構文を使用します。リリース済み SAP API のみを使用します。 - オンプレミス:名前空間の柔軟性が高く、ビヘイビアプールではクラシック ABAP を使用できます(推奨されません)。明示的なドラフトテーブルの作成が必要な場合があります。V2 または V4 を使用します。
strictのレベルはリリースによって異なります。
このスキルで対応しないこと(v1)
- 複雑なコンポジション/子階層:複数エンティティの BO と 2 段階のロールアウトには
generate-rap-service-researchedを使用してください。 - カスタムアクション:ドラフトアクション以外の
action宣言には対応しません。後から generate-rap-logic スキルを使用してください。 - 導出/検証:ビジネスロジックには対応しません。後からこれらを追加するには generate-rap-logic スキルを使用してください。
- 値ヘルプ:
@Consumption.valueHelpDefinitionアノテーションには対応しません。手動で追加してください。 - フィーチャーコントロール/副作用:標準の CRUD を超える、バックエンド駆動の UI 動作には対応しません。UI に動的な有効化や再計算のヒントが必要な場合は、手動で追加してください。
- 非管理 BO/抽象 BO:UUID キーを使用する管理シナリオのみが対象です。
- DOMA/DTEL の作成:インライン型を使用します。本番サービスでは、後から
SAPWrite(type="DOMA"/"DTEL")を使用して適切なドメインとデータ要素を作成してください。 - FLP 登録:Fiori Launchpad への自動登録には対応しません。後から
SAPManageの FLP アクションを使用してください。
このスキルを使用する場合
- 新しい RAP アプリケーションをゼロから始める場合
- ユーザーがビジネスオブジェクトを自然言語で説明する場合
- Fiori Elements アプリをすばやくプロトタイプ作成する場合
- 既存の RAP サービスに追加する場合は使用しないでください(手動編集または generate-rap-logic を使用してください)
- 複数のエンティティを含む複雑なデータモデルには使用しないでください(v1 は単一のルートエンティティのみです)