IDoc を使用したビジネス・オブジェクトの開発

ABAP Extension Module 用の WebSphere ビジネス・オブジェクトは、SAP 内で IDoc として定義できます。IDoc は、ALE (Application Link Enabling) と呼ばれる SAP の EDI ソリューションの一部です。IDoc の定義は SAP の BOR (ビジネス・オブジェクト・リポジトリー) に保管され、SAP システム内でグローバルにアクセスできます。ここでは、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 に戻します。

図 75 に、IDoc Handler の基本アーキテクチャーを示します。

図 75. IDoc Handler のアーキテクチャー

アダプター提供の IDoc Handler を使用するには、IDoc を SAP アプリケーション内で定義する必要があります。SAP 提供、またはカスタマー作成の IDoc を使用できます。IDoc 定義は SAP 用の WebSphere ビジネス・オブジェクトの定義をミラーする必要があるため、アダプターは IDoc を基にした WebSphere ビジネス・オブジェクト定義を生成する SAPODA を提供しています。

SAPODA を使用したビジネス・オブジェクト定義の生成

SAPODA を使用して、以下の IDoc に基づいた ABAP Extension Module 用のビジネス・オブジェクト定義を 生成できます。

重要:
SAPODA を使用するために、SAP システムに英語でログオンする必要があります。

SAPODA を使用してビジネス・オブジェクト定義を生成する場合は、Business Object Designer Express を使用して定義を表示、および変更できます。SAPODA の使用方法の詳細については、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

IDoc Handler と create、update、および delete 動詞

Create、Update、および Delete 操作をサポートする IDoc Handler は、IDoc としてフォーマットされたビジネス・オブジェクト・データを受け取ります。これらの操作の役割は、ビジネス・オブジェクト・データを SAP の呼び出しトランザクション API と統合し、オブジェクト・キーを生成することです。オブジェクト・キーのみが /CWLD/IDOC_HANDLER を通じてコネクターに戻され、ビジネス・オブジェクト・データは戻されません。/CWLD/IDOC_HANDLER は、ビジネス・オブジェクト・データをメモリーに格納し、オブジェクト・キーを親ビジネス・オブジェクトで IsKey としてマークされた最初の属性に挿入します。それから /CWLD/IDOC_HANDLER は、コネクターにビジネス・オブジェクト・データを戻します。

注:
統合ブローカーが InterChange Server Express であるため、ビジネス・オブジェクト・データを維持する ことが重要です。マッピング・インフラストラクチャーが、動的相互参照のために ObjectEventId の保持を必要とするためです。

次に示すサンプル・コードは、以下のフローを表しています。

  1. グローバル・データを初期化します。
  2. IDoc をデコンストラクションして作業表に入れます。
  3. BDC を作成します。複数のオブジェクト間で振る舞いに一貫性を持たせるため、/CWLD/INBIDOC_FRMS0 内の形式を使用して、データを内部表から BDC 表に転送します。
  4. 呼び出しトランザクションを作成します。
  5. オブジェクト・キーを取り込みます。

次に示すサンプル・コードでは、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 つです。

IDOC 構造の変換

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 WebSphere BI Station の Inbound Wizard (トランザクション /n/CWLD/HOME) または SAP BDC レコーダーを使用するか、手動で開発することによって生成します。

Inbound Wizard は、作成トランザクションのアクティビティーを記録し、BDC ロジックを記述したテキスト・ファイルを作成します。Sales Quote の例では、トランザクション VA21 が記録されています。

Inbound Wizard を使用してトランザクション VA21 を記録するには、以下の手順を行います。

  1. IBM WebSphere BI Station に移動します (トランザクション /n/CWLD/HOME)。
    重要:
    IBM WebSphere BI Station を使用して、ビジネス・オブジェクト定義または ABAP Handler を生成するためには、SAP システムに英語でログオンする必要があります。WebSphere BI Station ログは英語でのみ、使用可能です。
  2. 「Development」タブで、「Inbound Wizard」ボタンをクリックします。
  3. 以下の情報を入力します。
  4. 「Record」をクリックします。
  5. ビジネス・オブジェクトの機能をサポートするトランザクションを、段階ごとにたどっていきます。必要なすべてのフィールドおよび画面を使用してください。終了したら、トランザクションを保管します。
  6. ビジネス・オブジェクトにメタデータとして組み込むコンポーネントを選択します。カーソルをコンポーネントの上に置き、「Select/Deselect sub-tree」ボタンをクリックします (F9)。デフォルトでは、すべてのコンポーネントが選択されます。
  7. 新しい動的オブジェクトまたはソース・コードを生成します。

次に示すサンプル・コードは、生成された 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 トランザクション中に表示されることのある追加画面やポップアップ・ボックスのためにロジックを追加する必要がある場合に有用です。

IDoc Handler および retrieve 動詞

Retrieve 動詞をサポートするオブジェクト固有 IDoc Handler は、/CWLD/IDOC_HANDLER からビジネス・オブジェクト・データを受け取りません。その代わりに、/CWLD/IDOC_HANDLER はオブジェクト固有 IDoc Handler 関数の OBJECT_KEY_IN パラメーターを使用して、IsKey とマークされた最初の属性の値のみを渡します。オブジェクト固有 IDoc Handler は、この属性の値を使用して、ABAP SQL を使用するビジネス・オブジェクトのインスタンスに関するすべての情報を検索したり、適切な IDoc 構造に含まれるそのデータをフォーマットしたりします。

注:
キーが複数のフィールドから構成されている場合、イベント検出機構 (または統合ブローカーが InterChange Server Express の場合はマップ) は、これらのフィールドの値を連結して、トップレベル・ビジネス・オブジェクトの最初のキー属性にします。/CWLD/IDOC_HANDLER は、この連結されたキーをその OBJECT_KEY_IN パラメーターにロードします。オブジェクト固有 IDoc Handler は、OBJECT_KEY_IN パラメーターの値を解析して、複数キー・フィールドにする必要があります。この機能を維持するためには、/CWLD/IDOC_HANDLER を使用する場合に、キーに対して名前と値のペアを指定しないことが重要です。

次に示すコード・フラグメントは、Sales Quote を検索するためのオブジェクト固有 IDoc Handler を示したものです。Sales Quote ビジネス・オブジェクトは、VBAKVBUKVBPOVBAPVBUPVBKDKNOV、および VBPA の表からデータを検索します。これらの表は、IDoc タイプ ZSLSQUOT の階層およびカーディナリティーに従います。このコードでは、以下の処理が実行されます。

  1. グローバル・データを初期化します。
  2. SAP アプリケーション・データベースからビジネス・オブジェクト・データを戻します。
  3. 戻されたデータから IDoc を作成し、そのデータを /CWLD/IDOC_HANDLER に戻します。

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.

Copyright IBM Corp. 2004, 2005