サポートするビジネス・プロセス (例えば見積や販売注文) と、使用するイベント検出機構を決定したら、ビジネス・プロセスに対して機構を実装します。
以下のセクションでは、Connector for mySAP.com で実装される 4 種類のイベント検出機構の実装プロセスについて説明します。可能な場合には、サンプル・コードとともに例が提供されています。
コード拡張では、ABAP コードの一部をカスタム機能モジュールにカプセル化する必要があります。イベント検出コードは、処理をトランザクションから分離しておくため、機能モジュールとして記述します。トランザクションから使用されるすべての表や変数は、参照によってではなく、値で機能モジュールに渡される必要があります。
イベントを検索する際にビジネス・オブジェクトがロックされる影響を最小限にするために、通常、機能モジュールは更新タスク・モードで実行します。更新タスク・モードのプロセスで既に機能モジュールが呼び出されている場合は、不整合を避けるために、更新タスクは使用しないでください。
トランザクションでの影響を最小限にするため、機能モジュールは別の組み込みプログラム内に配置してください。組み込みプログラムを使用することで、SAP コードではなくカスタム・コードを変更できます。
イベント検出コードには、イベントのオブジェクトを識別するロジックが含まれています。例えば、販売注文トランザクションでは、さまざまなタイプの注文を処理しますが、必要な注文タイプは 1 つだけです。このロジックは、イベント検出コードに記述します。このイベント検出コードを配置するための一般的戦略は、データがデータベースにコミットされる直前に挿入することです。イベント検出コードを含んだ機能モジュールは、通常はビジネス・オブジェクトに対する機能グループの一部として作成します。
イベント検出のためにコード拡張を実装するには、以下の手順を実行します。
将来のイベントに対するイベント検出コードを追加するほかに、将来のイベントに関する機能を実装する場合には、BASIS 管理者に連絡して、アダプター提供のバッチ・プログラム /CWLD/SUBMIT_IN_FUTURE を毎日 1 回実行するようにスケジュールしてください。
次に示すステップでは、コード拡張イベント検出機構を使用して、サンプルの SAP Sales Quote を作成するプロセスを説明します。それに続くコードは、このプロセスの結果です。
次のコード・フラグメントに、/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 イベント・トリガーへの機能呼び出しを示します (単一キー値)。
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 を作成するプロセスを説明します。それに続くコードは、このプロセスの結果です。
attribute1=value1|Cx|attribute2=value2|Cx|[attributeN=valueN|Cx|]
は、次のように説明されます。
コード内で名前と値のペアを指定する順序は、ビジネス・オブジェクト内での属性の順序と一致している必要はありません。ただし、ビジネス・オブジェクト内に存在しない属性を指定すると、イベントは失敗します。
次に示すコード・フラグメントでは、トリガー時に、顧客番号、販売組織、および流通経路を、名前と値のペアとして表 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 プログラムの実行時に、そのプログラムでの基準が満たされると、イベントが起動されます。
イベント検出のためにバッチ・プログラムを実装するには、以下の手順を実行します。
将来のイベントに関する機能を実装するサンプル・コードについては、/CWLD/ADD_TO_QUEUE_IN_FUTURE: 単一キー値の例を参照してください。
次に示すステップでは、今日の日付で作成されたすべての Sales Quote について、イベントを検出するバッチ・プログラムを作成するプロセスを説明します。それに続くコードは、このプロセスの結果です。
次に示すサンプル・コードでは、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 の例は、ビジネス・ワークフローを使用してイベント・トリガーを実装するために使用できます。
オブジェクト・タイプ -- ZMYQUOTE
イベント -- SAP4_SalesQuote
名前 -- SAP4 Sales Quote
説明 -- SAP 4 Sales Quote Subtype の例
プログラム -- ZMYSALESQUOTE
アプリケーション -- V
オブジェクト・タイプ -- ZMYQUOTE
イベント -- SAP4_SalesQuote
受信側機能モジュール -- /CWLD/ADD_TO_QUEUE_DUMMY
受信側タイプ機能モジュール -- /CWLD/ADD_TO_QUEUE_WF
ビジネス・ワークフロー・イベント検出機構が作成され、アクティブ化されました。作成されたすべての SAP Customer Quotes を検出するようにセットアップされています。
変更ポインターは、変更文書を使用する、より実装の難しいイベント検出機構の 1 つです。アプリケーション・リンク・イネーブリング (ALE) テクノロジーとともに、SAP のビジネス・オブジェクト・リポジトリー (BOR) が使用されます。変更文書は、少なくとも 1 つのデータベース表が割り当てられているビジネス・ドキュメント・オブジェクトを常に参照します。表内のデータ・エレメントが変更文書を必要としているとしてマーク付けされており、表がビジネス・ドキュメント・オブジェクトに割り当てられている場合、データ・エレメントで定義されているフィールドの値が変更されると、変更文書が生成されます。変更は、表 CDHDR および CDPOS にキャプチャーされ、イベント検出のために使用されます。
イベント検出のために変更ポインターを実装するには、以下の手順を実行します。
これらの質問で答えが 1 つでも Yes の場合は、トランザクションで変更文書が使用されています。
次に示す SAP Sales Quote の例は、変更ポインターを使用してイベント・トリガーを実装するために使用できます。
以下のサンプル・コードは、/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.