ABAP Extension Module 用の WebSphere ビジネス・オブジェクトは、 SAP 内で IDoc として定義できます。IDoc は、ALE (Application Link Enabling) と呼ばれる SAP の EDI ソリューションの一部です。IDoc の定義は SAP の BOR (ビジネス・オブジェクト・リポジトリー) に保管され、SAP システム内でグローバルにアクセスできます。この Connector for mySAP.com では、SAP ネイティブ API と組み合わせて使用するための準備として、SAP アプリケーション内の WebSphere ビジネス・オブジェクトを解釈および解析できるように、ALE の定義部を活用しています。アダプターは、IDoc を使用して開発されたビジネス・オブジェクトをサポートする IDoc Handler を提供しています。
IDoc Handler は、2 つの機能モジュールから構成されています。Dynamic Retrieve や Dynamic Transaction などの、その他の ABAP Handler は、単一の機能モジュールのみで構成されています。
/CWLD/RFC_DO_VERB_NEXTGEN はビジネス・オブジェクト・データを IDoc Handler /CWLD/IDOC_HANDLER に受け渡します。この IDoc Handler は、すべてのオブジェクト・タイプに汎用で、指定された IDoc のタイプを取得するため、およびビジネス・オブジェクト・データを IDoc の構造に再フォーマットするためにビジネス・オブジェクトのアプリケーション固有情報を使用します。データを再フォーマットした後、汎用 IDoc Handler はビジネス・オブジェクト・データをオブジェクト固有 IDoc Handler に (そのビジネス・オブジェクトのタイプと動詞の組み合わせに基づいて) 渡します。このオブジェクト固有 IDoc Handler は、SAP ネイティブ API との統合を処理します。オブジェクト固有 IDoc Handler は、ビジネス・オブジェクト・データの処理を終えると、IDoc 形式のビジネス・オブジェクト・データを /CWLD/IDOC_HANDLER に戻します。この汎用 IDoc Handler は、ビジネス・オブジェクト・データを変換して元のフォーマットに戻し、/CWLD/RFC_DO_VERB_NEXTGEN に戻します。
図 15 に、IDoc Handler の基本アーキテクチャーを示します。
アダプター提供の IDoc Handler を使用するには、IDoc を SAP アプリケーション内で定義する必要があります。SAP 提供、またはカスタマー作成の IDoc を使用できます。IDoc 定義は SAP 用の WebSphere ビジネス・オブジェクトの定義をミラーする必要があるため、アダプターは IDoc を基にした WebSphere ビジネス・オブジェクト定義を生成するツールを、2 つ提供しています。
以下のセクションで、これらのツール両方の使用法を説明します。
IBM CrossWorlds Station を使用してビジネス・オブジェクト定義を生成する前に、 SAP アプリケーション内で WebSphere ビジネス・オブジェクトを作成しておく必要があります。IDoc に基づいてビジネス・オブジェクト定義を作成するには、以下の手順を行います。
例えば、Order IDoc タイプ YXRV4B01 に基づいた SAP4_Order ビジネス・オブジェクトは、次のような機能を持つことができます。
動詞機能でアプリケーション固有情報を使用する方法の詳細については、ABAP Handler へのビジネス・オブジェクト発送を参照してください。
IDoc を定義したら、そのビジネス・オブジェクトがサポートする必要のある各動詞について、機能モジュールを作成します。各機能は、/CWLD/IDOC_HANDLER から呼び出すことができるように、次に示すインターフェースを備える必要があります。
*" IMPORTING *" VALUE(OBJECT_KEY_IN) LIKE /CWLD/LOG_HEADER-OBJ_KEY OPTIONAL *" VALUE(INPUT_METHOD) LIKE BDWFAP_PAR- NPUTMETHD OPTIONAL *" VALUE(LOG_NUMBER) LIKE /CWLD/LOG_HEADER-LOG_NR OPTIONAL *" EXPORTING *" VALUE(OBJECT_KEY_OUT) LIKE /CWLD/LOG_HEADER-OBJ_KEY *" VALUE(RETURN_CODE) LIKE /CWLD/RFCRC_STRU-RFCRC *" VALUE(RETURN_TEXT) LIKE /CWLD/LOG_HEADER-OBJ_KEY *" TABLES *" IDOC_DATA STRUCTURE EDID4
SAPODA を使用して、IDoc に基づいた ABAP Extension Module 用のビジネス・オブジェクト定義を生成できます。
SAPODA を使用してビジネス・オブジェクト定義を生成する場合は、Business Object Designer Express を使用して定義を表示、および変更できます。SAPODA の使用方法の詳細については、付録 C, SAPODA を使用したビジネス・オブジェクト定義の生成を参照してください。
IDoc を定義したら、そのビジネス・オブジェクトがサポートする必要のある各動詞について、機能モジュールを作成します。各機能は、 /CWLD/IDOC_HANDLER から呼び出すことができるように、次に示すインターフェースを備える必要があります。
*" IMPORTING *" VALUE(OBJECT_KEY_IN) LIKE /CWLD/LOG_HEADER-OBJ_KEY OPTIONAL *" VALUE(INPUT_METHOD) LIKE BDWFAP_PAR- NPUTMETHD OPTIONAL *" VALUE(LOG_NUMBER) LIKE /CWLD/LOG_HEADER-LOG_NR OPTIONAL *" EXPORTING *" VALUE(OBJECT_KEY_OUT) LIKE /CWLD/LOG_HEADER-OBJ_KEY *" VALUE(RETURN_CODE) LIKE /CWLD/RFCRC_STRU-RFCRC *" VALUE(RETURN_TEXT) LIKE /CWLD/LOG_HEADER-OBJ_KEY *" TABLES *" IDOC_DATA STRUCTURE EDID4
Create、Update、および Delete 操作をサポートする IDoc Handler は、IDoc としてフォーマットされたビジネス・オブジェクト・データを受け取ります。これらの操作の役割は、ビジネス・オブジェクト・データを SAP の呼び出しトランザクション API と統合し、オブジェクト・キーを生成することです。オブジェクト・キーのみが /CWLD/IDOC_HANDLER を通じてコネクターに戻され、ビジネス・オブジェクト・データは戻されません。/CWLD/IDOC_HANDLER は、ビジネス・オブジェクト・データをメモリーに格納し、オブジェクト・キーを親ビジネス・オブジェクトで IsKey としてマークされた最初の属性に挿入します。それから /CWLD/IDOC_HANDLER は、コネクターにビジネス・オブジェクト・データを戻します。
次に示すサンプル・コードは、以下のフローを表しています。
次に示すサンプル・コードでは、SAP Sales Quote Create がサポートされます。
*- Initialize working variables and internal tables PERFORM INITIALIZE_IN. *- I01(MF): Begin IDoc interpretation PERFORM LOG_UPDATE(/CWLD/SAPLLOG) USING C_INFORMATION_LOG TEXT-I01 SPACE SPACE SPACE. *- Interpret IDoc data structure IF NOT IDOC_DATA[] IS INITIAL. *- Move IDoc to internal tables PERFORM INTERPRET_IDOC. *- Check some of the input fields PERFORM CHECK_INPUT. *- If key values were missing, exit function IF RETURN_CODE NE 0. EXIT. ENDIF. *- E01(MF): No Idoc data lines sent for processing. ELSE. RETURN_CODE = 2. RETURN_TEXT = TEXT-E01. EXIT. ENDIF. *- Build the BDC session for transaction VA21. PERFORM BUILD_BDC_VA21. *- Call Transaction PERFORM LOG_UPDATE(/CWLD/SAPLLOG) USING C_INFORMATION_LOG TEXT-I02 'VA21' C_BLANK C_BLANK. CALL TRANSACTION 'VA21' USING BDCDATA MODE INPUT_METHOD UPDATE 'S' MESSAGES INTO BDC_MESSAGES. *- Capture return code and object key from transaction PERFORM PREPARE_RETURNED_MESSAGE. ENDFUNCTION.
Create ロジックの主要な機能は次の 2 つです。
Create ロジックの最初の部分では、IDoc 構造のデータを作業データ構造に変換する操作を行います。そのためには、以下のようなコードを作成する必要があります。
loop at idoc_data. case idoc_data-segnam. when 'ZSQVBAK'. " Header Data move idoc_data-sdata to zsqvbak. when 'ZSQVBUK'. " Status Segment move idoc_data-sdata to zsqvbuk. when 'ZSQVBP0'. " Partner Header Level move idoc_data-sdata to zsqvbp0. when 'ZSQVBAP'. " Item Detail move idoc_data-sdata to zsqvbap. when 'ZSQVBA2'. " Item Detail Part 2 move idoc_data-sdata to zsqvba2. when 'ZSQVBUP'. " Item Status move idoc_data-sdata to zsqvbup. when 'ZSQVBKD'. " Commercial data move idoc_data-sdata to zsqvbkd. when 'ZSQKONV'. " Condition move idoc_data-sdata to zsqkonv. when 'ZSQVBPA'. " Partner Item Level move idoc_data-sdata to zsqvbpa. endcase. endloop.
作成ロジックの第 2 の部分では、データを SAP アプリケーション・データベースに追加する操作を行います。BAPI や SAP 標準機能などの提供されている機能を使用したり、独自に開発した呼び出しトランザクション機能を使用できます。提供されている機能を使用する場合は、その機能が将来のリリースで変更される場合があることに注意してください。データベースに書き込む代わりに、呼び出しトランザクションを使用することをお勧めします。呼び出しトランザクションを使用すると、SAP データベースの変更に影響を受けず、必要な範囲と機能に焦点を絞ったカスタム機能を開発できます。
ビジネス・オブジェクト・データを SAP に渡すには、ABAP コードの一部を、IBM CrossWorlds Station の Inbound Wizard (トランザクション /n/CWLD/HOME) または SAP BDC レコーダーを使用するか、手動で開発することによって生成します。
Inbound Wizard は、作成トランザクションのアクティビティーを記録し、BDC ロジックを記述したテキスト・ファイルを作成します。Sales Quote の例では、トランザクション VA21 が記録されています。
Inbound Wizard を使用してトランザクション VA21 を記録するには、以下の手順を行います。
次に示すサンプル・コードは、生成された BDC セッションの最初の数行から抜粋したものです。
* Sales doc. Initial screen Create perform dynpro_new using 'SAPMV45A' '0101' . * Sales document type perform dynpro_set using 'VBAK-AUART' 'QT' . * Distribution channel perform dynpro_set using 'VBAK-VTWEG' 'sourcefield' . * Division perform dynpro_set using 'VBAK-SPART' 'sourcefield' . * Function Command perform dynpro_set using 'BDC_OKCODE' '=ENT2' . * 4.0: Screen Container for Overview Screens (normal header) perform dynpro_new using 'SAPMV45A' '4001' . * Sold-to party perform dynpro_set using 'KUAGV-KUNNR' '238' . * Ship-to party perform dynpro_set using 'KUWEV-KUNNR' '238' . * Function Command perform dynpro_set using 'BDC_OKCODE' '=KKAU' . * 4.0: Screen container for document header screens perform dynpro_new using 'SAPMV45A' '4002' . * Date until which bid/quotation is binding (valid-to date) perform dynpro_set using 'VBAK-BNDDT' '20000630' .
SAP の BDC レコーダーを使用することもできます (トランザクション SHDB)。次に示すサンプル・コードは、BDC レコーダーを使用して生成されたものです。
start-of-selection. read dataset dataset into record. if sy-subrc <> 0. exit. endif. perform bdc_dynpro using 'SAPMV45A' '0101'. perform bdc_field using 'BDC_CURSOR' 'VBAK-AUART'. perform bdc_field using 'BDC_OKCODE' '=ENT2'. perform bdc_dynpro using 'SAPMV45A' '4001'. perform bdc_field using 'BDC_OKCODE' '=KKAU'. perform bdc_field using 'BDC_CURSOR' 'KUWEV-KUNNR'. perform bdc_field using 'KUAGV-KUNNR' record-KUNNR_001. perform bdc_field using 'KUWEV-KUNNR'
この方法からの出力には、最初の方法にあったビジネス・オブジェクト・コメントが含まれないため、あまりお勧めできません。SAP の BDC レコーダーを使用することの利点は、BDC の記録を検証するための独立した方法をもたらすことです。
もう 1 つの方法は、BDC を手動で生成することです。これは、機能全体を作成する場合には推奨できるアプローチではありませんが、上に挙げた方法を補助するためには利用できます。この方法は、入力データに対応して SAP トランザクション中に表示されることのある追加画面やポップアップ・ボックスのためにロジックを追加する必要がある場合に有用です。
Retrieve 動詞をサポートするオブジェクト固有 IDoc Handler は、 /CWLD/IDOC_HANDLER からビジネス・オブジェクト・データを受け取りません。その代わりに、 /CWLD/IDOC_HANDLER はオブジェクト固有 IDoc Handler 関数の OBJECT_KEY_IN パラメーターを使用して、 IsKey とマークされた最初の属性の値のみを渡します。オブジェクト固有 IDoc Handler は、この属性の値を使用して、ABAP SQL を使用するビジネス・オブジェクトのインスタンスに関するすべての情報を検索したり、適切な IDoc 構造に含まれるそのデータをフォーマットしたりします。
次に示すコード・フラグメントは、Sales Quote を検索するためのオブジェクト固有 IDoc Handler を示したものです。Sales Quote ビジネス・オブジェクトは、VBAK、VBUK、VBPO、VBAP、VBUP、VBKD、KNOV、および VBPA の表からデータを検索します。これらの表は、IDoc タイプ ZSLSQUOT の階層およびカーディナリティーに従います。このコードでは、以下の処理が実行されます。
IDoc タイプ ZSLSQUOT に対するオブジェクト固有 IDoc Handler のコード・フラグメントは次のとおりです。
*- Clear the interface structures. clear: g_text, object_key_out, return_code, return_text, idoc_data. refresh: idoc_data. * If no key value is specified, log it as an error and exit. if object_key_in is initial or object_key_in = c_cxignore_const. perform log_update(/cwld/sapllog) using c_error_log text-e02 space space space. return_code = 1. return_text = text-e02. exit. endif. perform initialize_global_structures. perform fill_internal_tables. if not return_code is initial. exit. endif. * Build Idoc segments from internal tables perform fill_idoc_inttab. return_code = 0. return_text = text-s01. perform log_update(/cwld/sapllog) using c_information_log text-s01 space space space. endfunction.
最も重要なパラメーター 2 つは、インバウンド・キーのための OBJECT_KEY_IN、およびアウトバウンド・データのための IDOC_DATA です。OBJECT_KEY_IN は、複数キーを表す連結されたストリングである場合があることに注意してください (定義した規則に依存)。オブジェクト固有 IDoc Handler は、連結された値を解析して、その各部分を適切なキー・フィールドにロードします。この機能を維持するためには、/CWLD/IDOC_HANDLER を使用する場合に、キーに対して名前と値のペアを指定しないことが重要です。
VBAK 表は、子テーブルに対する選択基準を操作します。そのため、各表は作業表にロードされます。VBAK 表を使用すると、追加のキーを使用して子テーブルを検索できます。そのため、Sales Quote の例では、コードは次のようになります。
form fill_internal_tables. * Get information from VBAK, VBUK, VBAP, VBKD, KONV, VBPA select single * from vbak where vbeln = object_key_in. if sy-subrc <> 0. perform log_update(/cwld/sapllog) using c_error_log text-e01 object_key_out c_blank c_blank. return_code = '1'. g_text = text-e01. replace '&' with order_number into g_text. return_text = g_text. exit. endif. select single * from vbuk where vbeln = vbak-vbeln. select * from vbap into table t_vbap where vbeln = vbak-vbeln. * Continue for other tables
以下に示すコードは、要求されたデータをアプリケーション・データベースから内部表および作業変数にコピーするために使用されます。次に、このコードは WebSphere ビジネス・オブジェクト定義に直接に対応するセグメントを作成し、それらを SAP セグメント構造に挿入します。
IDoc タイプと作業構造の間でフィールドがほとんど一致している場合は、ABAP で移動に相当するコマンドを実行できる場合があります。そうでない場合、構造内のフィールドの総数に比べて移動するフィールドの数は少ないため、フィールドを作業表から IDoc タイプ表に手動で移動するようにお勧めします。これは、単純にデータを作業データ構造から IDoc 構造に転送し、次にフラットなデータ・フィールドに転送するために使用されます。
コードは次のとおりです。
form fill_idoc_inttab. perform fill_zsqvbak. " Fill the Sales Quote Header perform fill_zsqvbuk. " Fill the Sales Quote Status perform fill_zsqvbap. " Fill Sales Quote Lines endform. " FILL_IDOC_INTTAB *-- fill the Sales Quote Header form fill_zsqvbak. clear idoc_data. clear zsqvbak. idoc_data-segnam = 'ZSQVBAK'. move-corresponding vbak to zsqvbak. move zsqvbak to idoc_data-sdata. append idoc_data. endform. " FILL_ZSQVBAK *-- fill the Sales Quote Header Status form fill_zsqvbuk. clear idoc_data. clear zsqvbuk. idoc_data-segnam = 'ZSQVBUK'. move-corresponding vbuk to zsqvbuk. move zsqvbuk to idoc_data-sdata. append idoc_data. endform. " FILL_ZSQVBAK *-- fill the Sales Quote Line and the Line Child segments form fill_zsqvbap. loop at t_vbap. clear idoc_data. clear zsqvbap. idoc_data-segnam = 'ZSQVBAP'. move-corresponding t_vbap to zsqvbap. move zsqvbap to idoc_data-sdata. append idoc_data. perform fill_zsqvba2. perform fill_zsqvbup. perform fill_zsqvbkd. perform fill_zsqkonv. perform fill_zsqvbpa. endloop. endform. *-- fill second part of vbap form fill_zsqvba2. " etc.