在确定了要支持的业务流程(例如,销售报价或销售订单)并确定了首选事件检测机制之后,为您的业务流程实现该机制。
下列各节描述由连接器实现的四种事件检测机制的实现过程。在适用的任何时候,均将提供示例以及样本代码。
代码增强要求将一部分 ABAP 代码包括在定制功能模块中。事件检测代码将作为功能模块编写,以确保处理与事务保持分离。从事务中使用的任何表或变量都需要按值而不是按引用传递至功能模块。
要在检索事件时使锁定业务对象的影响最小,功能模块通常以更新任务方式执行。要避免不一致,当在处于更新任务方式下的进程内已调用功能模块时,不要使用更新任务。
要使事务中的影响最小,将功能模块放置在另一个包含程序内。使用包含程序将允许您对定制代码而不是 SAP 代码进行更改。
事件检测代码包含标识事件对象的逻辑。例如,销售订单事务处理许多类型的订单,但只有一种订单类型是必需的。此逻辑在事件检测代码中。放置此事件检测代码的一般策略是恰好在将数据提交至数据库之前插入它。包含事件检测代码的功能模块通常将作为业务对象功能组的一部分创建。
要实现代码增强以进行事件检测:
如果要实现将来的事件功能,除了为将来的事件添加事件检测代码以外,还要与 Basis 管理员联系以安排适配器提供的批处理程序 /CWLD/SUBMIT_IN_FUTURE 以便每天运行一次。
下列步骤描述使用代码增强事件检测机制来创建示例 SAP 销售报价的过程。步骤后面的代码是此过程的结果。
以下代码片段举例说明对 /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 事件触发器(单个键值)的函数调用。
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 以便连接器填充它和用于检索。
如果您指定了多个名称-值对,则连接器在它创建的业务对象中设置多个属性的值来从应用程序中检索整个对象。如果您指定单个名称-值对,则连接器设置除了标记为 IsKey 的第一个属性之外的指定属性的值。
因为 IDoc 处理程序不使用名称-值对,所以,在使用 /CWLD/IDOC_HANDLER 时不要指定名称-值对是很重要的。有关更多信息,请参阅IDoc 处理程序和检索查询描述。
下列步骤描述创建示例 SAP 销售报价的过程,该示例 SAP 销售报价在它的组合键中使用三个字段。步骤后面的代码是此过程的结果。
attribute1=value1|Cx|attribute2=value2|Cx|[attributeN=valueN|Cx|]
其中:
您在代码中指定名称-值对的顺序不需要与业务对象中属性的顺序相匹配。但是,如果您指定业务对象中不存在的属性,则事件将失败。
以下代码段在触发时将 KNVV 表中的客户号、销售组织和分销渠道指定为名称-值对。在功能模块 /CWLD/ADD_TO_QUEUE 的代码中突出显示了下面两行:
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:单个键值示例。
以下步骤描述创建批处理程序的过程,该批处理程序检测当天创建的所有销售报价的事件。步骤后面的代码是此过程的结果。
以下样本代码支持 SAP 销售报价作为批处理程序:
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 销售报价的以下示例可以用来实现使用业务工作流的事件触发器:
对象类型 - ZMYQUOTE
事件 - SAP4_SalesQuote
名称 -SAP4 销售报价
描述 - SAP 4 销售报价子类型的示例
程序 - ZMYSALESQUOTE
应用程序 - V
对象类型 - ZMYQUOTE
事件 - SAP4_SalesQuote
接收器 FM - /CWLD/ADD_TO_QUEUE_DUMMY
接收器类型 FM - /CWLD/ADD_TO_QUEUE_WF
业务工作流事件检测机制已创建且是活动的。已设置它来检测已创建的所有 SAP 客户报价。
更改指针使用更改文档,它是要实现的其中一种更复杂的事件检测机制。SAP 的业务对象资源库(BOR)也使用“应用程序链接启用”(ALE)技术。更改文档始终引用至少为它指定了一个数据库表的业务文档对象。如果表中的数据元素被标记为需要更改文档并且将该表指定给了业务文档对象,则由该数据元素定义的字段的值发生更改时就会生成更改文档。这些更改被捕获在表 CDHDR 和 CDPOS 中并用于事件检测。
要实现更改指针以进行事件检测:
如果上述这些问题的答案都为“是”,则说明事务使用了更改文档。
SAP 销售报价的以下示例可以用来实现使用更改指针的事件触发器:
已将以下样本代码添加至 /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.