CRM事件增强补遗

最近的开发过程中,关于事件增强总结了一些看法,和大家分享下。

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.





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值