最近的开发过程中,关于事件增强总结了一些看法,和大家分享下。
event是只有具体定了一定条件,才会在满足这个条件的时候触发那个相应的func。也就是说,如果你不配,是肯定不会触发的。系统标准的func基本都是_EC结尾的,这些func的逻辑很清晰,如果想改,可以直接复制。最主要的是它的那些传入传出参数要一致,这样才好代替。另外,每个标准的func都属于一个函数组,你可以看看其他相关函数是干嘛的,可以举一反三。
复制控制简单的做还是很容易的,在spro配好相关的规则,以这个规则做个badi增强就好了。不过复制控制有个局限,能复制的都是相同类型的数据,比如抬头到抬头,相同类型的行项目到行项目。那么如果类型不同呢,比如,行项目是a类型,想复制订单后行项目变为b类型,这个就需要走event的参考创建事件了,如我上文举的那个例子。
关于这个现在再举个例子,我想要传递一个日期,从订单a传到订单b。a和b是两个不同的订单类型,现在想把日期数据传过去,刚好日期的类型也是不一样的。那么,用复制控制就蛮难搞的,除非在a这个订单把不一样的那个日期类型也创建一个,然后前台做个增强让它不显示。而且,这个日期还必须有值,否则也走不了程序控制。
下面贴一段假如要使用日期复制控制的代码。
METHOD if_ex_crm_copy_badi~dates.
*constants
INCLUDE crm_appointment_types_con.
INCLUDE crm_object_kinds_con.
INCLUDE crm_object_names_con.
*data
DATA: ls_input_field_names TYPE crmt_input_field_names,
ls_item_type TYPE crmc_item_type,
ls_profile TYPE crmt_dates_prf_dyn,
ls_timeruna TYPE timeruna,
lv_rule_id TYPE timeruleid,
lv_copy_rule TYPE crmt_boolean.
FIELD-SYMBOLS: <lf_input_fields> TYPE crmt_input_field.
LOOP AT ct_input_fields ASSIGNING <lf_input_fields>.
ls_input_field_names-fieldname = 'TIMESTAMP_FROM'.
INSERT ls_input_field_names
INTO TABLE <lf_input_fields>-field_names.
ls_input_field_names-fieldname = 'TIMESTAMP_TO'.
INSERT ls_input_field_names
INTO TABLE <lf_input_fields>-field_names.
ls_input_field_names-fieldname = 'TIMEZONE_FROM'.
INSERT ls_input_field_names
INTO TABLE <lf_input_fields>-field_names.
ls_input_field_names-fieldname = 'TIMEZONE_TO'.
INSERT ls_input_field_names
INTO TABLE <lf_input_fields>-field_names.
ls_input_field_names-fieldname = 'DURATION'.
INSERT ls_input_field_names
INTO TABLE <lf_input_fields>-field_names.
ls_input_field_names-fieldname = 'TIME_UNIT'.
INSERT ls_input_field_names
INTO TABLE <lf_input_fields>-field_names.
ENDLOOP.
ENDMETHOD.
如果不想这样做,也可以用event。如上文那样建立一个event,可以参考标准的func:CRM_DATES_COPY_EC。
再一个写法就是放到order_save里面写了。比如建立一个func,嵌到这个badi里面。
FUNCTION zxxxxxx.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IV_HEADER_GUID) TYPE CRMT_OBJECT_GUID
*" REFERENCE(IV_APPT_TYPE) TYPE CRMT_APPTYPE
*" REFERENCE(IV_DATE) TYPE DATS
*" REFERENCE(IV_TIME) TYPE TIMS
*" REFERENCE(IV_CRMT_MODE) TYPE CRMT_MODE
*" EXPORTING
*" REFERENCE(EV_FLAG) TYPE CHAR1
*"----------------------------------------------------------------------
DATA: lt_appointment TYPE crmt_appointment_wrkt,
ls_appointment TYPE crmt_appointment_wrk,
ls_appointment_com TYPE crmt_appointment_com,
lt_header_guid TYPE crmt_object_guid_tab,
ls_input_fields TYPE crmt_input_field,
ls_input_field_names TYPE crmt_input_field_names,
lt_input_fields TYPE crmt_input_field_tab.
DATA: lv_header_guid TYPE crmt_object_guid,
lv_date TYPE d,
lv_time TYPE t,
lv_timestamp TYPE timestamp,
lv_appt_type TYPE crmt_apptype,
lv_crmt_mode TYPE crmt_mode.
**********************************************************************
lv_header_guid = iv_header_guid.
lv_appt_type = iv_appt_type.
lv_date = iv_date.
lv_time = iv_time.
lv_crmt_mode = iv_crmt_mode.
CONVERT DATE lv_date TIME lv_time "sy-uzeit
INTO TIME STAMP lv_timestamp TIME ZONE sy-zonlo.
**********************************************************************
INSERT lv_header_guid INTO TABLE lt_header_guid.
CALL FUNCTION 'CRM_ORDER_READ'
EXPORTING
it_header_guid = lt_header_guid
iv_no_auth_check = 'X'
IMPORTING
et_appointment = lt_appointment
EXCEPTIONS
document_not_found = 1
error_occurred = 2
document_locked = 3
no_change_authority = 4
no_display_authority = 5
no_change_allowed = 6
OTHERS = 7.
IF sy-subrc <> 0.
EXIT.
ENDIF.
READ TABLE lt_appointment INTO ls_appointment WITH KEY appt_type = lv_appt_type.
IF sy-subrc = 0.
MOVE-CORRESPONDING ls_appointment TO ls_appointment_com.
ls_appointment_com-mode = 'B'.
ELSE.
ls_appointment_com-mode = 'A'.
ENDIF.
IF lv_crmt_mode = 'D'.
ls_appointment_com-mode = 'D'.
ENDIF.
ls_appointment_com-ref_guid = lv_header_guid.
ls_appointment_com-ref_kind = 'A'.
ls_appointment_com-timezone_from = sy-zonlo.
ls_appointment_com-appt_type = lv_appt_type.
ls_appointment_com-timestamp_from = lv_timestamp.
CLEAR ls_input_fields.
ls_input_fields-ref_guid = lv_header_guid.
ls_input_fields-ref_kind = 'A'.
ls_input_fields-objectname = 'APPOINTMENT'.
ls_input_fields-logical_key = lv_appt_type.
CLEAR: ls_input_field_names.
ls_input_field_names-fieldname = 'REF_KIND'.
INSERT ls_input_field_names INTO TABLE ls_input_fields-field_names.
CLEAR: ls_input_field_names.
ls_input_field_names-fieldname = 'TIMESTAMP_FROM'.
INSERT ls_input_field_names INTO TABLE ls_input_fields-field_names.
CLEAR: ls_input_field_names.
ls_input_field_names-fieldname = 'TIMEZONE_FROM'.
INSERT ls_input_field_names INTO TABLE ls_input_fields-field_names.
CLEAR: ls_input_field_names.
ls_input_field_names-fieldname = 'APPT_TYPE'.
INSERT ls_input_field_names INTO TABLE ls_input_fields-field_names.
INSERT ls_input_fields INTO TABLE lt_input_fields.
CALL FUNCTION 'CRM_APPT_MAINTAIN_SINGLE_OW'
EXPORTING
is_appointment_com = ls_appointment_com
CHANGING
ct_input_fields = lt_input_fields
EXCEPTIONS
precondition_violation = 1
invariant_violation = 2
OTHERS = 3.
IF sy-subrc = 0.
ev_flag = 'X'.
ENDIF.
ENDFUNCTION.