この記事を読むメリット
- OData が何か、Fiori アプリとどう関係するかが分かる
- OData の URL の読み方(サービス・エンティティセット・キー・クエリオプション)が分かる
- ブラウザと T-CODE:/IWFND/GW_CLIENT で OData のデータを見る方法が分かる
SAP Fiori のアプリは、画面の裏で OData(オーデータ) という決まりを使って SAP のデータを読み書きしています。
この記事では、OData を初めて聞く方に向けて、仕組みを図で説明したうえで、「会社コード」の OData サービスを実際に開いて中身を見ます。
最後に、OData サービスの作り方の 2 通りを紹介します。
博士!Fiori の話でよく「OData」って聞くんですけど、何のことか分からなくて…。
うむ、OData は URL を送るとデータが返ってくる決まりじゃ。会社コードのサービスを実際に開いて、中身を見ながら説明していくぞい!
この記事のポイント
OData とは
実務での要件の例
経理の担当から「Fiori のアプリに出ている会社コードのデータが、どこから、どんな形で届いているのかを知りたい」と聞かれた場面を考えます。
この記事では、この依頼を例に画面を追って操作します。例で使うデータは次のとおりです。
| データ | この例の値 | 使うところ |
|---|
| OData サービス | API_COMPANYCODE_SRV(会社コードの一覧を返すサービス) | T-CODE:/IWFND/MAINT_SERVICE で探し、URL に入れます。一覧に出ないときは、システムの管理者に確かめます |
| エンティティセット | A_CompanyCode | URL のサービス名の後ろに付けて、会社コードのデータを受け取ります |
| 会社コード | 1010・1710 | キーや $filter の値に入れて、データを絞り込みます |
| SAP のサーバ | <ホスト>:<ポート> | URL の先頭です。OData サービスを公開している SAP Gateway のサーバに読み替えます。SAP Gateway は、業務データを持つシステム(バックエンド)と同じシステムに置く構成のほかに、別のサーバ(ハブ)に置く構成もあります |
番号は、この記事で使った検証環境のものです。ご自分の環境では、それぞれの番号に読み替えてください。
前提条件として、V2 のサービスを実行するための権限オブジェクト S_SERVICE の権限が必要です。
この要件は、次のように分けて進めます。
| 要件の部分 | どうするか |
|---|
| Fiori アプリの裏のデータの流れを知る | この章で、OData と SAP Gateway の仕組みを確かめます |
| 会社コードの OData サービスを探す | T-CODE:/IWFND/MAINT_SERVICE で API_COMPANYCODE_SRV を探します |
| 返ってくるデータを見る | ブラウザか T-CODE:/IWFND/GW_CLIENT で URL を送り、XML や JSON で中身を見ます |
| OData サービスを作る | この記事では扱いません。作り方の 2 通りを、最後の章で紹介します |
ひとことで言うと
OData(Open Data Protocol)は、URL を送るとデータが返ってくる、Web のデータのやり取りの決まり です。SAP のヘルプは、OData を REST に基づく、データの照会と更新のための Web のプロトコルと説明しています。土台は HTTP です。
OData は OASIS の標準で、もとは Microsoft が開発しました。SAP だけの仕組みではなく、業界の標準の決まりです。
HTTP を使うので、OData はブラウザでも試せます。返ってくるデータの形は、XML か JSON を選べます。
Fiori アプリとの関係
SAP の中で OData を受け付けるのが SAP Gateway です。SAP Gateway は、SAP の機能を OData サービス として公開し、いろいろな端末やアプリから SAP のデータを使えるようにします。
Fiori アプリは、OData でバックエンドのデータを表示し、更新します。OData サービスは、Fiori アプリを動かすのに欠かせない部品です。
使う側(Fiori アプリ・ブラウザ・SAP Gateway クライアント)が URL を送ると、SAP Gateway の OData サービスが SAP のデータを読み、JSON や XML で返します。
似た名前が出てくるので、ここで整理しておきます。
| 名前 | 中身 |
|---|
| SAP Gateway | SAP の機能を OData サービスとして公開する仕組みです。 |
| SAP Gateway Foundation(SAP_GWFND) | SAP Gateway の中心になるソフトウェアコンポーネントです。 |
| SAP Gateway クライアント | OData サービスを試すためのツールです(T-CODE:/IWFND/GW_CLIENT)。 |
V2 と V4
OData には版があり、SAP Gateway Foundation は V2 と V4 に対応しています。この記事で扱うのは V2 のサービスです。
| V2 | V4 |
|---|
| URL の形 | /sap/opu/odata/<namespace(名称領域)>/<サービス名>/ | /sap/opu/odata4/<サービスグループ ID>/<リポジトリ ID>/<サービス ID>/<版>(グループ ID とサービス ID には namespace(名称領域) が入ります) |
| URL の例 | /sap/opu/odata/sap/API_COMPANYCODE_SRV/ | /sap/opu/odata4/sap/zst006_ui_companycode_o4/srvd/sap/zst006_ui_companycode/0001/ |
| サービスの管理 | T-CODE:/IWFND/MAINT_SERVICE | T-CODE:/IWFND/V4_ADMIN(サービスグループの単位で公開) |
覚えておきたい用語
| 用語 | 意味 |
|---|
| サービス | 外部のアプリから呼び出せるように公開された OData の窓口です。例: API_COMPANYCODE_SRV |
| エンティティセット | 同じ種類のデータの集まりです。例: 会社コードの集まり A_CompanyCode |
| エンティティ | エンティティセットの中の 1 件です。例: 会社コード 1010 |
| プロパティ | 1 件が持つ項目です。例: 会社コード、会社名、通貨 |
| キー | 1 件を一意に決める項目です。例: 会社コード |
| エンティティタイプ | 1 件の形(どんなプロパティとキーを持つか)の定義です。 |
| サービスドキュメント | サービスのいちばん上の説明で、エンティティセットの一覧が書かれています。 |
| $metadata | サービスのデータの形を丸ごと書いた XML です。エンティティタイプ・プロパティ・キーが分かります。 |
| ナビゲーションプロパティ | ある 1 件から、関連する別のデータへのリンクです(例: 製品から、その製品の仕入先へ)。 |
Excel の表にたとえると、エンティティセットが「表」、エンティティが「行」、プロパティが「列」にあたると考えると分かりやすいでしょう。
会社コードのサービスを例にした図です。図の表では、1 行が 1 件(エンティティ)、列が項目(プロパティ)にあたります。
URL の読み方
OData では、どのデータがほしいかを URL で指定します。たとえば、会社コード 1010 の会社コードと会社名を JSON で受け取る URL は次のとおりです。
https://<ホスト>:<ポート>/sap/opu/odata/sap/API_COMPANYCODE_SRV/A_CompanyCode('1010')?$select=CompanyCode,CompanyCodeName&$format=json
画面の見方
- SAP のサーバ: お使いのシステムのホストとポートです。
- OData V2 の入口と namespace(名称領域): V2 のサービスは
/sap/opu/odata/ の後ろに namespace(名称領域) が入ります。
- サービス名: どの OData サービスを呼ぶかです。
- エンティティセット: サービスの中の、どのデータの集まりかです。ここで止めると一覧が返ります。
- キー: 括弧でキーの値を付けると、その 1 件だけが返ります。文字のキーは
'(シングルクォート)で囲みます。
- クエリオプション:
? の後ろに、絞り込み・項目・形式などを付けます。2 つ以上は & でつなぎます。
この例では、namespace(名称領域)は sap です。
namespace(名称領域)は、サービスの持ち主を表す部分です。SAP が作ったサービスと、Z・Y で始まる自社のサービスは sap になります。自社で名称領域(/ABC/ など)を予約している会社のサービスは、sap の代わりにその名称領域(例 /sap/opu/odata/abc/…)が入ります。
OData で決められているクエリオプション(システムクエリオプション)は、名前が $ で始まります。よく使うものは次のとおりです。
| クエリオプション | 意味 | 例 |
|---|
$format | 返す形式。json か xml | $format=json |
$top | 先頭から何件返すか | $top=3 |
$skip | 先頭から何件飛ばすか($top と組み合わせてページ送り) | $skip=2&$top=3 |
$filter | 条件で絞り込む。eq(等しい)・ne(等しくない)・gt(より大きい)・lt(より小さい)、and・or | $filter=CompanyCode eq '1010' |
$select | 返す項目を選ぶ | $select=CompanyCode,Currency |
$orderby | 並べ替え。asc(昇順)・desc(降順) | $orderby=CompanyCode desc |
$inlinecount | 一覧と一緒に総件数を返す(V2) | $inlinecount=allpages |
$expand | 関連するデータ(ナビゲーションプロパティの先)も一緒に返す | $expand=<ナビゲーションプロパティ> |
件数だけがほしいときは、V2 ではエンティティセットの後ろに /$count を付けます(例: A_CompanyCode/$count)。V2 の $count は、? の後ろに付けるクエリオプションではありません。
SEGW で作ったサービスのうち、データを返す処理を自分で ABAP で書いたものでは、$filter・$top・$skip・$orderby・$inlinecount は開発側の実装が必要です。そのため、サービスによっては使えないクエリオプションがあります。CDS ビューをもとにしたサービスでは、フレームワーク(SADL)がこれらのクエリオプションを処理します。
HTTP メソッドと操作
OData では、URL に加えて HTTP メソッド で「何をするか」を伝えます。
| HTTP メソッド | 操作 |
|---|
| GET | データを取得する(1 件・一覧) |
| POST | データを新しく作成する |
| PUT | データを更新する(1 件の内容をまるごと送る) |
| PATCH・MERGE | データの一部の項目だけを送って更新する(送らなかった項目はそのまま) |
| DELETE | データを削除する |
この記事で使うのは、データを取得する GET だけです。POST・PUT・PATCH・MERGE・DELETE は SAP のデータを変えます。中身を見たいだけのときは、GET だけを使うとよいでしょう。
サービスを探す
V2 の OData サービスは、T-CODE:/IWFND/MAINT_SERVICE で一覧を見られます。ここで、サービスの名前と、呼び出せる状態かどうかを確かめます。
1. T-CODE:/IWFND/MAINT_SERVICE を開く
コマンドフィールドに /n/IWFND/MAINT_SERVICE と入力し、Enter キーを押します。画面「サービスの有効化および更新」が開きます。
画面の見方
- フィルタ: 一覧に表示するサービスを、名前などで絞り込みます。
上の「サービスカタログ」が登録済みのサービスの一覧で、下が一覧で選んだサービスの詳細(ICF ノードとシステムエイリアス)です。
2. サービス名で絞り込む
「フィルタ」を押すと、ダイアログ「サービスカタログのフィルタ」が開きます。外部サービス名に API_COMPANYCODE_SRV と入力し、「続行」を押します。
画面の見方
- 外部サービス名: 絞り込みに使うサービスの名前です。
- 続行: 入力した条件で一覧を絞り込みます。
3. サービスの情報を確かめる
画面の見方
- 技術サービス名: サービスカタログに登録されたサービスの名前です。
- 外部サービス名: サービスのもう 1 つの名前です。
- ICF ノードのステータス: サービスを呼び出す入口(ICF ノード)の状態を表すアイコンです。
- ブラウザ呼出: サービスをブラウザで呼び出します。
- SAP Gateway Client: サービスを SAP Gateway クライアント(T-CODE:/IWFND/GW_CLIENT)で試します。
この例では、一覧に 1 行だけ表示されました。技術サービス名は ZAPI_COMPANYCODE_SRV、外部サービス名は API_COMPANYCODE_SRV です。URL に入れるのは外部サービス名の API_COMPANYCODE_SRV です。ICF ノード ODATA のステータスは緑のアイコンで、説明は「サービスが有効です」です。
SAP のヘルプによると、V2 のサービスは、サービスごとに ICF ノードがあり、使う前にそれぞれ有効にする必要があります。
ブラウザで OData を開く
ブラウザのアドレス欄に URL を入れて、OData の中身を見ます。
ログオンするクライアントを指定するときは、URL に sap-client=<クライアント> を付けます。? の後ろにほかの指定があるときは &sap-client=<クライアント> です(例: …/API_COMPANYCODE_SRV/?sap-client=100)。sap-client は $ で始まらない指定です。この例では、存在しないクライアント 999 を指定すると、「ログオンに失敗しました」(ステータスコード 401)になりました。
1. サービスドキュメントを開く
サービス名の後ろで止めた URL を開きます。
https://<ホスト>:<ポート>/sap/opu/odata/sap/API_COMPANYCODE_SRV/
画面の見方
- エンティティセット: このサービスで使えるエンティティセットです。
href の値がエンティティセットの名前です。
この例では、エンティティセットは A_CompanyCode の 1 つだけです。
2. $metadata でデータの形を見る
サービス名の後ろに $metadata を付けます。
https://<ホスト>:<ポート>/sap/opu/odata/sap/API_COMPANYCODE_SRV/$metadata
画面の見方
- エンティティタイプ: 1 件の形の定義です。
Key の中がキー、Property の 1 行 1 行がプロパティです。
- エンティティセット: エンティティセットの名前と、どのエンティティタイプのデータかです。
この例では、エンティティタイプ A_CompanyCodeType のキーは CompanyCode です。プロパティは CompanyCodeName・CityName・Currency など 21 項目あり、sap:label に「会社名」「市区町村」「通貨」のような日本語の項目名が入っています。$metadata は XML でしか取れません。
3. エンティティセットのデータを見る
エンティティセット A_CompanyCode の後ろにクエリオプションを付けます。ここでは、先頭の 2 件($top=2)、4 つの項目($select)を、JSON($format=json)で受け取ります。
https://<ホスト>:<ポート>/sap/opu/odata/sap/API_COMPANYCODE_SRV/A_CompanyCode?$top=2&$select=CompanyCode,CompanyCodeName,CityName,Currency&$format=json
画面の見方
- エンティティ(1 件):
results の中の { } 1 組が 1 件です。
- プロパティと値:
"プロパティ名": "値" の形で並びます。
この例では、会社コード 0001 と 0002 の 2 件が返り、$select で選んだ 4 項目だけが入っています。__metadata の uri には、その 1 件を指す URL(A_CompanyCode('0001') など)が入っています。画面は、ブラウザの上の「プリティ プリント」にチェックを付けて、改行と字下げを入れて表示しています。
4. 条件で絞り込む
$filter で条件を付けます。ここでは、会社コードが 1010 または 1710 のものだけを受け取ります。文字の値は ' で囲みます。
https://<ホスト>:<ポート>/sap/opu/odata/sap/API_COMPANYCODE_SRV/A_CompanyCode?$filter=CompanyCode eq '1010' or CompanyCode eq '1710'&$select=CompanyCode,CompanyCodeName,CityName,Currency&$format=json
画面の見方
- 1 件目のプロパティと値: 条件に合った 1 件目です。
- 2 件目のプロパティと値: 条件に合った 2 件目です。
この例では、会社コード 1010 と 1710 の 2 件だけが返りました。
5. 件数を数える
エンティティセットの後ろに /$count を付けると、件数だけが返ります。
https://<ホスト>:<ポート>/sap/opu/odata/sap/API_COMPANYCODE_SRV/A_CompanyCode/$count
この例では、絞り込みなしの全件の数として、数字だけの 435 が返りました。
SAP Gateway クライアントで試す
SAP Gateway クライアント(T-CODE:/IWFND/GW_CLIENT)は、どの OData サービスでもテストできるツールです。HTTP メソッドを選び、URL を入れて実行します。「サービスを探す」の手順 3 で ⑤「SAP Gateway Client」を押すと、要求 URI にそのサービスの URL が入った状態で開きます。
1. 要求 URI を入れて実行する
要求 URI を書き換えて、「実行」を押します。
画面の見方
- HTTP メソッド: 何をするかを選びます。データを見るときは GET です。
- 要求 URI: 呼び出す URL を、
/sap/opu/odata/ から入れます(ホストとポートは要りません)。
- 実行: 要求を送ります。
この例では、会社コード 1010 の 1 件を JSON で受け取るよう、要求 URI に /sap/opu/odata/sap/API_COMPANYCODE_SRV/A_CompanyCode('1010')?$format=json を入れています。画面の HTTP メソッドには、表にない HEAD もあります。
2. 応答を確かめる
右側の「HTTP 応答」に結果が表示されます。
画面の見方
- ステータス: 応答のステータスコード(
~status_code)と、その理由(~status_reason)です。
- データエクスプローラ: 応答の中身を、項目名と値の表で表示します。
この例では、ステータスコードは 200、理由は OK です。応答の本文の欄は、文字化けして読めないことがあります。本文は、データエクスプローラで見るとよいでしょう。
3. データエクスプローラで中身を見る
「データエクスプローラ」を押すと、応答の中身が表で表示されます。
画面の見方
- パラメータ名: 応答に入っている項目の名前です。
- パラメータ値: その項目の値です。
この例では、会社コード 1010 の会社名(Company Code 1010)・市区町村(Walldorf)・通貨(EUR)などが並んでいます。もとの表示に戻すときは「元の本体」を押します。
OData サービスの作り方
OData サービスの作り方は、大きく 2 通りあります。
| 作り方 | 流れ |
|---|
| SEGW(SAP Gateway Service Builder) | T-CODE:SEGW でプロジェクトを作り、データモデルを定義します。データを返す処理は、生成されたクラス(データプロバイダの拡張クラス、名前の末尾が _DPC_EXT)に ABAP で書きます。できたサービスは T-CODE:/IWFND/MAINT_SERVICE で登録し、有効にします。 |
| RAP(ABAP RESTful Application Programming Model) | ABAP Development Tools(ADT)で、CDS ビューでデータモデルを作り、サービス定義で公開する CDS ビューを決めます。サービスバインディングで V2 / V4 などの種類を選んで有効化し、公開(Publish)します。オンプレミスでは、この公開はそのシステムだけのもので、公開した状態は移送できません。 |
この記事で使った会社コードのサービスは、SAP が SEGW で作ったものです。システムには、SAP が作ったプロジェクト API_COMPANYCODE と、クラス CL_API_COMPANYCODE_DPC_EXT などがあります。
SAP は、使えるならビジネスサービス(RAP のサービス定義とサービスバインディング)がいちばん将来性があるとしています。また、OData V4 の開発は、SEGW ではなく ADT を使うやり方を強く推奨しています。
RAP で OData サービスを作る手順は、後編の記事で、画面を使って解説しています。
あわせて読みたい
【SAP Fiori】RAPでODataサービスを作る方法
この記事を読むメリット RAP で OData サービスを作る順番(CDS ビュー → サービス定義 → サービスバインディング → 公開)が分かる Eclipse(ADT)の画面で、CDS ビュー・…
うまくいかないとき
「サービスが見つかりません」と返る
存在しないサービス名を呼んだときや、公開を取り消したサービスを呼んだときは、エラーのコード /IWFND/MED/170 が返ります。
画面の見方
- エラーのコードとメッセージ: エラーのコードと、サービスの名称領域・名称・バージョンが書かれています。
- 調べ方の案内: 調べるためのトランザクションが書かれています。
この例では、存在しないサービス名 ZNOT_EXIST_SRV を呼んだので、「名称領域 ”、名称 ‘ZNOT_EXIST_SRV’、バージョン ‘0001’ のサービスが見つかりません」と返りました。② には、T-CODE:/IWFND/ERROR_LOG で上のタイムスタンプの記録を探すよう書かれています。T-CODE:/IWFND/ERROR_LOG は、実行時に起きたエラーの時刻や場所を調べるためのログです。
このエラーが返ったときは、まず外部サービス名の綴りを確かめるとよいでしょう。
400 エラーが返る
キーや $filter の文字の値を ' で囲まないと、ステータスコード 400 のエラーが返ります。
| 呼び方 | 返ったメッセージ |
|---|
A_CompanyCode(1010) | Invalid key predicate type for ‘CompanyCode’. Expected type is ‘Edm.String’ |
A_CompanyCode?$filter=CompanyCode eq 1010 | Invalid parametertype used at function ‘eq’ (Position: 13) |
CompanyCode の型は、$metadata では Edm.String(文字)です。文字の値は A_CompanyCode('1010')・CompanyCode eq '1010' のように ' で囲みます。
まとめ
- OData は、URL を送るとデータが返ってくる Web の決まりです。Fiori アプリは OData で SAP のデータを表示・更新します。
- URL は「サービス名 / エンティティセット (キー) ? クエリオプション」の順に読みます。$metadata でデータの形が分かります。
- T-CODE:/IWFND/MAINT_SERVICE でサービスを探し、ブラウザか T-CODE:/IWFND/GW_CLIENT の GET で中身を見られます。
あわせて読みたい
【SAP Fiori】RAPでODataサービスを作る方法
この記事を読むメリット RAP で OData サービスを作る順番(CDS ビュー → サービス定義 → サービスバインディング → 公開)が分かる Eclipse(ADT)の画面で、CDS ビュー・…
あわせて読みたい
【SAP Fiori】CDSビューとは?初心者向けに作成方法までわかりやすく解説
この記事を読むメリット CDSビューとは何か、基本的な仕組みを理解できます。 SAP FioriでCDSビューが利用される理由を理解できます。 CDSビューの基本的な作成手順を学…
URL の後ろに $filter や $select を付けるだけで、ほしいデータを選べるんですね!
うむ。$metadata を開けば、項目・キー・型も分かるのじゃ。