CData SAP ドライバー詳細解説:SAP S/4HANA 向け SAP Gateway Service Builder を使って OData サービスを構築する
前回の記事では、RFC プロトコルを使用して SAP S/4 HANA に接続する方法を解説しました。SAP の特性上、RFC や OData サービスはすべての機能にデフォルトで用意されているわけではありません。統合を実装するために、必要に応じてインターフェースをカスタマイズおよび開発することが一般的です。
一方で、Salesforce や Dynamics 365 のようなプラットフォームでは、汎用的な API がデフォルトで実装されており、興味深い文化的な違いがあります。この記事では、SAP OData サービスをゼロから構築していきます。最後に、実装した OData サービスに CData ドライバーを使用して接続します。
注意:この記事では SAP S/4 HANA Private Cloud Edition を使用していますが、原則は Public Cloud Edition にも適用されます。
OData サービスの作成
この記事では、GetEntitySet を使用して BNKA(銀行マスタ)データの一覧を取得する OData サービスを構築します。

OData は、Create、Delete、GetEntity(単一レコード取得)、GetEntitySet(複数レコード取得)、Update などのインターフェースを通じて CRUD 操作をサポートしています。今回は、最小限のスコープで GetEntitySet を実装し、OData サービスとして公開します。
今後、他の実装も試してみるかもしれませんが、まずは OData がどのように実装できるかを理解することに焦点を当てます。
SAP 環境にログインする
それでは、SAP Logon を使用して設定済みの SAP 環境にアクセスしましょう。

ここでは、事前に準備された BPINST ユーザーアカウントを使用しています。お使いの環境に合わせて調整してください。

SAP Gateway Service Builder でプロジェクトを作成する
ログイン後、トランザクションコード「SEGW」を入力して SAP Gateway Service Builder 画面を開きます。ここで OData サービスを実装していきます。

まず、OData サービス実装用のプロジェクトを作成します。

わかりにくいのが「Project Type」かもしれません。Annotations とは、OData メタデータ仕様では表現できない SAP 固有のメタデータ機能を指します。カスタムアノテーションを使用する予定がないため、デフォルトの「Service with SAP Annotations」を選択して進めます。SAP 関連リソース:
SAP Service Builder プロジェクト作成ドキュメント
データモデルを追加する
プロジェクトを作成したら、OData サービスで使用するデータモデルを作成します。これにより、データ交換で使用する項目と構造を定義します。
既存の BNKA テーブルを使用するため、Import で利用可能な「DDIC Structure」から作成します。

名前を指定し、ABAP Structure として BNKA を選択します。

BNKA リストからすべての項目を選択します。

OData サービスには Key が必要なため、必要な項目を Key として指定します。これは OData インターフェースでの Key を定義するものであり、格納されたデータの一意性を保証するものではない点に注意してください。

これでデータモデルがインポートされます。

また、BNKA データモデルの Create、Delete、GetEntity(Read)、GetEntitySet(Query)、Update 操作のテンプレートも生成されます。ただし、これはインターフェースを作成しただけで、まだ実装はありません。
ランタイムオブジェクトを作成する
次に、インターフェース実装に関連する ABAP クラスとランタイムオブジェクトを生成します。プロジェクトを保存し、ランタイムオブジェクト生成ボタンをクリックします。

生成するクラス名を指定します。デフォルトの候補が表示されるので、そのまま進めます。


生成が完了すると、Runtime Artifacts が追加されます。これらは実装クラスと OData サービス登録用のクラスを定義しています。

Service Implementation では、各インターフェースにリンクされた Implementation Class Name と Method Name を確認できます。これらのクラスとメソッドに ABAP コードを記述して、インターフェースのデータ処理を実装します。

OData サービスとして登録する
インターフェースの内部実装はまだ完了していませんが、OData サービスとしてリクエストできるようにサービスを登録しましょう。「/IWFND/MAINT_SERVICE」を使用して OData サービスを登録および管理します。

「/IWFND/MAINT_SERVICE」に移動し、Add Service をクリックします。

System Alias を選択し、Get Services をクリックします。SAP Gateway Service Builder で Runtime Artifacts として登録されたサービスが表示されます。

サービスを選択し、Add Selected Services をクリックします。

デフォルトの登録情報のまま進めます。

これでサービスが登録され、OData API として呼び出せるようになります。左下の「SAP Gateway Client」を使用して確認してみましょう。

Postman のような API クライアントが表示されます。Execute ボタンをクリックします。これで、生成されたサービスから BNKA EntitySet を呼び出せることが確認できます。

「/CDATA_SAMPLE_SRV/BNKASet」を呼び出すことはできますが、GetEntitySet の内部実装が完了していないため、まだ実際のデータは取得できません。次に、GetEntitySet の内部ロジックを実装します。
GetEntitySet の詳細設定
SAP Gateway Service Builder に戻り、内部ロジックを実装します。BNKA の Service Implementation にある「GetEntitySet (Query)」を右クリックし、「Go to ABAP Workbench」をクリックします。

この画面から内部実装を進めます。各 OData サービス実装には、リンクされたクラスとメソッドがあります。
GetEntitySet の場合、対象は「Methods」→「Inherited Methods」の下にある「BNKASET_GET_ENTITYSET」です。「BNKASET_GET_ENTITYSET」を右クリックし、「Redefine」を選択します。

「BNKASET_GET_ENTITYSET」の内部実装コード画面が開き、ABAP の実装を進めることができます。

ここでは、GetEntitySet が呼び出されたときに入力パラメータを処理し、BNKA データモデルに従ったレスポンスを「et_entityset」に渡すロジックを実装します。
簡略化のため、BNKA テーブルから上位 10 行を選択して「et_entityset」に渡すロジックを実装しました。「Insert」ボタンをクリックし、以下の行を追加します:
SELECT * UP TO 10 ROWS FROM bnka INTO CORRESPONDING FIELDS OF TABLE et_entityset.

「Activate」を実行して実装結果を反映します。

SAP Gateway Client に戻り、もう一度 GetEntitySet を呼び出してみましょう。実装が成功していれば、BNKA データが取得できているはずです。

ブラウザからも確認できます。

ページネーションやフィルター条件は実装されていませんが、これで実装の進め方がわかりました。
CData SAP NetWeaver Gateway ドライバーで OData サービスにアクセスする
最後に、作成した OData サービスに CData SAP NetWeaver Gateway ドライバーを使用して接続してみましょう。ここでは ODBC ドライバーを使用しますが、JDBC、ADO.NET、CData Sync でも同様です。
CData SAP NetWeaver Gateway ドライバー
CData SAP NetWeaver Gateway ドライバーの ODBC DSN 設定画面を起動し、必要な情報を入力します。SAP S/4 HANA Private Cloud トライアル環境では、ポート 50000 で公開されているため、URL とユーザー情報を指定します。Namespace を sap に、Service を「CDATA_SAMPLE_SRV」に設定します。

「Test connection」をクリックし、「The connection test was successful」というメッセージが表示されれば、接続成功です。データモデルタブに移動すると、BNKASet オブジェクトが表示されます。プレビュータブでは、10 件のレコードが返されていることが確認でき、GetEntitySet が正常に呼び出されていることがわかります。

クエリタブでは、10 件のレコードが返されていることが確認でき、GetEntitySet が正常に呼び出されていることがわかります。

IP アドレスについて
外部から接続する場合、使用するパブリック IP アドレスは「SAP S/4HANA 2023 FPS00 & SAP HANA DB 2.0」マシンのもので、ポート番号は 50000 です。

SAP Gateway Client は、hosts ファイルで指定された DNS を使用して接続します。

プライベート IP アドレスを確認できます。

OData サービスに複数のリソースを設定する
OData サービスには、1 つのサービスに複数のリソースや EntitySet を含めることができます。たとえば、ADKO データモデルを追加することで、CData ドライバーから複数のテーブルを呼び出すことができます。

