今日の学習内容

今日は 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 TableZTBOOK(カスタムテーブル)
CDS Viewdefine root view entity が必須!
Behavior DefinitionCRUD 操作の定義・実装クラスの自動生成
Service Definitionexpose で Entity を公開
Service BindingOData V4 の URL を生成
/n/iwfnd/v4_adminLocal 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 開発へのキャリアチェンジを目指しています。