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 で接続する例を添えます。
前提条件
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)
パッケージ作成 ZTEST_CDS
CDS view entity ZCE_TEST_CURRENCY
サービス定義 ZSD_TEST_CURRENCY
サービスバインディング ZSB_TEST_CURRENCY (OData V4 - Web API)
通信シナリオ Z_CS_TEST_CURRENCY (Type = Customer)
Fiori ランチパッド
通信ユーザー CDATA_TEST
通信システム CDATA_CLIENT
通信アレンジメント → Service URL が発行される
役割を整理すると次のようになります。
オブジェクト | 役割 |
CDS view entity | 何のデータを、どの形で見せるかを定義する |
サービス定義(Service Definitions) | どのエンティティを公開対象にするかを宣言する |
サービスバインディング(Service Bindings) | どのプロトコル(OData V4 Web API など)で公開するかを決める |
通信シナリオ (Communication Scenarios) | 公開するサービスと、許可する認証方式をまとめる |
通信アレンジメント (Communication Arrangements) | シナリオに実際のユーザーを割り当て、エンドポイントを開通させる |
手順
1. パッケージを作成する
ABAP クラウドプロジェクトで接続したら、まず開発オブジェクトを置くパッケージを用意します。
ZLOCAL を右クリック → 新規 → ABAP パッケージ
Name: ZTEST_CDS
Superpackage: ZLOCAL
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 句に参照が自動で入ります。
生成されたスケルトンは、おおむね次の形になっています。
@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)。


通信システムは「どの外部システムと通信するか」を表すオブジェクトです。連携先ごとに作っておくと、後から「どのシステムがどのサービスを使っているか」を追いやすくなります。
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 の作法を意識せずテーブルとして利用できます。