odata について
odataは、ODataサービスを構築または利用するABAP開発者向けのガイドです。RAPと従来型SEGWの実装、外部サービスの利用、Fioriアノテーション、トラブルシューティングを扱います。
主な機能
- 01RAP ODataサービスのガイダンス
- 02従来型SEGW V2の実装手順
- 03外部OData利用パターン
- 04Fioriアノテーション例
- 05トラブルシューティング案内
活用シーン
- 01RAPビジネスオブジェクトのOData公開
- 02従来型SEGW V2サービスの保守
- 03ABAPからの外部ODataサービス利用
- 04ODataエラーの診断
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ likweitan/ abap-skills --skill odataインストール後、Claude Code で/odataを入力して読み込まれたか確認します。
同梱ファイルreferences/odata-annotation-examples.md
詳細
OData サービスの開発
ABAP で OData サービスを作成および利用するためのガイドです。RAP ベース(V4/V2)と SEGW ベース(V2)の両方のアプローチを対象とします。
ワークフロー
-
ユーザーの目的を判断します:
- RAP BO を OData サービスとして公開する(推奨アプローチ)
- クラシックな SEGW ベースの OData V2 サービスを作成する
- ABAP から外部 OData サービスを利用する
- Fiori UI 用の OData アノテーションを追加する
- OData エラーのトラブルシューティングを行う
-
アプローチを特定します:
- RAP ベースのサービス(ABAP Cloud で推奨)
- SEGW ベースのサービス(クラシック。Standard ABAP のみ)
- OData の利用(クライアントプロキシ)
-
SAP のベストプラクティスに従って実装をガイドします
RAP ベースの OData サービス(推奨)
アーキテクチャの流れ
CDS View Entity → Behavior Definition → Service Definition → Service Binding
↓
OData V4/V2 Endpoint
サービス定義
CDS エンティティとその振る舞いを、名前付きサービスとして公開します:
@EndUserText.label: 'Travel Service'
define service ZUI_TRAVEL_O4 {
expose ZC_Travel as Travel;
expose ZC_Booking as Booking;
expose I_Currency as Currency;
expose I_Country as Country;
}
主なルール
- ルートビューではなく、プロジェクション CDS ビュー(慣例として C_ 接頭辞)を公開します
- UI に必要な値ヘルプ CDS ビュー(I_* ビュー)を含めます
- エイリアス名が OData エンティティセット名になります
- 1 つのサービス定義を複数のプロトコルにバインドできます
サービスバインディング
サービス定義を特定の OData プロトコルにバインドし、URL を提供します:
| バインディングの種類 | プロトコル | 用途 |
|---|---|---|
OData V4 - UI | V4 | SAP Fiori Elements アプリ |
OData V2 - UI | V2 | レガシー Fiori アプリ、旧式のフロントエンド |
OData V4 - Web API | V4 | API の利用(A2X シナリオ) |
OData V2 - Web API | V2 | API の利用(レガシー) |
InA - UI | InA | 分析シナリオ |
サービスバインディングの作成
- ADT で New → Other ABAP Repository Object → Business Services → Service Binding を選択します
- サービス定義を選択します
- バインディングの種類(例:OData V4 - UI)を選択します
- 有効化します
- Publish をクリックしてサービスを登録します
- Preview をクリックして Fiori Elements のプレビューを開きます
OData V4 と V2 の比較
| 機能 | OData V4 | OData V2 |
|---|---|---|
| プロトコル | デフォルトは JSON | デフォルトは XML(Atom)、JSON も選択可能 |
| バッチ | JSON を使用する $batch | multipart を使用する $batch |
| ディープオペレーション | ディープ作成/更新をサポート | 制限あり |
| アクション/関数 | バインドあり/なし | 関数インポート |
| フィルタリング | lambda を使用する $filter | 基本的な $filter |
| ドラフト | 完全にサポート | 拡張機能を介してサポート |
| 集計 | $apply 変換 | 標準ではサポートされない |
| 推奨 | 新規開発で推奨 | 既存のもののみを維持 |
SEGW ベースの OData V2 サービス(クラシック)
Standard ABAP のみで利用できます(ABAP Cloud では利用できません)。
アーキテクチャ
SEGW Project → Data Model (Entity Types, Sets, Associations)
→ Service Implementation (MPC/DPC classes)
→ Register & Activate in /IWFND/MAINT_SERVICE
手順
SEGWトランザクションでプロジェクトを作成します- データモデルを定義します:エンティティタイプ、プロパティ、ナビゲーションプロパティ
- ランタイムアーティファクトを生成します(MPC/DPC クラス)
- DPC 拡張メソッドを実装します:
GET_ENTITYSET、GET_ENTITY、CREATE_ENTITYなど /IWFND/MAINT_SERVICEでサービスを登録します/IWFND/GW_CLIENTまたはブラウザーでテストします
DPC メソッド実装の例
METHOD travelset_get_entityset.
SELECT * FROM ztravel_tab
INTO TABLE @DATA(lt_travel)
UP TO 100 ROWS.
et_entityset = CORRESPONDING #( lt_travel ).
ENDMETHOD.
外部 OData サービスの利用
ABAP Cloud の場合(HTTP Client と Communication Arrangements を使用)
"1. Get HTTP client via communication arrangement
DATA(lo_dest) = cl_http_destination_provider=>create_by_comm_arrangement(
comm_scenario = 'Z_MY_OUTBOUND_SCENARIO'
service_id = 'Z_MY_HTTP_SERVICE' ).
DATA(lo_client) = cl_web_http_client_manager=>create_by_http_destination( lo_dest ).
"2. Build request
DATA(lo_request) = lo_client->get_http_request( ).
lo_request->set_uri_path( '/sap/opu/odata4/sap/api_business_partner/srvd_a2x/sap/api_business_partner/0001/A_BusinessPartner?$top=10' ).
"3. Execute and parse response
DATA(lo_response) = lo_client->execute( if_web_http_client=>get ).
DATA(lv_json) = lo_response->get_text( ).
lo_client->close( ).
OData Client Proxy の使用(V2/V4)
"Create OData client proxy for V4
DATA(lo_proxy) = /iwbep/cl_cp_client_proxy_fact=>create_v4_remote_proxy(
iv_service_definition_name = 'Z_MY_ODATA_CDEF'
io_http_client = lo_client
iv_relative_service_root = '/sap/opu/odata4/sap/api_service/0001/' ).
"Build and execute read request
DATA(lo_request) = lo_proxy->create_resource_for_entity_set( 'ENTITYSETNAME' )->create_request_for_read( ).
lo_request->set_top( 10 ).
DATA(lo_response) = lo_request->execute( ).
"Get business data
DATA lt_data TYPE STANDARD TABLE OF z_entity_type.
lo_response->get_business_data( IMPORTING et_business_data = lt_data ).
Fiori 用 OData アノテーション
OData/Fiori の動作を制御する主な CDS アノテーション:
@UI.headerInfo: {
typeName: 'Travel',
typeNamePlural: 'Travels',
title: { type: #STANDARD, value: 'TravelID' },
description: { type: #STANDARD, value: 'Description' }
}
@UI.lineItem: [{ position: 10 }]
@UI.selectionField: [{ position: 10 }]
@UI.identification: [{ position: 10 }]
TravelID;
@UI.lineItem: [{ position: 20, importance: #HIGH }]
@UI.identification: [{ position: 20 }]
@Consumption.valueHelpDefinition: [{ entity: { name: 'I_Currency', element: 'Currency' } }]
CurrencyCode;
トラブルシューティング
| エラー/問題 | 解決策 |
|---|---|
/IWBEP/CX_MGW_BUSI_EXCEPTION | DPC の実装を確認し、入力データを検証します |
/IWBEP/CX_MGW_TECH_EXCEPTION | データモデルの整合性を確認し、成果物を再生成します |
| 403 Forbidden | ICF ノードの有効化と認可を確認します |
| 404 Not Found | サービスが登録され、有効化されていることを確認します |
$metadata returns empty | サービスバインディングを公開し、有効化を確認します |
| Draft not working | ドラフトテーブルが存在し、BDEF に with draft があることを確認します |
| Deep create fails | CDS と BDEF のコンポジションを確認します |
CX_WEB_HTTP_CLIENT_ERROR | 通信アレンジメントと SSL 証明書を確認します |
出力形式
OData に関するトピックを支援する場合は、次の形式で回答します。
## OData Service Guidance
### Approach
- Type: [RAP-based / SEGW-based / Consumption]
- Protocol: [OData V4 / OData V2]
### Implementation
[Step-by-step with code examples]
### Testing
[How to test the service]
参考資料
- SAP OData V4 のドキュメント:https://help.sap.com/docs/abap-cloud/abap-rap/odata-service
- RAP サービスバインディング:https://help.sap.com/docs/abap-cloud/abap-rap/service-binding
- OData クライアントプロキシ:https://help.sap.com/docs/abap-cloud/abap-rap/odata-client-proxy
関連スキル
- rap:OData サービスとして公開する RAP ビジネスオブジェクトの構築に使用します
- cds-view-entities:OData サービスを支えるデータモデリングに使用します
- authorization-iam:IAM アプリを使用した OData サービスの保護に使用します
- btp-abap-environment:OData 消費のための通信アレンジメントの設定に使用します
コメント
Markdown 対応