
はじめに
本記事では、ABAP RESTful Application Programming Model(RAP)の概要とRAPのGenerate機能を使用したAPI作成手順について紹介します。
以前登壇したTechEd Japan 2025-2026でも少し紹介させていただきましたが、RAPの開発はGenerate機能を使用することで、CRUD操作に対応したAPIを簡単に作成することが可能です。
【この記事はこんな方におすすめです】
・BTP環境におけるCAP開発の経験はあるが、ABAPは未経験の方
・SAP GUIのSAP Gateway Service Builder(SEGW)での開発経験はあるが、RAPは未経験の方
・最新のSAP開発環境における効率的なAPI作成手順を知りたい技術者
筆者は少しだけSEGWでのODataAPI作成経験があります。
ABAP RESTful Application Programming Model (RAP)とは
ABAP RESTful Application Programming Model (RAP)とは、SAP HANAに最適化されたODataサービスを効率的に開発するためのアーキテクチャの定義です。
ODataAPIの作成やFiori ElementsのUI作成に利用することができます。
SEGWを利用したODataサービスの開発には、SAP GUIを利用していました。
一方、RAPはIDEとしてEclipseと、そこにインストールするABAP Development Tools for Eclipse(ADT)を使用して開発を進めます。
ビジネスオブジェクトの特徴
RAPではSAP HANAをデータベースとした開発を行いますが、CDS Viewなどを利用してデータ定義や処理が実装されている部分を「ビジネスオブジェクト」と呼びます。
ビジネスオブジェクトには、以下のような2つのタイプが存在します。今回の記事でManagedをベースとした開発をご紹介します。
| ビジネスオブジェクト | 概要 | ユースケース |
|---|---|---|
| Managed | ・データベースに対する標準のCRUD操作が自動的に準備されているタイプ ・開発者は手動でCRUD操作を実装する必要がない | ・新規でテーブルを作成する場合 ・SAP標準の実装で進めたい場合 |
| Unmanaged | ・データベースに対するCRUD操作を開発者によって手動で実装する必要があるタイプ | ・既存のロジックを流用したい場合 ・複雑なロジックの実装が必要な場合 |
基本的にはManagedを選択することで簡単に実装が可能です。しかし、「内部で複雑な処理が必要」という場合には、Unmanagedを選択することでABAPのコードによってロジックを自分の手で書いていくことも可能です。
利用可能な環境
- SAP BTP ABAP environment
- SAP S/4HANA Cloud Public Edition
- SAP S/4HANA Cloud Private Edition ※
- SAP S/4HANA ※
※2021以降(1909や2020では機能に制限があります)
Generate機能について
RAPの開発では「Generate機能(自動生成ウィザード)」が準備されています。
開発者はアドオンテーブルのデータ定義を準備するだけで、このGenerate機能が必要なオブジェクトを自動生成してくれます。
従来のSEGWでもデータ定義を選択することでオブジェクトの自動生成をしてくれましたが、各メソッドの処理は手動でコーディングする必要がありました。しかし、RAPのGenerate機能では先ほど紹介したManagedシナリオによる実装ベースまで生成してくれます。そのため標準的なCRUD処理であれば、手動で処理を実装する必要すらありません…!
開発環境構築
RAPの開発には以下の準備が必要です。
- Eclipse/ABAP Development Toolのインストール
- 対象のABAP環境に接続

Eclipse/ABAP Development Toolsのインストール
下記の公式チュートリアルを参考に、EclipseとABAP Development Tools(ADT)のインストールを進めてください。
EclipseおよびADTのインストール手順(SAP公式チュートリアル)

対象のABAP環境に接続
ABAP environmentの起動
今回は、SAP BTPのTrial環境に接続してRAPの開発を進めていきます。

SAP BTPのService Marketから「ABAP environment」を選択し「Create」を実行します。

任意のインスタンスの名前を入力して次に進みます

JSONパラメータの「email」部分に、ご自身のメールアドレスを入力してインスタンスを作成します。

作成したインスタンスからサービスキーを作成します。

サービスキーが生成されると、Credentials(認証情報)に詳細が表示されます。この中にある「endpoint」内の「abap」に記載されたURLをコピーしておいてください。

EclipseからABAP environmentに接続
Eclipseを起動し、「ファイル」>「新規」>「その他」を選択し、「ABAP Cloud Project」を選択します。


「ABAP Service Instance URL」に、先ほどサービスキー作成でコピーしたURLを入力します。ここでS/4HANA Cloudなどその他のURLを入力すれば、対象のシステムに接続することが可能です。

ログイン方法を選択してログインします。左側のボタンをクリックするとブラウザが起動し、ABAP環境にログインすることが可能です。

ログインができると次の画面から「完了」をクリックします。接続できると「プロジェクト・エクスプローラー」に画像のように表示されます。


Generate機能を使用した実装例
ここからは実際にRAPのGenerate機能を使用していきます。
パッケージの作成
接続したプロジェクトの「Favorite Package」には「ZLOCAL」というパッケージが表示されますので、右クリックで「新規」>「ABAP Package」を選択します。名前と説明を入力して、新規パッケージを作成します。
「Add for favorite packages」にチェックを入れて、「Favorite Package」に追加しておくと便利です。


アドオンテーブル作成
作成したパッケージを右クリックし、「新規」>「その他ABAP Repository Object」を選択します。「Dictionary」から「データベース・テーブル」を選択してテーブル名と説明を入力して先に進めます。



ここでは簡単な製品情報を扱うアドオンテーブルを作成してみます。
テーブル定義の作成後は忘れずに有効化を行います。画面上部の「アクティブにする」ボタンをクリックするか、またはショートカットキー(Ctrl + F3)で有効化が可能です。
@EndUserText.label : 'Custom Table 01'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table ztable_custom_01 {
key client : abap.clnt not null;
key product_id : sysuuid_x16 not null;
product_name : abap.char(100);
created_by : abp_creation_user;
created_at : abp_creation_tstmpl;
last_changed_by : abp_locinst_lastchange_user;
local_last_changed_at : abp_locinst_lastchange_tstmpl;
last_changed_at : abp_lastchange_tstmpl;
}
ポイント
作成したオブジェクトは最後に必ず「アクティブにする」ボタン、またはCtrl + F3による有効化が必要です。また、アクティブ化の左にある「Check ABAP Development Object」またはCtrl + F2でファイル内の構文のチェックを行うことが可能です。
オブジェクト生成実行
次に、作成したデータベーステーブルを右クリックして「Generate ABAP Repository Objects」を選択し、Generate機能を利用します。

「OData UI Service」と「OData Web API Service」を選択することができます。「OData Web API Service」でも通常のODataAPIが作成されますが、「OData UI Service」を選択することでFiori Elements用のMetadataも準備されます。今回は「OData UI Service」を選択します。

生成するパッケージを選択して進めると、生成されるオブジェクトの一覧が表示されます。確認後、そのまま先に進めて生成を実行してください。
少しわかりづらいのですが、処理を実行すると画面右下に「生成中」のプログレスバーが表示されますので、完了まで数分お待ちください。

生成が完了するとポップアップが表示されます。「開く」を選択するとService Bindingが表示されます。中央の公開ボタンから公開すると右側に「プレビュー」ボタンが表示されます。これをクリックすることで、FioriのUIのプレビューとともにAPIの実行確認ができます。

「Create」から実際にデータの登録も可能です。

ポイント
UI ServiceのGenerate機能を使用して生成されたアプリケーションにはドラフトテーブルも同時に準備されます。実際に、UIプレビューで一度登録画面に進んでから一覧画面に戻り「Go」ボタンを押下すると下書きが表示され、続きからデータの作成も可能です。
API仕様の確認方法
RAPで生成されたAPIの詳細な仕様についてはService Bindingの「Service Information」にある「テスト」を実行することで、SwaggerUIで表示することが可能です。GETメソッドで利用可能なクエリパラメータやリクエストボディの形式などを確認できます。
ここで確認するとわかりますが、RAPのGenerate機能ではすでにGETメソッドで様々なクエリパラメータが準備されており、Managedによる実装でもクライアント側の必要に応じて柔軟なデータ取得が可能です。

テーブルデータの確認方法
実際にテーブルに登録されたデータはEclipseで確認することが可能です。
作成されたデータベーステーブルを右クリックし「データのプレビュー」で開くことで、登録されたデータの確認が可能です。


生成されたオブジェクトに機能追加(バリデーション)
Generate機能を使用して生成されたオブジェクトには、後からABAPによる処理を追加することが可能です。
先ほど生成したアプリケーションでは、ProductNameが空でも登録されてしまいます。ここでは簡単な必須チェックとしてバリデーションを実装してみます。

Message Classの追加
UIで使用するMessage Classを作成します。
パッケージを右クリックして「新規」>「その他」>「 ABAP Repository Obejct」から「Message Class」を選択します。

名前と説明を入力してMessage Classを作成し、メッセージの番号とTextを追加しておきます。


Validationの追加
対象の「Behavior Definitions」を開き、中括弧内に以下のような記述を追加します。
validation <メソッド名> on save {create; update;}
追加したメソッド名には、波線で「メソッドを追加してください」という注意が出ますが、Ctrl + 1のクイックフィックスの提案を使用することで簡単にメソッドを追加することができます。

追加されたメソッドは「Source Code Library」のオブジェクトに追加されています。

実装のクラスに処理を追加していきます。
ここでは、RAP固有のデータアクセス記法である「EML(Entity Manipulation Language)」を使用してデータを操作しています。具体的には、データ(ProductName)が空の場合に、先ほど作成したメッセージクラスを呼び出してエラー表示を出す、という処理を書いています。
READ ENTITIES OF zr_table_custom_01 IN LOCAL MODE
ENTITY zrTableCustom01
FIELDS ( ProductName )
WITH CORRESPONDING #( keys )
RESULT DATA(request_product_names).
LOOP AT request_product_names INTO DATA(request_product_name).
IF request_product_name-ProductName IS INITIAL.
APPEND VALUE #( %tky = request_product_name-%tky )
TO failed-zrtablecustom01.
APPEND VALUE #( %tky = request_product_name-%tky
%element-ProductName = if_abap_behv=>mk-on
%msg = new_message(
id = 'ZMSG_REQ'
number = 000
severity = if_abap_behv_message=>severity-error
v1 = 'ProductName' ) )
TO reported-zrtablecustom01.
ENDIF.
ENDLOOP.クラスの実装が完了したら有効化を行います。先ほどのUIプレビュー画面に戻り、実際にProductNameを空にしてデータを作成しようとすると、実装したバリデーションが正常に機能し、エラーが表示されることが確認できます。

RAPで開発してよかったこと、苦労したこと
ここまで、RAPの基本的な環境構築と開発手順をご紹介しました。
最後に、実際に私がRAPでの開発を進める中で感じた良い点や、逆に苦労した点について率直にお伝えします。
【よかったこと】
- ODataの標準機能(Filter、Expand、Sortなど)がすぐに利用できる!
従来のSEGWではクエリパラメータを受け取って、ABAPでFilterやExpandに対応したSQLを書く必要がありました。しかしRAPのManagedシナリオでは、自動生成された時点でこれらの機能が内包されているため、フロントエンドとの連携が圧倒的に簡単になりました。 - ビジネスロジックの実装に集中できる!
Generate機能を使用することで、必要なオブジェクトはほとんど生成してくれるため、開発者が本来注力するべきビジネス要件への対応に時間を割くことができます。 - Generate機能でも様々なGET用のクエリパラメータが準備されている!
本文でも記載していますが、Generate機能で実装されたManagedのOData APIでも様々なクエリパラメータを使用することができます。事前にGenerate機能を実行するテーブルに外部キーの設定などをしておくと、$expandによる関連する子要素なども簡単に取得することが可能です。
【苦労したこと】
- 学習コストが高い
先ほどのバリデーション実装部分で登場した「EML(Entity Manipulation Language)」ですが、これはRAP固有のデータアクセス記法です。これまでSEGWでの開発に慣れている方ほど、最初は戸惑うかもしれません。
また、ABAPのコードの書き方とは別にCDS ViewやLUWについても深く理解する必要があります。
おわりに
今回はABAP RESTful application programming model(RAP)の概要から、Generate機能を使用したAPIの自動作成、バリデーションの追加までご紹介しました。
記事の後半でお伝えした通り、EMLやLUWといった新たな概念へのキャッチアップは必要ですが、RAPを使用することで簡単に、迅速にアプリケーション開発を進めることが可能です。
今回紹介した内容はRAPでできることのほんの一部です。私自身、今後もRAPを用いた開発に積極的に挑戦し、そこで得たリアルな知見をこのブログで継続的に発信していきたいと思っています。
最後までご覧いただきありがとうございました。
投稿者プロフィール

-
2023年より新卒入社。
Vue.js、Java(SpringBoot)、 AWSを使用した開発を経験後、
現在はSAPを用いた開発案件でアプリ開発やサービス調査に取り組んでいます。
業務を通じて得た技術に関する記事を共有していきたいと思います。



