はじめに
CAP Node.jsには@sap/cds-rfcというプラグインがあり、これを使うとABAPサーバにあるリモート可能な汎用モジュールを呼び出すことができます。つまり、CAPからBAPIなどが呼び出せるということです。さっそく使い方を確認してみましょう。
環境
- SAP Business Application Studio (BAS)
- ABAP Cloud Developer Trial 2023
参考
- Consume ABAP RFC Function Modules in CAP | SAP Blog
- gregorwolf/cap-rfc | GitHub
- Explore SAP System Functions | Help Portal
1. 事前準備
以下の設定を行います。
- RFC接続のための設定
- SAPのNPMレジストリにアクセスするための認証情報を取得
1.1. RFC接続のための設定
1.1.1. Cloud Connectorの設定
Cloud ConnectorにRFC用の接続設定を登録します。
以下の汎用モジュール(およびプリフィックス)を許可します。
BAPI_
RFC_
DOCU_GET
1.1.2. Destinationの登録
Additional Propertiesに色々入っていますが、自分で設定したのは以下のプロパティで、他は自動で設定されました。
- jco.client.ashost
- jco.client.client
- jco.client.lang
- jco.client.sysnr
2.1. SAPのNPMレジストリにアクセスするためのテクニカルユーザを作成
CAPでRFCを呼び出すためのプラグインである@sap/cds-rfc
が、裏では@sap-rfc/node-rfc-library
を使用しており、このライブラリはSAPの専用レジストリにあります。そのため、レジストリにアクセスするためのテクニカルユーザを作成しておく必要があります。
以下のドキュメントの"Create a Technical User"のセクションの説明に沿って、S-userに対応するテクニカルユーザを登録します。
Managing Technical Users in Repository-Based Shipment Channel
余談ですが、このユーザはSAP Build Processs AutomationのDesktop Agentをダウンロードするときにも使われます。
2. CAPプロジェクトの登録
汎用モジュールに接続するために以下の設定を行います。
- プロジェクトの登録
- Service Centerから汎用モジュールを取り込み
- @sap/cds-rfcをインストール
- サービスおよびイベントハンドラの定義
- デプロイ
- ハイブリッドモードで実行
作成したリポジトリは以下です。
2.1. プロジェクトの登録
以下のコマンドでプロジェクトを登録します。
cds init <プロジェクト名>
2.2. Service Centerから汎用モジュールを取り込み
Storyboardを開き、External Resourcesを追加します。
Service Centerが開くので、ラジオボタンから"Function"を選択し、事前に登録したRFC用のDestinationを選択します。
ABAPサーバへのログインを求められるので、ユーザ、パスワードを入力して接続します。
Destinationに正しい認証情報を登録していても認証を求められます。
認証すると、Classic APIsに汎用モジュールの一覧が表示されます。
Classic APIsに表示されるのは接続先の環境に登録されている汎用モジュールというわけではなく、Cloudification Repositoryに"Classic API"として登録されている汎用モジュールのようです。
今回はClassic APIではない汎用モジュールを使用するので、"All APIs"から直接指定しました。
汎用モジュールをクリックすると右側に詳細が表示され、"Add to Project"をクリックするとプロジェクトに追加されます。
このとき、Repository-Based Shipment Channel Credentialsを求められます。2.1.で作成したユーザ名と、Basic Auth Passwordをコピーして設定します。
プロジェクトのルートに.npmrc
というファイルが作成されます。ここにNPMレジストリにアクセスするための認証情報が設定されています。
@sap-rfc:registry=https://73554900100900009091.npmsrv.repositories.cloud.sap
//73554900100900009091.npmsrv.repositories.cloud.sap/:_auth="MDAwMDQ5...=="
2.3. @sap/cds-rfcをインストール
以下のコマンドで必要なモジュールをインストールします。
npm install @sap/cds-rfc @sap-rfc/node-rfc-library
2.4. サービスおよびイベントハンドラの定義
以下のサービスを定義します。
using { abaptrialRFC as rfc } from './external/abaptrialRFC';
service rfcService
{
action createBP (header: rfc.DDIC.BAPI_EPM_BP_HEADER) returns rfc.BAPI_EPM_BP_CREATE.ResultType;
}
アクションcreateBP
はBAPIを使ってEPMモデルのビジネスパートナーを登録します。引数および戻り値の型は、汎用モジュールを取り込んだときに作成された以下のcdsファイルで定義されたものを使用しています。
イベントハンドラを以下のように実装します。
const cds = require('@sap/cds')
module.exports = class rfcService extends cds.ApplicationService { async init() {
const rfc = await cds.connect.to('abaptrialRFC');
this.on ('createBP', async (req) => {
console.log('On createBP', req.data)
const result = await rfc.BAPI_EPM_BP_CREATE({HEADERDATA: req.data.header});
console.log('result: ', result);
return result;
})
return super.init()
}}
cds.connect.to()
で指定しているのは、汎用モジュールを取り込んだときに定義されたpackage.jsonのrequires
セクションで設定された名前です。
2.5. デプロイ
以下のコマンドでデプロイ用の設定を追加します。
cds add destination,connectivity
cds add xsuaa --for production
cds add mta
以下のコマンドでデプロイします。
npm install
cds up //ビルドとデプロイを実施
2.6. ハイブリッドモードで実行
以下のコマンドでdestinationサービスをバインドします。
cds bind -2 <destinationサービスインスタンス>
.cdsrc-private.json
に以下の設定を追加します。
"abaptrialRFC": {
"credentials": {
"destinationBack": "<destination名>",
"connectivity_subaccount": "<サブアカウントのID>",
"connectivity_proxy_host": "localhost",
"connectivity_proxy_port": "20001",
"ashost": "<destinationに設定したashost>",
"client": "<destinationに設定したclient>",
"sysnr": "<destinationに設定したsysnr>",
"connectivity_location_id": "<destinationに設定したLocation ID>",
"user": "<ABAPサーバログインユーザ>",
"passwd": "<ABAPサーバログインユーザのパスワード>"
}
}
test/test.http
ファイルを作成します。
@server=http://localhost:4004
@username=alice
@password=
### createBP
# @name createBP_POST
POST {{server}}/odata/v4/rfc/createBP
Content-Type: application/json
Authorization: Basic {{username}}:{{password}}
{
"header": {
"BP_ROLE": "01",
"EMAIL_ADDRESS": "test3@example.com", //メールアドレスは一意にする必要があるので毎回変えること
"COMPANY_NAME": "COMPANY_NAME",
"CURRENCY_CODE": "JPY",
"CITY": "CITY",
"STREET": "STREET",
"COUNTRY": "JP",
"ADDRESS_TYPE": "02"
}
}
おわりに
本記事では、CAP Node.jsのプラグインを利用して汎用モジュールを呼び出す方法を紹介しました。現時点ではCAP JavaについてはRFC連携はサポートされておらず、SAP Cloud SDKを利用した呼び出しも非推奨になっています。将来的にCAP Javaでも同様の機能が提供されることを期待します。