上一篇转载了SDN上面的一篇博文。写的非常棒,将event的事情说的很透彻。
这篇就实际谈谈具体是怎么操作的,多说无益,直接上代码。
使用事务代码CRMV_EVENT,创建一个如下的事件功能:
交易类别 BUS2000115 销售
执行时间 30 抬头处理结束
优先级 自己定
对象名称 ORDERADM_H
事件 AFTER_CREATE_WITH_REFERENCE
属性 <*>
功能 Z开头的FUNC
然后func的相关代码如下:
FUNCTION zxxxxxxxxx.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IV_HEADER_GUID) TYPE CRMT_OBJECT_GUID
*" REFERENCE(IV_OBJECT_GUID) TYPE CRMT_OBJECT_GUID
*" REFERENCE(IV_OBJECT_NAME) TYPE CRMT_OBJECT_NAME
*" REFERENCE(IV_EVENT_EXETIME) TYPE CRMT_EVENT_EXETIME
*" REFERENCE(IV_EVENT) TYPE CRMT_EVENT
*" REFERENCE(IV_ATTRIBUT) TYPE CRMT_EVENT
*" REFERENCE(IV_STRVAL_OLD) TYPE ANY
*" REFERENCE(IV_STRVAL_NEW) TYPE ANY
*" REFERENCE(IV_RCODE_STATUS) TYPE SY-SUBRC
*" REFERENCE(IV_STRUC_NAME) TYPE CRMC_EVENT_STRUC-STRUC
*" EXCEPTIONS
*" ERROR_OCCURRED
*"----------------------------------------------------------------------
DATA: lv_ref_kind TYPE crmt_object_kind,
ls_payplan_wrk TYPE crmt_payplan_wrk,
lt_payplan_d_wrk TYPE crmt_payplan_d_wrkt,
ls_payplan_com TYPE crmt_payplan_com,
lt_payplan_d_com TYPE crmt_payplan_d_comt,
ls_pr_copy_ma_key TYPE crmt_pr_copy_ma_key,
ls_it_copy_ma_key TYPE crmt_it_copy_ma_key,
ls_pr_copy_ma TYPE crmc_pr_copy_ma,
ls_it_copy_ma TYPE crmc_it_copy_ma,
ls_input_field_names TYPE crmt_input_field_names,
lt_input_field_names TYPE crmt_input_field_names_tab,
ls_input_fields TYPE crmt_input_field,
lt_input_fields TYPE crmt_input_field_tab,
lv_message_text TYPE crmt_msgtext,
lv_allowed TYPE crmt_boolean,
ls_payplan_d_wrk TYPE crmt_payplan_d_wrk,
ls_payplan_d_com TYPE crmt_payplan_d_com.
DATA: lv_ref_strval_old TYPE REF TO data,
lv_ref_strval_new TYPE REF TO data,
lv_structure_name TYPE crmt_tablename.
FIELD-SYMBOLS: <ls_strval_old> TYPE any,
<ls_strval_new> TYPE any,
<lv_ref_guid> TYPE crmt_object_guid,
<lv_field> TYPE any.
* look if there is something to do
CHECK iv_object_name EQ gc_object_name-orderadm_h OR
iv_object_name EQ gc_object_name-orderadm_i.
* determine name of structure
CALL FUNCTION 'CRM_OBJECT_NAMES_DETERMINE'
EXPORTING
iv_object_name = iv_object_name
IMPORTING
ev_wrk_structure_name = lv_structure_name.
* disable copy function if predeccesor document is template
CALL FUNCTION 'CRM_TSRV_TEMPLATE_CHECK_COPY'
EXPORTING
iv_strval_new = iv_strval_new
iv_structure_name = lv_structure_name
iv_object_name = iv_object_name
IMPORTING
ev_no_copy_allowed = lv_allowed.
CHECK lv_allowed EQ false.
CREATE DATA lv_ref_strval_old TYPE (lv_structure_name).
ASSIGN lv_ref_strval_old->* TO <ls_strval_old>.
<ls_strval_old> = iv_strval_old.
CREATE DATA lv_ref_strval_new TYPE (lv_structure_name).
ASSIGN lv_ref_strval_new->* TO <ls_strval_new>.
<ls_strval_new> = iv_strval_new.
DATA:iu_orderadm_h TYPE crmt_orderadm_h_wrk.
DATA:is_ref_orderadm_h TYPE crmt_orderadm_h_wrk.
is_ref_orderadm_h = iv_strval_old.
iu_orderadm_h = iv_strval_new.
DATA:lt_orderadm_i TYPE crmt_orderadm_i_comt.
DATA:ls_orderadm_i TYPE crmt_orderadm_i_com.
DATA: lt_schedlin_i TYPE crmt_schedlin_i_comt,
is_schedlin_i TYPE crmt_schedlin_i_com,
is_schedlins TYPE crmt_schedlin_extd.
DATA:lt_product_i TYPE crmt_product_i_comt.
DATA:ls_product_i TYPE crmt_product_i_com.
DATA:ls_items_maint TYPE crmt_guid_handle.
DATA:lt_items_maint TYPE crmt_guid_handle_tab.
DATA:in_exception TYPE crmt_exception_t.
DATA: it_objects_to_save TYPE crmt_object_guid_tab.
DATA: is_objects_to_save TYPE crmt_object_guid.
DATA:et_saved_objects TYPE crmt_return_objects.
DATA:et_exception TYPE crmt_exception_t.
DATA:et_objects_not_saved TYPE crmt_object_guid_tab.
DATA:return LIKE bapiret2.
DATA:item_guid TYPE crmt_object_guid.
DATA:lt_input_fields TYPE crmt_input_field_tab.
DATA:ls_input_fields TYPE crmt_input_field .
DATA:ls_input_field_names TYPE crmt_input_field_names.
DEFINE add_field.
clear ls_input_field_names.
ls_input_field_names-fieldname = &1.
insert ls_input_field_names into table ls_input_fields-field_names.
END-OF-DEFINITION.
DATA: it_header_guid TYPE crmt_object_guid_tab,
et_orderadm_h TYPE crmt_orderadm_h_wrkt,
et_orderadm_i TYPE crmt_orderadm_i_wrkt,
es_orderadm_i TYPE crmt_orderadm_i_wrk,
ls_orderadm_i1 TYPE crmt_orderadm_i_com,
et_product_i TYPE crmt_product_i_wrkt,
et_schedlin TYPE crmt_schedlin_wrkt,
et_schedlin_i TYPE crmt_schedlin_i_wrkt.
CLEAR:ls_orderadm_i.
REFRESH:lt_orderadm_i,lt_input_fields.
ls_orderadm_i-handle = '0000000001'.
ls_orderadm_i-mode = 'A'."创建
ls_orderadm_i-header = iu_orderadm_h-guid.
ls_orderadm_i-number_int = '0000000010'.
ls_orderadm_i-itm_type = 'ZXXX'.
ls_orderadm_i-ordered_prod = 'ZYYY'.
ls_orderadm_i-Z自定义字段 = '123abc'.
INSERT ls_orderadm_i INTO TABLE lt_orderadm_i.
CLEAR:ls_input_fields,ls_input_field_names.
ls_input_fields-ref_handle = '0000000001'.
ls_input_fields-ref_kind = 'B'."管理项目
ls_input_fields-objectname = 'ORDERADM_I'.
add_field 'REF_KIND'.
add_field 'ORDERED_PROD'.
add_field 'ITM_TYPE'.
add_field 'MODE'.
add_field 'NUMBER_INT'.
add_field 'HEADER'.
add_field 'Z自定义字段'.
INSERT ls_input_fields INTO TABLE lt_input_fields.
* ITEMS_MAINT
REFRESH lt_items_maint.
CLEAR ls_items_maint.
ls_items_maint-handle = ls_orderadm_i-handle.
COLLECT ls_items_maint INTO lt_items_maint.
*创建item
CALL FUNCTION 'CRM_ORDER_I_MAINTAIN_MULTI_OW'
EXPORTING
iv_header_guid = iu_orderadm_h-guid
it_items_maint = lt_items_maint
CHANGING
ct_orderadm_i = lt_orderadm_i
ct_input_fields = lt_input_fields
EXCEPTIONS
error_occurred = 1
OTHERS = 2.
*修改数量QUANTITY
CLEAR ls_orderadm_i.
READ TABLE lt_orderadm_i INTO ls_orderadm_i INDEX 1.
item_guid = ls_orderadm_i-guid.
REFRESH lt_input_fields.
REFRESH lt_schedlin_i.
CLEAR: is_schedlin_i, is_schedlins.
is_schedlins-quantity = 12345.
is_schedlins-handle = 0.
is_schedlins-logical_key = '00000000000000000000000000000000'.
INSERT is_schedlins INTO TABLE is_schedlin_i-schedlines.
is_schedlin_i-ref_guid = item_guid.
is_schedlin_i-mode = 'A'."创建
CLEAR:ls_input_fields.
REFRESH lt_input_fields.
ls_input_fields-ref_guid = item_guid.
add_field 'QUANTITY'.
ls_input_fields-ref_kind = 'B'.
ls_input_fields-objectname = 'SCHEDLIN'.
ls_input_fields-logical_key = '00000000000000000000000000000000'.
INSERT ls_input_fields INTO TABLE lt_input_fields.
CLEAR:ls_input_fields.
CALL FUNCTION 'CRM_SCHEDLIN_I_MAINTAIN_OW'
CHANGING
cs_schedlin_i_com = is_schedlin_i
ct_input_fields = lt_input_fields
EXCEPTIONS
schedlin_i_change_error = 1
schedlin_i_create_error = 2
error_occurred = 3
OTHERS = 4.
ENDFUNCTION.