イベント検出機構の実装

サポートするビジネス・プロセス (例えば見積や販売注文) と、使用するイベント検出機構を決定したら、ビジネス・プロセスに対して機構を実装します。

注:
イベント検出機構を実装する場合は、1 つのビジネス・プロセスのためのすべての機能を 1 つの機構でサポートすることをお勧めします。これにより、SAP アプリケーションでの影響を小さくし、イベント検出の管理を容易にすることができます。

以下のセクションでは、コネクターで実装される 4 種類のイベント検出機構の実装プロセスについて説明します。可能な場合には、サンプル・コードとともに例が提供されています。

コード拡張

コード拡張では、ABAP コードの一部をカスタム機能モジュールにカプセル化する必要があります。イベント検出コードは、処理をトランザクションから分離しておくため、機能モジュールとして記述します。トランザクションから使用されるすべての表や変数は、参照によってではなく、値で機能モジュールに渡される必要があります。

イベントを検索する際にビジネス・オブジェクトがロックされる影響を最小限にするために、通常、機能モジュールは更新タスク・モードで実行します。更新タスク・モードのプロセスで既に機能モジュールが呼び出されている場合は、不整合を避けるために、更新タスクは使用しないでください。

トランザクションでの影響を最小限にするため、機能モジュールは別の組み込みプログラム内に配置してください。組み込みプログラムを使用することで、SAP コードではなくカスタム・コードを変更できます。

イベント検出コードには、イベントのオブジェクトを識別するロジックが含まれています。例えば、販売注文トランザクションでは、さまざまなタイプの注文を処理しますが、必要な注文タイプは 1 つだけです。このロジックは、イベント検出コードに記述します。このイベント検出コードを配置するための一般的戦略は、データがデータベースにコミットされる直前に挿入することです。イベント検出コードを含んだ機能モジュールは、通常はビジネス・オブジェクトに対する機能グループの一部として作成します。

イベント検出のためにコード拡張を実装するには、以下の手順を実行します。

次に示すステップでは、コード拡張イベント検出機構を使用して、サンプルの SAP Sales Quote を作成するプロセスを説明します。それに続くコードは、このプロセスの結果です。

  1. SAP Sales Quote トランザクションを調べると、必要な Sales Quote 作成のビジネス処理をサポートするトランザクション VA21 が見つかります。
  2. Sales Quote 番号を、固有キーにするように決定します。Sales Quote 番号は、表/フィールド VBAK-VBELN に保管されます。
    注:
    このイベントは単一の固有キーを使用するため、このコード例では OBJKEY パラメーターを使用してキーの値を渡しています。 複合キーを使用するイベントをコーディングする例に ついては、名前と値のペアとしての複合キーのコーディングを参照してく ださい。
  3. トランザクション VA21 のトランザクション・フローには、文書保管プロセスの一部として、ユーザー出口が含まれています (Form Userexit_save_document)。トランザクションのこのポイントでは、ユーザー出口が実行されると、Quote 番号が入手できます。
  4. ユーザー出口は他のビジネス・プロセスに属しているため、Sales Quote を他の文書のカテゴリーから区別するには、追加のコーディングが必要です。文書カテゴリーを判別するために、VBAK-VBTYP が使用可能です。Sales Quote は、SAP データベースに文書カテゴリー B として保管されます。
  5. ユーザー出口に、組み込みプログラムを指す include ステートメントを追加します。
  6. この時点で、組み込みプログラムと機能モジュールを作成する必要があります。

/CWLD/ADD_TO_QUEUE: 単一キー値の例

次のコード・フラグメントに、/CWLD/ADD_TO_QUEUE イベント・トリガーへの機能呼び出しを示します (単一キー値を使用)。

If VBAK-VBTYP = 'B'.
       C_OBJ_ORDER = 'SAP4_SalesQuote'.
          TMP_OBJKEY = XVBAK-VBELN.
     TMP_EVENT = 'Create'.
 
       CALL FUNCTION '/CWLD/ADD_TO_QUEUE'
             EXPORTING
                   OBJ_NAME                = C_OBJ_ORDER
                   OBJKEY                  = TMP_OBJKEY
                   EVENT                   = TMP_EVENT
                   GENERIC_RECTYPE = ''
             IMPORTING
                   RECTYPE                 = TMP_RECTYPE
             TABLES
                   EVENT_CONTAINER = TMP_EVENT_CONTAINER
             EXCEPTIONS
                   OTHERS                  = 1.
 
 Endif.

/CWLD/ADD_TO_QUEUE_IN_FUTURE: 単一キー値の例

次のコード・フラグメントに、/CWLD/ADD_TO_QUEUE イベント・トリガーへの機能呼び出しを示します (単一キー値)。

DATA: DATE_IN_FUTURE LIKE SY_DATUM.
 
 DATE_IN_FUTURE = VBAK-VDATU.
 
 If VBAK-VBTYP = 'B'.
       C_OBJ_ORDER = 'SAP4_SalesQuote'.
          TMP_OBJKEY = XVBAK-VBELN.
     TMP_EVENT = 'Create'.
 
       CALL FUNCTION '/CWLD/ADD_TO_QUEUE_IN_FUTURE'
             EXPORTING
                   OBJ_NAME               = C_OBJ_ORDER
                   OBJKEY                 = TMP_OBJKEY
                   EVENT                  = TMP_EVENT
                   VALID_DATE             = DATE_IN_FUTURE
             IMPORTING
                   RECTYPE                = TMP_RECTYPE
             TABLES
                   EVENT_CONTAINER        = TMP_EVENT_CONTAINER
             EXCEPTIONS
                   OTHERS                 = 1.
 
 Endif.

名前と値のペアとしての複合キーのコーディング

イベントのキーが単一のキー・フィールドでなく、複数のフィールドから構成されている場合には、各キー属性の名前と、それに対応する値を指定できます。属性の名前を指定するので、属性には、コネクターが値を取り込んだり、検索に使用するために、IsKey としてマーク付けする必要はありません。

名前と値のペアを複数指定すると、コネクターは、アプリケーションから完全なオブジェクトを検索するために、それが作成したビジネス・オブジェクトに複数の属性の値を設定します。名前と値のペアを 1 つだけ指定すると、コネクターは、IsKey としてマークされた最初の属性ではなく、指定した属性の値を設定します。

IDoc Handler は名前と値のペアを使用しないため、/CWLD/IDOC_HANDLER を使用する場合は、名前と値のペアを指定しないことが重要です。 詳細については、IDoc Handler および retrieve 動詞を参照してくださ い。

次に示すステップでは、複合キーで 3 つのフィールドを使用する、サンプルの SAP Sales Quote を作成するプロセスを説明します。それに続くコードは、このプロセスの結果です。

  1. アダプターに付属の構造体 (/CWLD/NAME_VALUE_PAIRS) に基づいて、ローカルの name_value_pairs 内部表を作成します。この構造体には列が 2 つあります。ATTR_NAME および ATTR_VALUE です。
  2. 機能モジュール /CWLD/ADD_TO_QUEUE または /CWLD/ADD_TO_QUEUE_IN_FUTURE を 呼び出す前に、キー属性の名前とそれらの値を内部表に追加するコードを記述します。
  3. 機能モジュール /CWLD/ADD_TO_QUEUE また は /CWLD/ADD_TO_QUEUE_IN_FUTURE を変更します。
  4. 各イベント・キーは、トリガー機能によって自動的にフォーマットされます。フォーマットには、次の構文が使用されます。
    attribute1=value1|Cx|attribute2=value2|Cx|[attributeN=valueN|Cx|]

    は、次のように説明されます。

    属性
    キー属性の名前 (大文字小文字が区別されません)
    キー属性の値 (大文字小文字が区別されます)
    |Cx|
    それぞれの名前と値のペアの終了文字 (名前と値のペアを 1 つしか指定しない場合でも使用します)

コード内で名前と値のペアを指定する順序は、ビジネス・オブジェクト内での属性の順序と一致している必要はありません。ただし、ビジネス・オブジェクト内に存在しない属性を指定すると、イベントは失敗します。

次に示すコード・フラグメントでは、トリガー時に、顧客番号、販売組織、および流通経路を、名前と値のペアとして表 KNVV に指定しています。機能モジュール /CWLD/ADD_TO_QUEUE のコードで、次の 2 行が強調表示されています。

DATA:  name_value_pairs LIKE /cwld/name_value_pairs OCCURS 5 with header line.
 
 MOVE   'CustomerId' TO name_value_pairs-attr_name.
 MOVE   knvv-kunnr TO name_value_pairs-attr_value.
 APPEND name_value_pairs.
 
 MOVE   'SalesOrg' TO name_value_pairs-attr_name.
 MOVE   knvv-vkorg TO name_value_pairs-attr_value.
 APPEND name_value_pairs.
 
 MOVE   'DistributionChannel' TO name_value_pairs-attr_name.
 MOVE   knvv-vtweg TO name_value_pairs-attr_value.
 APPEND name_value_pairs.
 If VBAK-VBTYP = 'B'.
       C_OBJ_ORDER = 'SAP4_SalesQuote'.
          TMP_OBJKEY = XVBAK-VBELN.
     TMP_EVENT = 'Create'.
 
       CALL FUNCTION '/CWLD/ADD_TO_QUEUE'
        EXPORTING
                   OBJ_NAME               = C_OBJ_ORDER
 *                 OBJKEY                 = TMP_OBJKEY
                   EVENT                  = TMP_EVENT
             GENERIC_RECTYPE = ''
             IMPORTING
                   RECTYPE                 = TMP_RECTYPE
             TABLES
                   NAME_VALUE_PAIRS = name_value_pairs
                   EVENT_CONTAINER = TMP_EVENT_CONTAINER
             EXCEPTIONS
                   OTHERS                  = 1.
 
 Endif.

バッチ・プログラム

イベント検出機構としてバッチ・プログラムを実装する場合は、データベース情報を評価する ABAP プログラムを作成する必要があります。ABAP プログラムの実行時に、そのプログラムでの基準が満たされると、イベントが起動されます。

イベント検出のためにバッチ・プログラムを実装するには、以下の手順を実行します。

次に示すステップでは、今日の日付で作成されたすべての Sales Quote について、イベントを検出するバッチ・プログラムを作成するプロセスを説明します。それに続くコードは、このプロセスの結果です。

  1. Create 動詞をサポートすることに決定します。
  2. Quote 番号を、イベントを検索するための固有キーにするように決定します。
  3. 作成日 (VBAK-ERDAT) および文書カテゴリー (VBAK-VBTYP) をチェックする必要があります。

次に示すサンプル・コードでは、SAP sales quote がバッチ・プログラムとしてサポートされます。

REPORT ZSALESORDERBATCH.
 
 tables: vbak.
 
 parameter: d_date like sy-datum default sy-datum.
 
 data: tmp_key like /CWLD/LOG_HEADER-OBJ_KEY,
       tmp_event_container like swcont occurs 0.
 
 " retrieve all sales quotes for today's date
 " sales quotes have vbtyp = B
 select * from vbak where erdat = d_date
                      and vbtyp = 'B'.
 
   tmp_key = vbak-vbeln.
 
   CALL FUNCTION '/CWLD/ADD_TO_QUEUE'
        EXPORTING
             OBJ_NAME        = 'SAP4_SalesQuote'
             OBJKEY          =  tmp_key
             EVENT           = 'Create'
             GENERIC_RECTYPE = ''
        IMPORTING
             RECTYPE         = r_rectype
        TABLES
             EVENT_CONTAINER = tmp_event_container.
 
   write: / vbak-vbeln.
 endselect.

ビジネス・ワークフロー

ビジネス・ワークフローは、論理的に関連するビジネス・オペレーションのセットまたはシーケンスです。ワークフロー内の処理ロジックがイベントを検出します。ビジネス・ワークフロー・イベント検出機構は、オブジェクトおよびそれらに関連付けられた属性、メソッド、およびイベントのディレクトリーを格納する SAP ビジネス・オブジェクト・リポジトリー (BOR) に依拠しています。

イベント検出のためにビジネス・ワークフローを実装するには、以下の手順を実行します。

次に示す SAP Sales Quote の例は、ビジネス・ワークフローを使用してイベント・トリガーを実装するために使用できます。

  1. BOR を検索して、適切な Sales Quote ビジネス・オブジェクトを探します。検索は、簡略説明フィールドと、文字列 '*quot*' を使用して実行します。BUS2031 (Customer Quotes) は、戻されるビジネス・オブジェクトの 1 つです。
  2. BUS2031 をさらに調べることで、キー・フィールドが CustomerQuotation.SalesDocument (VBAK-VBELN) であることがわかります。
  3. BUS2031 のサブタイプは、以下のエントリーを使用して作成します。

    オブジェクト・タイプ -- ZMYQUOTE

    イベント -- SAP4_SalesQuote

    名前 -- SAP4 Sales Quote

    説明 -- SAP 4 Sales Quote Subtype の例

    プログラム -- ZMYSALESQUOTE

    アプリケーション -- V

  4. イベント検出機構は、Event Linkage 表にエントリーを追加することでアクティブ化されます (トランザクション SWE3)。作成イベントは、以下のエントリーを使用してアクティブ化します。

    オブジェクト・タイプ -- ZMYQUOTE

    イベント -- SAP4_SalesQuote

    受信側機能モジュール -- /CWLD/ADD_TO_QUEUE_DUMMY

    受信側タイプ機能モジュール -- /CWLD/ADD_TO_QUEUE_WF

注:
受信側および受信側タイプ機能モジュール (Function Module、FM) は、/CWLD/ADD_TO_QUEUE を指します。DUMMY 機能モジュールは、SAP アプリケーションが両方のフィールドに値を取り込むことを要求する場合があるために使用されています。WF 機能モジュールは、SAP 標準インターフェースを /CWLD/ADD_TO_QUEUE で使用されるものに変換します。

ビジネス・ワークフロー・イベント検出機構が作成され、アクティブ化されました。作成されたすべての SAP Customer Quotes を検出するようにセットアップされています。

変更ポインター

変更ポインターは、変更文書を使用する、より実装の難しいイベント検出機構の 1 つです。アプリケーション・リンク・イネーブリング (ALE) テクノロジーとともに、SAP のビジネス・オブジェクト・リポジトリー (BOR) が使用されます。変更文書は、少なくとも 1 つのデータベース表が割り当てられているビジネス・ドキュメント・オブジェクトを常に参照します。表内のデータ・エレメントが変更文書を必要としているとしてマーク付けされており、表がビジネス・ドキュメント・オブジェクトに割り当てられている場合、データ・エレメントで定義されているフィールドの値が変更されると、変更文書が生成されます。変更は、表 CDHDR および CDPOS にキャプチャーされ、イベント検出のために使用されます。

イベント検出のために変更ポインターを実装するには、以下の手順を実行します。

次に示す SAP Sales Quote の例は、変更ポインターを使用してイベント・トリガーを実装するために使用できます。

  1. Update 動詞をサポートすることに決定します。Sales Quote 作成トランザクションを調査すると、Create 動詞はこの機構全体を通じて検出されないことが明らかになります。
  2. Sales Quote に関してビジネスの検査を実行すると、次の結果が得られます。
  3. この例では、データ・エレメントの評価は行われません。
  4. Sales Quote 番号を、CDHDR-OBJECTID で固有キーにするように決定します。
  5. CDHDR-OBJECTCLAS には、区別する主な基準である値 VERKBELEG が設定されています。Sales Quote のみが選出される必要があります。コードはヘッダー表の TCODE フィールドを検査しますが、VBAK 表で適切な検索が実行される必要があります。

以下のサンプル・コードは、/CWLD/EVENT_FROM_CHANGE_POINTR に追加されます。

when 'VERKBELEG'.
    data: skey    like /cwld/log_header-obj_key,
       s_event like swetypecou-event,
       r_genrectype like swetypecou-rectype,
       r_rectype like swetypecou-rectype,
       t_event_container like  swcont occurs 1 with header line.
 
    " Quick check. Should check document category (VBTYP) in VBAK.
    check header-tcode = 'VA22'.
 
    " Event detection has started
    perform log_create using c_log_normal c_blank
                               c_event_from_change_pointer c_blank.
 
    " Set the primary key
    skey = header-objectid.
 
    " Set the verb
    s_event = c_update_event.
 
    " Log adding the event to the queue
    perform log_update using c_information_log text-i44
                             'SAP4_SalesQuote' s_event skey.
 
       " Event detection has finished.
       perform log_update using c_finished_log c_blank
                                c_blank c_blank c_blank.
 
    call function '/CWLD/ADD_TO_QUEUE'
       exporting
             obj_name                  = 'SAP4_SalesQuote'
             objkey                    = skey
             event                     = s_event
             generic_rectype           = r_genrectype
       importing
             rectype                   = r_rectype
       tables
             event_container           = t_event_container
       exceptions
             others                     = 1.

Copyright IBM Corp. 2004, 2005