SAP BTP 学習日記 Day7 —— S/4HANA 練習環境で ABAP RAP カスタム OData V4 API を作成してみた
今日の学習内容
今日は SAP の練習システム(S/4HANA オンプレミス版)を使って、ABAP RAP(RESTful Application Programming Model)でカスタム OData V4 API をゼロから作成しました。Eclipse + ADT の環境構築から始まり、テーブル・CDS View・Behavior Definition・Service Binding の作成まで、全手順を記録します。
① Eclipse + ADT のセットアップ
Eclipse のインストール
ADT(ABAP Development Tools)を使うには Eclipse が必要です。「Eclipse IDE for Java Developers」をインストールします。
https://www.eclipse.org/downloads/
→「Eclipse IDE for Java Developers」を選択してインストールADT プラグインのインストール
Eclipse 起動後:
Help → Install New Software
→ URL: https://tools.hana.ondemand.com/latest
→「ABAP Development Tools」にチェック
→ Next → Finish → 再起動練習システムへの接続
File → New → Other → ABAP Project
→ アプリケーションサーバ・インスタンス番号・クライアント・ユーザー名・パスワードを入力
→ 接続完了② パッケージの作成
Local Objects ($TMP) を右クリック
→ New → ABAP Package
→ Name: $ZBTW_PRACTICE
→ Software Component: LOCAL⚠️ ハマりポイント①:LOCAL パッケージのパッケージ名は
$またはTESTで始める必要があります。
解決方法:$ZBTW_PRACTICEのように$を先頭に付ける
③ データベーステーブルの作成
$ZBTW_PRACTICE → New → Other ABAP Repository Object
→ Database Table → Name: ZTBOOK
@EndUserText.label : 'Book Table for BTP Practice'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table ztbook {
key client : abap.clnt not null;
key book_id : abap.numc(8) not null;
title : abap.char(200);
author : abap.char(100);
stock : abap.int4;
price : abap.dec(10,2);
}Ctrl+S → F8 で有効化します。
④ CDS View の作成
→ Data Definition → Name: ZI_BOOK
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Book Interface View'
define root view entity ZI_BOOK
as select from ztbook
{
key book_id as BookID,
title as Title,
author as Author,
stock as Stock,
price as Price
}⚠️ ハマりポイント②(最重要):Behavior Definition を作成する際に「ZI_BOOK is not a root entity」エラーが出ました。
原因:define view entityでは Root Entity として認識されません。
解決方法:define root view entityと書く必要があります。
⑤ Behavior Definition の作成
→ Behavior Definition → Name: ZI_BOOK
→ Root Entity: ZI_BOOK
→ Implementation Type: Managed
managed implementation in class zbp_i_book unique;
define behavior for ZI_BOOK alias Book
persistent table ztbook
lock master
authorization master ( instance )
{
create;
update;
delete;
mapping for ztbook
{
BookID = book_id;
Title = title;
Author = author;
Stock = stock;
Price = price;
}
}⚠️ ハマりポイント③:
strict ( 2 );はバージョン 757 以上が必要でエラーになりました。
解決方法:strict()を完全に削除する。
⚠️ ハマりポイント④:
field ( numbering : managed, readonly ) BookID;で型エラーが発生。
原因:BookID がabap.numc(8)型で RAP の自動採番と型不一致。
解決方法:該当行を削除する。
⚠️ ハマりポイント⑤:Behavior Definition 有効化後に「Class ZBP_I_BOOK does not exist」エラー。
解決方法:Behavior Definition エディタでzbp_i_bookにカーソルを置きCtrl+1→ クラスを自動生成する。
⑥ Service Definition の作成
→ Service Definition → Name: ZSD_BOOK
@EndUserText.label: 'Book Service Definition'
define service ZSD_BOOK {
expose ZI_BOOK as Book;
}⑦ Service Binding の作成と公開
→ Service Binding → Name: ZSB_BOOK
→ Binding Type: OData V4 - UI
→ Service Definition: ZSD_BOOK⚠️ ハマりポイント⑥:Service Binding の「Publish」ボタンでエラーが発生。
原因:カスタマイズクライアント(100)では Local Publish が制限されている。
解決方法:SAP GUI でトランザクション/n/iwfnd/v4_adminを使って手動でサービスを登録する。
/n/iwfnd/v4_admin での登録手順
SAP GUI → /n/iwfnd/v4_admin
→「サービスグループ公開」ボタン
→ System Alias: LOCAL
→「サービスグループ取得」
→「ZSB_BOOK」にチェック
→ 上の「サービスグループ公開」ボタン
→ 登録完了!⑧ Bruno で API をテスト
接続先 URL の確認
| 項目 | 値 |
|---|---|
| ホスト名 | SAP GUI のログオン設定から確認 |
| HTTPS ポート | 443xx(インスタンス番号 60 → 44360) |
| API パス | /sap/opu/odata4/sap/zsb_book/srvd/sap/zsd_book/0001/ |
GET(一覧取得)
GET https://[ホスト]:44360/sap/opu/odata4/sap/zsb_book/srvd/sap/zsd_book/0001/Book
Auth: Basic Auth(SAPユーザー名・パスワード)
→ レスポンス:
{
"@odata.context": "$metadata#Book",
"value": []
}CSRF トークンの取得(POST 前に必須)
GET https://[ホスト]:44360/sap/opu/odata4/sap/zsb_book/srvd/sap/zsd_book/0001/
Headers:
x-csrf-token: fetch
→ レスポンスヘッダーから x-csrf-token の値をコピーPOST(データ登録)
POST https://[ホスト]:44360/sap/opu/odata4/sap/zsb_book/srvd/sap/zsd_book/0001/Book
Auth: Basic Auth
Headers:
Content-Type: application/json
x-csrf-token: [取得したトークン]
Body:
{
"BookID": "00000001",
"Title": "Learning SAP BTP",
"Author": "John Smith",
"Stock": 10,
"Price": 4800.00
}⚠️ ハマりポイント⑦:
"Price": "4800.00"と文字列で送るとエラー。
解決方法:"Price": 4800.00と数値で送る。
⑨ ABAP RAP の開発手順まとめ
| ステップ | 作成物 | ポイント |
|---|---|---|
| ① | Database Table | ZTBOOK(カスタムテーブル) |
| ② | CDS View | define root view entity が必須! |
| ③ | Behavior Definition | CRUD 操作の定義・実装クラスの自動生成 |
| ④ | Service Definition | expose で Entity を公開 |
| ⑤ | Service Binding | OData V4 の URL を生成 |
| ⑥ | /n/iwfnd/v4_admin | Local Publish できない場合はここで登録 |
⑩ トラブルシューティングまとめ
| エラー | 原因 | 解決方法 |
|---|---|---|
| Names of LOCAL packages must start with '$' | パッケージ名のルール違反 | $ を先頭に付ける |
| ZI_BOOK is not a root entity | define view entity では不可 |
define root view entity に変更 |
| Unexpected character "1" (strict エラー) | SAP_BASIS 756 では strict() 未対応 | strict(); を削除 |
| ABP_BEHV_PID 型エラー | numbering:managed と numc(8) の型不一致 | field(numbering) 行を削除 |
| Class ZBP_I_BOOK does not exist | 実装クラスが未作成 | Ctrl+1 → クラスを自動生成 |
| Local Publish of ZSB_BOOK failed | クライアント 100 では Local Publish 制限 | /n/iwfnd/v4_admin で手動登録 |
| CSRF トークンが不足 | POST 時は CSRF トークン必須 | GET で x-csrf-token: fetch してトークン取得 |
| Price has invalid value '4800.00' | Price を文字列で送っていた | クォーテーションを外して数値で送る |
この記事は「SAP BTP 学習」シリーズの第7回です。6ヶ月間の独学で SAP BTP 開発へのキャリアチェンジを目指しています。