SAP S/4HANA Cloud Public EditionのカスタムCDS ビューをOData公開する

SAP S/4HANA Cloud Public EditionのカスタムCDS ビューをOData公開する

SAP S/4HANA Cloud Public Edition は、SAP が用意した標準 API(API_PRODUCT_SRV など)を通信アレンジメントで有効化するだけで外部から利用できます。しかし「標準 API にない項目が欲しい」「複数のエンティティを結合した形で取り出したい」「集計済みの形で渡したい」となると、自分で CDS ビューを作り、OData サービスとして公開する必要があります。Public Edition は制限付きの開発環境です。SAP GUI も RFC も使えず、DDIC ベースの CDS ビューも作れません。データを外部に出す手段は OData サービスの公開に一本化されています。

本記事では、ABAP Development Tools (ADT) でカスタム CDS ビューを作成し、OData V4 サービスとして外部公開するまでの手順を解説します。実機(Public Edition 開発テナント、クライアント 080)で全手順を検証済みです。記事の最後に、公開したサービスへ CData SAP Gateway Driver から SQL で接続する例を添えます。

前提条件

  •  SAP S/4HANA Cloud Public Edition の開発テナント(developer extensibility が有効な 3 システムランドスケープ)

  • SAP 側のロール

    • SAP_BR_DEVELOPER 相当(ADT での開発)

    • Communication Management のビジネスカタログ(通信ユーザー・通信アレンジメントの作成)

  • Eclipse + ABAP Development Tools

    • Eclipse 2025-09 (4.37) に ADT を導入した環境で検証

    • 更新サイト: https://tools.hana.ondemand.com/2025-09

ADT のインストールは Eclipse の GUI からでも、p2 director によるヘッドレス実行でも可能です。CI などで自動化したい場合は後者が便利です。

オンプレ ABAP との違い

オンプレ ABAP (NetWeaver / S/4HANA)

S/4HANA Cloud Public Edition

言語バージョン

Standard ABAP

ABAP for Cloud Development(制限付き)

CDS の種類

define view / define view entity 両方

define view entity のみ

参照できる対象

標準 DDIC テーブル全般

released API(C1 契約)のみ

SAP GUI

利用可

なし

RFC

外部に開放可能

外部に開放されない

外部公開の方法

DDIC ビュー経由の RFC、または OData

OData のみ

オンプレでは DDIC ベースの CDS ビューが DB レベルの SQL ビューを生成するため、RFC 経由でそれを直接読むという方法がありました。Public Edition ではその方法は使用できず、公開したいものを明示的に OData サービスとして定義するのが唯一の方法です。

全体像

作業は ADT 側 5 ステップ、Fiori ランチパッド側 3 ステップに分かれます。

ADT(Eclipse)

  1. パッケージ作成 ZTEST_CDS

  2. CDS view entity ZCE_TEST_CURRENCY

  3. サービス定義 ZSD_TEST_CURRENCY

  4. サービスバインディング ZSB_TEST_CURRENCY (OData V4 - Web API)

  5. 通信シナリオ Z_CS_TEST_CURRENCY (Type = Customer)

Fiori ランチパッド

  1. 通信ユーザー CDATA_TEST

  2. 通信システム CDATA_CLIENT

  3. 通信アレンジメント → Service URL が発行される

役割を整理すると次のようになります。

オブジェクト

役割

CDS view entity

何のデータを、どの形で見せるかを定義する

サービス定義(Service Definitions)

どのエンティティを公開対象にするかを宣言する

サービスバインディング(Service Bindings)

どのプロトコル(OData V4 Web API など)で公開するかを決める

通信シナリオ (Communication Scenarios)

公開するサービスと、許可する認証方式をまとめる

通信アレンジメント (Communication Arrangements)

シナリオに実際のユーザーを割り当て、エンドポイントを開通させる

手順

1. パッケージを作成する

ABAP クラウドプロジェクトで接続したら、まず開発オブジェクトを置くパッケージを用意します。

  1. ZLOCAL を右クリック → 新規 → ABAP パッケージ

  2. Name: ZTEST_CDS

  3. Superpackage: ZLOCAL

  4. Package Type: 開発 (Development)

2. CDS view entity を作成する

ZTEST_CDS を右クリック → 新規 → その他の ABAP リポジトリ・オブジェクト → Core Data Services → データ定義。

ここから 完了 までにウィザードが 3 画面続きます。オブジェクト名を入れたらすぐコードを書き始められるわけではないので、それぞれ何を聞かれているのか押さえておきましょう。

2-1. 名前とパッケージを指定する(1 画面目)

項目

値

Project

接続中の ABAP クラウドプロジェクト

Package

ZTEST_CDS

Name

ZCE_TEST_CURRENCY

Description

Test view entity - currencies

Name に入力した値が、そのまま define view entity の後ろに来る CDS エンティティ名になります。後でコードを書き換えるときに両者が一致していないとアクティベート時にエラーになるので、名前を変えるならソースも揃えてください。命名は顧客ネームスペース(Z または Y 始まり)で 30 文字以内です。RAP の慣例に寄せるなら ZI_(インターフェースビュー)、ZR_(ベース/ルート)、ZC_(コンシューマ)といった接頭辞がよく使われます。

2-2. 輸送依頼を選ぶ(2 画面目)

Public Edition では $TMP(ローカルオブジェクト)が選べないため、必ず輸送依頼を聞かれます。

選択肢は 3 つありますが、Create a new request を選ぶのが無難です。

選択肢

使いどころ

Choose from requests in which I am involved

既存の依頼に相乗りする

Create a new request

検証用オブジェクトを独立した依頼にまとめる(推奨)

Enter a request number

依頼番号が分かっている場合

Description には CDS test - ZCE_TEST_CURRENCY のように内容が分かる名前を付けます。CTS Project は空欄で構いません。他の作業用の依頼に相乗りさせると、後から削除やリリース管理をするときに切り分けが面倒になります。また、この依頼はリリースしないでください。 3 システムランドスケープでは、依頼をリリースするとテスト系・本番系へ流れ始めます。開発システム内で検証するだけなら未リリースのままで問題ありません。これ以降に作るサービス定義・サービスバインディング・通信シナリオも、同じ依頼を再利用すると管理が楽になります。2 回目以降は Choose from requests in which I am involved の一覧に出てきます。

2-3. テンプレートを選ぶ(3 画面目)

Use the selected template にチェックが入った状態で、ツリーからテンプレートを選びます。

テンプレート

用途

defineViewEntity

通常の読み取り専用ビュー。本記事はこちら

defineRootViewEntity

RAP のビジネスオブジェクトのルートになるビュー

defineViewEntityWithToParentAssociation

親への関連を持つ子ビュー

defineView

非推奨の DDIC ベース CDS ビュー


2-4. 生成されたスケルトンを書き換える

完了 を押すとエディタが開き、テンプレートから生成されたスケルトンが入っています。${data_source_name} のようなプレースホルダーが緑色でハイライトされた状態で、Tab キーで次のプレースホルダーに移動しながら埋めていけます。

ただし今回のように参照元と項目をまとめて書き換える場合は、プレースホルダーを 1 つずつ埋めるより、全選択して丸ごと置き換える方が早いです。

Ctrl+A で全選択し、次のコードで置き換えてください。本記事では released API の I_Currency(通貨マスタ)を参照します。

@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Test view entity - currencies'
@Metadata.ignorePropagatedAnnotations: true
define view entity ZCE_TEST_CURRENCY
  as select from I_Currency
{
  key Currency,
      CurrencyISOCode,
      AlternativeCurrencyKey,
      Decimals,
      IsPrimaryCurrencyForISOCrcy
}

Ctrl+S で保存しCtrl+F3 でアクティベートF8 でデータプレビューが開きます。

3. サービス定義を作成する

公開したいエンティティを宣言しますZCE_TEST_CURRENCY を右クリック → New Service Definition。CDS から作ると expose 句に参照が自動で入ります。

  • Name: ZSD_TEST_CURRENCY

生成されたスケルトンは、おおむね次の形になっています。

@EndUserText.label: 'Test service definition - currencies'
define service ZSD_TEST_CURRENCY {
  expose ZCE_TEST_CURRENCY;
}

このままでもアクティベートできますが、エンティティセット名が ZCE_TEST_CURRENCY のまま外部に露出します。as でエイリアスを付けておくと、利用側の SQL やリクエスト URL が短くなります。

@EndUserText.label: 'Test service definition - currencies'
define service ZSD_TEST_CURRENCY {
  expose ZCE_TEST_CURRENCY as Currency;
}

Ctrl+S で保存し、Ctrl+F3 でアクティベート。タイトルバーが active になれば完了です。

複数のエンティティをまとめて公開する場合は expose を並べます。

define service ZSD_TEST_CURRENCY {
  expose ZCE_TEST_CURRENCY as Currency;
  expose ZCE_TEST_COUNTRY  as Country;
}

4. サービスバインディングを作成する

どのプロトコルで公開するかを決めます。サービス定義を右クリック → New Service Binding。

項目

値

Name

ZSB_TEST_CURRENCY

Binding Type

OData V4 - Web API

Service Definition

ZSD_TEST_CURRENCY

今回バインディングタイプとして外部システムからの連携向けとしてOData V4 - Web APIを選択しています。V2互換が必要な場合はOData V2 - Web APIを選択してください。アクティベート(Ctrl+F3)後、エディタの Local Service Endpoint が Unpublished なら 公開 ボタンを押します。公開されるとエンティティセット一覧とサービス URL が表示されます。

5. 通信シナリオを作成する

続いて通信シナリオの作成を ADT で行います。

ファイル → 新規 → その他の ABAP リポジトリ・オブジェクト → Communication で絞り込み → Communication Scenario

  • Name: Z_CS_TEST_CURRENCY

  • パッケージ: ZTEST_CDS

エディタで次を設定します。

項目

値

Communication Scenario Type

Customer

Allowed Instances

One instance per scenario & communication system

Supported Authentication Methods

基本(Basic)にチェック

Inbound Services

ZSB_TEST_CURRENCY を追加

Communication Scenario Type は必ず Customer にしてくださいProvider は SaaS プロバイダーがマルチテナント向けにサービスを提供するための種別で、自テナントの顧客シナリオとしては扱われません。やっかいなのはエラーが一切出ない点です。ADT 上は Published と表示され、Inbound Service も登録済みで、見た目には完全に正常なのに、Fiori のどのアプリにも現れません。

認証方式は、連携先に合わせて選びます。基本(ユーザー ID とパスワード)がもっとも手軽ですが、本番運用では X.509(クライアント証明書)が推奨されます。両方にチェックを入れておき、通信アレンジメント側でどちらを使うか決めることもできます。

設定後Ctrl+S → Ctrl+F3 → エディタ右上の Publish Locally を押します。


6. 通信ユーザーを作成する

ここからはブラウザでの作業です。Fiori ランチパッドの検索ボックスに Communication と入力すると関連アプリが見つかります。Communication Users アプリで新規作成します(例: CDATA_TEST)。パスワードは後から再表示できないため、この場で控えてください。通信ユーザーは対話ログオンができない専用のユーザー種別で、API アクセスのためだけに存在します。人間が使うビジネスユーザーを流用しないでください。

7. 通信システムを作成する

Communication Systems アプリで新規作成します(例: CDATA_CLIENT)。

  • Host Name は必須項目ですが、インバウンド専用の用途では名前解決には使われません(ここではcdata.localとしています。)

  • Users for Inbound Communication に 6 で作成したユーザーを追加

  • Users for Outbound Communication は空のままで可

通信システムは「どの外部システムと通信するか」を表すオブジェクトです。連携先ごとに作っておくと、後から「どのシステムがどのサービスを使っているか」を追いやすくなります。

8. 通信アレンジメントを作成する

Communication Arrangements アプリで新規作成し、シナリオ一覧から Z_CS_TEST_CURRENCY を選択、通信システムに CDATA_CLIENT を指定して保存します。

保存すると Inbound Services セクションに Service URL が表示されます。

URL の構造は次のようになっています。

/sap/opu/odata4/sap/<サービスバインディング名>/srvd_a2x/sap/<サービス定義名>/0001/

srvd_a2x というセグメントが入る点に注意してください。推測で組み立てず、通信アレンジメントに表示された URL をそのままコピーするのが確実です。末尾の 0001 はサービスバージョンです。ホスト名が my______-api.s4hana.cloud.sap と -api 付きになっている点にも注目してください。Fiori ランチパッドのホスト-api なし)とは別で、外部連携用のエンドポイントは -api 側です。

動作確認

curl で公開状態を切り分ける

アプリケーションを書く前にcurl で HTTP ステータスを見ておくと問題の切り分けが一気に楽になります。

curl -s -o /dev/null -w "%{http_code}\n" "https://my______-api.s4hana.cloud.sap/sap/opu/odata4/sap/zsb_test_currency/srvd_a2x/sap/zsd_test_currency/0001/"

ステータス

意味

対応方法

403 Unified Connectivity: Forbidden

通信アレンジメントが未作成、または対象サービスが含まれていない

手順 8 を見直す

404

URL が誤っている

通信アレンジメントの表示をコピーし直す

401 WWW-Authenticate: Basic

正常。サービスが公開され、Basic 認証待ちの状態

認証情報を付けて再実行

401 が返れば、公開作業は完了しています。残りは認証情報とクライアント側の設定の問題に絞り込めます。

メタデータとデータを取得する

認証情報を付けると実際のレスポンスが確認できます。

BASE="https://my______-api.s4hana.cloud.sap/sap/opu/odata4/sap/zsb_test_currency/srvd_a2x/sap/zsd_test_currency/0001"
curl -s -u "[your_comm_user]:[your_password]" "$BASE/\$metadata"
curl -s -u "[your_comm_user]:[your_password]" "$BASE/Currency?\$top=5"

$metadata が返す EDMX に、サービス定義で宣言したエンティティセットと、CDS で選んだ項目が並んでいれば成功です。

ここまでで OData 公開は完了です。あとは OData に対応したツールやライブラリであれば何からでも利用できます。

CData SAP Gateway Driver から接続する

公開したサービスを SQL で扱いたい場合、CData JDBC Driver for SAP Gateway が使えます。OData の URL 構造やページングを意識せず、通常の SQL でクエリできるようになります。

接続文字列

jdbc:sapgateway:URL=[your_service_url];User=[your_comm_user];Password=[your_password];DataFormat=JSON;

プロパティ

値

備考

URL

通信アレンジメントに表示された Service URL

User

通信ユーザー名

手順6 で作成

Password

通信ユーザーのパスワード

DataFormat

JSON

OData V4 では必須

DataFormat の既定値は XML です。OData V2 は Atom/XML を返せるため既定のままで動きますが、OData V4 は JSON しか返せないため、指定を忘れると HTTP 406 で失敗します。

コード例

import java.sql.*;

public class SapGatewayTest {
  public static void main(String[] args) throws Exception {
    String url = "https://my______-api.s4hana.cloud.sap"
               + "/sap/opu/odata4/sap/zsb_test_currency"
               + "/srvd_a2x/sap/zsd_test_currency/0001/";

    String cs = "jdbc:sapgateway:"
              + "URL=" + url + ";"
              + "User=[your_comm_user];"
              + "Password=[your_password];"
              + "DataFormat=JSON;";

    Class.forName("cdata.jdbc.sapgateway.SAPGatewayDriver");

    try (Connection conn = DriverManager.getConnection(cs);
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery("SELECT TOP 5 * FROM Currency")) {

      ResultSetMetaData md = rs.getMetaData();
      while (rs.next()) {
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= md.getColumnCount(); i++) {
          sb.append(md.getColumnName(i)).append("=")
            .append(rs.getString(i)).append("  ");
        }
        System.out.println(sb);
      }
    }
  }
}

実行時は JAR をクラスパスに指定するだけです。

java -cp ".;C:\Program Files\CData\CData JDBC Driver for SAP Gateway 2026J\lib\cdata.jdbc.sapgateway.jar" SapGatewayTest

実行結果です。

Currency=AED  CurrencyISOCode=AED  AlternativeCurrencyKey=784  Decimals=2
Currency=AFN  CurrencyISOCode=AFN  AlternativeCurrencyKey=971  Decimals=2
Currency=ALL  CurrencyISOCode=ALL  AlternativeCurrencyKey=008  Decimals=2
Currency=AMD  CurrencyISOCode=AMD  AlternativeCurrencyKey=051  Decimals=2
Currency=ANG  CurrencyISOCode=ANG  AlternativeCurrencyKey=532  Decimals=2

JDBC 以外に ODBC、ADO.NET、Python Connector も同じ接続プロパティで利用できます。BI ツールや ETL ツールから使う場合も、ドライバーを挟むことで OData を意識せずテーブルとして扱えます。

まとめ

Public Edition でカスタムデータを外部公開する流れは、ADT 側 5 ステップと Fiori 側 3 ステップに整理できます。手数は多いものの、一度通してしまえば 2回目以降は同じ型の繰り返しです。公開さえできてしまえば、あとは標準的な OData サービスです。SQL で扱いたい場合は CData SAP Gateway Driver のようなドライバーを挟むと、OData の作法を意識せずテーブルとして利用できます。