【Talend】SAPのBAPIをコールする方法

今回は、いつかのSAPに接続しRFC_READ_TABLEでデータを取得するに引き続き、SAP連携について書いていきます。
(SAPって何?といったことは上記リンクに少し書いていますのでご覧ください)

前回と基本的には同じで、tSAPConnection⇒tSAPInputする部分は同一なのですが、今回はテーブル構造の入力を渡す点が異なります。

Youtubeでもレブル250/グラディウス400/GN125の情報を発信してます! (登録してもらえると超喜びます!!)

今回作ったジョブ

SAPのBAPI、BAPI_ACC_DOCUMENT_POSTをコールするジョブを作ります。
このBAPIは、会計伝票を起票するために使用されます。

一旦ジョブの全体図を。

talend_bapi1

こんな感じです。
SAP接続⇒レコード生成,値格納⇒BAPI呼出⇒コミット
という、ジョブフローだけみると前回とあまり変わりがないように見えます。

しかし、このBAPIは、入力にテーブル構造を持つため、前回のRFC_READ_TABLEとは入力パラメータの与え方がかなり違って難しいです。

コンポーネントのパラメータを見ていく

それでは、具体的に各コンポーネントの設定を見ていきましょう。

「SAP接続」

前回と同じです。接続先情報を正しくセットします。
詳しくはこちら

「SAPへのパラメータ格納変数初期化」

tJavaコンポーネントですね。
SAPに渡すためのパラメータの受け皿を初期化しておきます。
というのも、後でtJavaRow「パラメータ格納」ではAddだけしていきたいので、事前にここでAddさせるためにインスタンスを生成しておきます。

talend_bapi2

はい。こんな感じです…

[java]

java.util.List<String> ACCOUNTGL_ITEMNO_ACC = new java.util.ArrayList<String>();
globalMap.put("ACCOUNTGL_ITEMNO_ACC", ACCOUNTGL_ITEMNO_ACC);

java.util.List<String> ACCOUNTGL_GL_ACCOUNT = new java.util.ArrayList<String>();
globalMap.put("ACCOUNTGL_GL_ACCOUNT", ACCOUNTGL_GL_ACCOUNT);

java.util.List<String> ACCOUNTGL_BUS_AREA = new java.util.ArrayList<String>();
globalMap.put("ACCOUNTGL_BUS_AREA", ACCOUNTGL_BUS_AREA);

java.util.List<String> ACCOUNTGL_PROFIT_CTR = new java.util.ArrayList<String>();
globalMap.put("ACCOUNTGL_PROFIT_CTR", ACCOUNTGL_PROFIT_CTR);

java.util.List<String> CURRENCYAMOUNT_ITEMNO_ACC = new java.util.ArrayList<String>();
globalMap.put("CURRENCYAMOUNT_ITEMNO_ACC", CURRENCYAMOUNT_ITEMNO_ACC);

java.util.List<String> CURRENCYAMOUNT_CURRENCY = new java.util.ArrayList<String>();
globalMap.put("CURRENCYAMOUNT_CURRENCY", CURRENCYAMOUNT_CURRENCY);

java.util.List<String> CURRENCYAMOUNT_AMT_DOCCUR = new java.util.ArrayList<String>();
globalMap.put("CURRENCYAMOUNT_AMT_DOCCUR", CURRENCYAMOUNT_AMT_DOCCUR);
[/java]

ええと、見かけはすごくJavaのコードを書いてゴリゴリしている風ですが、実際は大したことをしていなくて、
Stringのリストを生成⇒生成したリストをglobalMap(グローバル変数)に格納、というのを、必要な入力パラメータ分生成しているだけです。
(globalMapってなに?という方はこちら)

「貸借2レコード生成」

ここで、起票したい会計伝票の明細を生成しています。
貸借対になるレコードを生成したいので、2行生成しています。

talend_bapi3

TENPO_CDは本支所、金額は起票する金額です。

「ACCOUNTGL,CURRENCYAMOUNT編集」

このBAPIを使用するためには、ACCOUNTGLとCURRENCYAMOUNTの2つの種類のテーブルを入力として与える必要がありますので、それぞれの項目にセットする値をtMapで編集します。

talend_bapi4

真ん中のVarでは、連番を採番しています。ITEMNO_ACCというパラメータで、対応する明細番号を振る必要があるためです。
(連番の振り方についてはこちら)
他のパラメータは、SAPのBAPIパラメータをご覧ください。今回はとりあえずこれだけをセットしておきます。

 

「パラメータ格納」

talend_bapi5

ここで、tRowGenerator⇒tMapで生成した行情報をglobalMapに格納していきます。
格納先は、「SAPへのパラメータ格納変数初期化」で作成した受け皿です。
一旦globalMapから該当キーでgetし、そのリストに今回流れてくるrowデータを格納します。

参考までに、コードは下記の通りです。

[java] java.util.List<String> ACCOUNTGL_ITEMNO_ACC = (java.util.List<String>)globalMap.get("ACCOUNTGL_ITEMNO_ACC");
ACCOUNTGL_ITEMNO_ACC.add(row5.ACCOUNTGL_ITEMNO_ACC);
globalMap.put("ACCOUNTGL_ITEMNO_ACC", ACCOUNTGL_ITEMNO_ACC);

java.util.List<String> ACCOUNTGL_GL_ACCOUNT = (java.util.List<String>)globalMap.get("ACCOUNTGL_GL_ACCOUNT");
ACCOUNTGL_GL_ACCOUNT.add(row5.ACCOUNTGL_GL_ACCOUNT);
globalMap.put("ACCOUNTGL_GL_ACCOUNT", ACCOUNTGL_GL_ACCOUNT);

java.util.List<String> ACCOUNTGL_BUS_AREA = (java.util.List<String>)globalMap.get("ACCOUNTGL_BUS_AREA");
ACCOUNTGL_BUS_AREA.add(row5.ACCOUNTGL_BUS_AREA);
globalMap.put("ACCOUNTGL_BUS_AREA", ACCOUNTGL_BUS_AREA);

java.util.List<String> ACCOUNTGL_PROFIT_CTR = (java.util.List<String>)globalMap.get("ACCOUNTGL_PROFIT_CTR");
ACCOUNTGL_PROFIT_CTR.add(row5.ACCOUNTGL_PROFIT_CTR);
globalMap.put("ACCOUNTGL_PROFIT_CTR", ACCOUNTGL_PROFIT_CTR);

java.util.List<String> CURRENCYAMOUNT_ITEMNO_ACC = (java.util.List<String>)globalMap.get("CURRENCYAMOUNT_ITEMNO_ACC");
CURRENCYAMOUNT_ITEMNO_ACC.add(row5.CURRENCYAMOUNT_ITEMNO_ACC);
globalMap.put("CURRENCYAMOUNT_ITEMNO_ACC", CURRENCYAMOUNT_ITEMNO_ACC);

java.util.List<String> CURRENCYAMOUNT_CURRENCY = (java.util.List<String>)globalMap.get("CURRENCYAMOUNT_CURRENCY");
CURRENCYAMOUNT_CURRENCY.add(row5.CURRENCYAMOUNT_CURRENCY);
globalMap.put("CURRENCYAMOUNT_CURRENCY", CURRENCYAMOUNT_CURRENCY);

java.util.List<String> CURRENCYAMOUNT_AMT_DOCCUR = (java.util.List<String>)globalMap.get("CURRENCYAMOUNT_AMT_DOCCUR");
CURRENCYAMOUNT_AMT_DOCCUR.add(row5.CURRENCYAMOUNT_AMT_DOCCUR);
globalMap.put("CURRENCYAMOUNT_AMT_DOCCUR", CURRENCYAMOUNT_AMT_DOCCUR);
[/java]

 

「BAPI_ACC_GL_POSTING_POST」

ここでSAPのBAPI呼出を行います。

talend_bapi6

globalMapに格納しておいた各種情報をgetしてParameterValueにセットします。
ここで、SAP側の入力が構造(Structure)であれば、Type項目をinput_structureに変更、その構造名をTableName(StructureName)にセットします。
ParameterNameはその構造のメンバ(プロパティ?要素?)の名称をしていします。

SAP側の入力がテーブルであれば、Type項目をtable_inputに変更します。
table_inputの場合は、globalMapから取得した値をキャストする必要はなく、Object型のままセットしてあげれば良いようです。

というわけで、BAPIの入力側がテーブル構造の場合は、呼び出す時はそんなに大変ではないです。
でも、下準備であるパラメータ作成が結構大変、という感じですね。

Outputs側のRETURNは下記の様に定義します。

talend_bapi7

この項目名やXPathQuerysの求め方は、前回記事に書いてありますので参考にしてください。

「SAP戻り値編集」

ここはお好きな様に使用してください。
私は、TYPEという項目のリターンコードだけを参考に成否判定しています。

[java] //リターンコードをcontextに格納 (S で成功と判断)
context.sap_return_cd = input_row.TYPE;
[/java]

「SAPコミット」

直前のtJavaRow(SAP戻り値編集)で保存したcontext.sap_return_cdの値が”S”だった場合に、IfリンクでSAPコミットするようにしています。
当たり前ですが、コミットし忘れるとSAPに伝票が登録されません。

 

結果確認

上記の設定を行い、一応動作確認をします。

talend_bapi8

SAPからの戻り値を出力しているtLogRowのログを見ると、MESSAGEに伝票が転記された旨のメッセージが表示されています。
もちろん、FB03などで確認しても、この伝票がきられていることを確認できます。

 

というわけで、今回は以上です!

Youtubeでもレブル250/グラディウス400/GN125の情報を発信してます! (登録してもらえると超喜びます!!)
最新情報をチェックしよう!