SAPシステムとSOAPでデータ連携

Salesforce と自社内の SAP ERP をデータ連携したいというご要望は多くあります。
SAP ERP と Salesforce 間で自動データ連携を構築する際、よくとられる手法は下記の3つです。

  • SAPシステム側にファイル入出力ABAPプログラムを作り、データ連携ツールとファイル連携する。
  • Salesforce Connect により、Salesforceからリアルタイムに SAPシステムのデータを参照する。(※SAP Gatewayが必須)
  • SAPアダプタのあるデータ連携ツールをつかう。

3つ目のSAPアダプタについて、SAPシステムとの通信部分では内部的に BAPI(RFC) または IDoc を使う
連携ツールが多いのですが、SAP ERPの標準機能で SOAP の I/F もあります。

今回、SAP社が scn.sap.com で公開している ABAPのお勉強用の下記のツールで
SAPシステムの SOAP I/F を使ったデータ連携の動作確認ができたので、
その手順を説明します。

動作確認に使用したツール: SAP NetWeaver AS ABAP 7.02 SP6 32-bit Trial

昨年 7月ごろにSAP社のサイトで一時的に公開された、 S/4 HANA on AWSの
トライアル環境でも同様の手順で動作確認できましたので、
SAP ERP 6.0でも動作するものと思われます。

動作確認したこと

弊社のデータ連携ツールである DCSpider から
SAPシステムの汎用モジュールSTFC_CONNECTION を SOAP で呼び出し、
その結果を DCSpider で取得して Salesforce のカスタムオブジェクトに INSERT する。

SAPシステム STFC_CONNECTION (T-cd: SE37)

se37_stfc_connection

標準の汎用モジュール STFC_CONNECTION は上記のとおり、シンプルなプログラムです。
これを DCSpider から呼び出します。

下記の3つの手順で実装できます。
Step 1: SAPシステム側設定(確認)
Step 2: STFC_CONNECTIONを呼び出す入力XMLファイルを作成
Step 3: DCSpider側設定

Step 1: SAPシステム側設定(確認)

SAPサーバ側のSOAP I/Fの待ち受けTCPポートを確認します。
トランザクション SMICM により確認できます。
smicm_init

メニューパス GoTo > Parameters > Display
smicm_parameters
上記画面の icm/server_port_0 の箇所で、この環境についてはICMの待ち受けTCPポートが 8080 であることが確認できました。

次にトランザクション SICF を実行します。
sicf_init

実行ボタンexecuteをクリックします。

sicf_soap

  • /sap/bc/soap/rfc
  • /sap/bc/soap/wsdl

上記の2つのサービスが有効であることを確認します。
有効な場合は黒字になっていますが、無効であるときにはグレーアウトしています。

有効である場合、ブラウザで下記のURLにアクセスすると WSDL を取得できます。

http://<SAPサーバホスト名 or IPアドレス>:<ICM TCPポート>/sap/bc/soap/wsdl?services=<汎用モジュール名>

firefox_wsdl

Step 2: STFC_CONNECTIONを呼び出す入力XMLファイルを作成

下記のファイルを作成します。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:urn="urn:sap-com:document:sap:rfc:functions">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:STFC_CONNECTION>
      <REQUTEXT>あいうえおABCDE</REQUTEXT>
      </urn:STFC_CONNECTION>
  </soapenv:Body>
</soapenv:Envelope>

ファイルの内容について

<urn:STFC_CONNECTION> という部分が呼び出す汎用モジュール名を表します。

<urn:STFC_CONNECTION> ~ </urn:STFC_CONNECTION>
の範囲に Import パラメータおよび Tableパラメータ を記述します。

Tableパラメータの場合の下記のように記述します。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:urn="urn:sap-com:document:sap:rfc:functions">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:RFC_READ_TABLE>
      <QUERY_TABLE>T005</QUERY_TABLE>
      <DELIMITER/>
       <NO_DATA/>
        <FIELDS>
           <item>
             <FIELDNAME>LAND1</FIELDNAME>
           </item>
           <item>
             <FIELDNAME>LANDK</FIELDNAME>
           </item>
          </FIELDS>
         <DATA/>
   </urn:RFC_READ_TABLE>
   </soapenv:Body>
</soapenv:Envelope>

Tableパラメータの1行は <item> ~ </item> で表します。

Step 3: DCSpider側設定

DCSpider から SAPシステムの SOAP I/F にアクセスするために
今回は RESTアダプタ(※オプションアダプタ) を使用しました。

RESTアダプタのグローバルリソースは下記のように設定します。

global_resource

URLは http://<SAPサーバホスト名 or IPアドレス>:<ICM TCPポート>/ を指定します。

スクリプトは下記のように作ります。
SAPシステムから受信するSOAPレスポンスデータのフォーマットを確認するため、
一旦XMLファイルにSOAPレスポンスを出力します。

script_canvas

1. Mapping
2. RESTアダプタ - POST実行
3. XMLファイル書き込み

ツールパレットから上記3つのアイコンをキャンバスにドロップし、プロセスフローとデータフローを上の図のように繋ぎます。

Mappingの設定は下記のように行います。

mapping

出力側(右側) の「POST実行」の右クリックメニューから、Step 2 で作成した XMLファイルを出力スキーマに読み込みます。

その後、出力側ノード「REQUTEXT」に対して入力データを設定します。上記の例では固定文字列「テストです。」を設定しています。

POST実行の設定は下記のように行います。

必須設定タブ

post_1

パス /sap/bc/soap/rfc
クエリパラメータ sap-client 値: <クライアント番号>

を指定します。

ヘッダ設定タブ

post_2

リクエストヘッダに Content-type 値: text/xml を追加します。

認証設定タブ

post_3

SAPシステムにログインするユーザ・パスワードを指定します。

「XMLファイル書き込み」 については出力ファイルのフルパスを指定するだけです。
特別な設定は不要です。

上記で作成したDCSpiderのスクリプトを実行します。
すると、DCSpiderサーバ上に下記のような XMLファイル が作成されます。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <urn:STFC_CONNECTION.Response xmlns:urn="urn:sap-com:document:sap:rfc:functions">
      <ECHOTEXT>テストです。</ECHOTEXT>
      <RESPTEXT>SAP R/3 Rel. 702   Sysid: NSP      Date: 20160129   Time: 114024   Logon_Data: 001/BCUSER/E</RESPTEXT>
    </urn:STFC_CONNECTION.Response>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

次にスクリプトを下記のように変更します。

script_canvas_2

「POST実行」の後に mapping アイコンと Salesforceアダプタ - データ書き込み(INSERT)を
追加し、プロセスフローとデータフローをつなぎます。

「XMLファイル書き込み」 は削除します。

SFDC_INSERTは下記のように設定します。

sfdc_insert

上記例ではカスタムオブジェクト(STFC_CONNECTION実行結果)に設定した
テキスト型カスタム項目2つをスキーマに指定しました。

追加した mapping は下記のように設定します。

mapping_2

入力側(左側) の 「POST実行」 の右クリックメニューから、先ほどの「XMLファイル書き込み」で作成した
ファイルをスキーマに読み込みます。

入力側と出力側 (右側) の項目を紐づけます。

これでDCSpider スクリプトは完成です。

DCSpiderスクリプト実行

上記のスクリプトを実行し、最後まで正しく実行されたことがSalesforce画面で確認できました。

sfdc_record

まとめ

SAP R/3 が流行りだしたころは自社内のSAPシステムがインターネット上の外部システムと直接
データ連携をすることはセキュリティの観点からなかなか受け入れられないところでしたが、
Salesforceを始めとして信頼できるクラウドサービスが増えてきた今、直接つなぐことも
十分現実的と言えます。

SAPシステムと外部システム間のネットワークをVPNを前提とするのであれば
RFCプロトコルを使用するのが実績の面から安心です。

ですが、もしVPNを使わずに接続するのであれば、DMZにリバースプロキシを立て、
外部システムからは HTTPS でリバースプロキシ経由でSAPシステムにアクセスする
という連携手段も検討に値すると言えるでしょう。

これからSAPシステム連携構築を検討する際には SOAP も選択肢としてみてはいかがでしょうか。

参考ページ

● Calling RFC-enabled Function Modules over HTTP from external application (英語)