SAP CRM OneOrder Badi 汇总(持续更新)

  1. CRM_BADI_RF_Q1O_SEARCH
    增强OneOrder标准搜索界面,增加搜索条件自定义字段,自定义搜索逻辑,搜索结果内容等。
    过滤器:搜索对象 例如OBJ_IL = BTQSLSORD (销售订单)
    代码示例: 在搜索销售订单界面增加“创建日期”的搜索
    这里写图片描述

    METHOD if_crm_rf_q1o_search~search.
    
    DATA(lt_multivalues) = it_multivalues.
    
    READ TABLE lt_multivalues INTO DATA(lw_multivalues) WITH KEY fieldname = 'ZZCREATE_DATE_S'.
    IF sy-subrc EQ 0.
      DELETE TABLE lt_multivalues FROM lw_multivalues.
      lw_multivalues-fieldname = 'CREATED_AT_RANGE'.
      INSERT lw_multivalues INTO TABLE lt_multivalues.
    ENDIF.
    
    CALL FUNCTION 'CRM_BSP_OIC_1O_SEARCH_FROM_RF'
      EXPORTING
        it_search_tab             = it_search_tab
        iv_number                 = iv_number
        iv_archive                = iv_archive
        it_multivalues            = lt_multivalues
        iv_items                  = iv_item
        iv_select_for_headerlevel = iv_select_for_headerlevel
        iv_call_authority_badi    = iv_call_authority_badi
        iv_select_for_itemlevel   = iv_select_for_itemlevel
        iv_obj_il                 = iv_obj_il
        iv_report_area            = iv_report_area
      IMPORTING
        et_guidlist               = et_guidlist
        et_return                 = et_return
      EXCEPTIONS
        date_not_correct          = 1
        no_card_type              = 2
        no_card_no                = 3
        no_program_id             = 4
        OTHERS                    = 5.
    
    ENDMETHOD.

    注意,该Badi中只包含了搜索的具体逻辑。自定义字段需要通过AET实现,而搜索选项和样式则可以去对应的组件进行修改。

  2. CRM_ORDER_FIELDCHECK
    修改订单抬头、行项目中的字段是否可编辑。当我们需要修改系统标准逻辑时,可以采用这个Badi。
    过滤器:无
    代码示例:使标准订单行项目上的“批次号”可编辑(在ERP不启用批次管理的情况下)
    这里写图片描述

    METHOD if_ex_crm_order_fieldcheck~fieldcheck.
    
    FIELD-SYMBOLS <field_batchid> LIKE LINE OF ct_input_field_names.
    
    IF iv_object_name = 'PRODUCT_I' AND is_fieldcheck_com-ref_kind = 'B'.
      LOOP AT ct_input_field_names ASSIGNING <field_batchid>.
        IF <field_batchid>-fieldname = 'BATCH_ID'.
          <field_batchid>-changeable = ''.
        ENDIF.
      ENDLOOP.
    ENDIF.
    
    ENDMETHOD.

    批次号可以成功同步到ERP,该功能可参考Note: 2472483

  3. CRM_ORDER_AUTH_CHECK
    Order权限检查。
    过滤器:无
    代码示例:基于某些特定逻辑,让用户无法编辑(删除)该订单,并抛出消息。

    METHOD if_ex_crm_order_auth_check~crm_order_add_auth_check.
    CHECK iv_process_type = 'ZA15' AND iv_header_guid IS NOT INITIAL  AND ( IV_MODE = 'B' or IV_MODE = 'D' ).
    
      CALL FUNCTION 'CRM_MESSAGE_COLLECT'
        EXPORTING
          iv_ref_object  = iv_header_guid
          iv_ref_kind    = 'A'
          iv_caller_name = 'ORDERADM_H'
          iv_msgno       = '043'
          iv_msgid       = 'ZSECCO_CRM'
          iv_msgty       = 'E'.
      RAISE no_authority.
    ENDMETHOD.
  4. ORDER_SAVE
    Order中最常用的Badi之一,但是很多人却用得不好。
    过滤器:无
    示例代码:无

    -该Badi中有三个Method,起到不同的作用,并不是可以随便乱用的。按调用顺序应该为:
    CHECK_BEFORE_SAVE 用于订单的保存校验,可以在该方法中抛出消息并阻止保存
    PREPARE 用于处理一些在订单commit之前的一些额外逻辑,例如通过order maintain修改订单本身的一些内容,注意,该方法无法阻止订单保存。
    CHANGE_BEFORE_UPDATE 用于处理一些与订单本身没有太大关联的逻辑,例如发送邮件,触发中间件,更新自建表等。
    -该Badi为多次调用的Badi类型,这代表所有的implementation都会被调用到,但是他们被调用的顺序,是无法预知的。因此每一个实施中的内容都要相对独立,不能有所牵连。
    -由于Order Save本身是在函数CRM_ORDER_SAVE中被调用到,因此我们应该极力避免在该Badi中使用BOL,或者其他Commit,锁对象等,否则可能会造成单据的未知错误。
    -作为Order中最关键的Badi,我们应尽量考虑到程序执行的效率问题,尽可能的将类似需求放置在一个implementation中,尽量避免直接使用CRM_ORDER_READ函数,而是去针对不同的对象调用对应的OW函数。尽量约束各种条件等。

  5. CRM_COND_COM_BADI
    Condition中增加通讯结构与数据。例如通过实施该Badi,向IPC Java中传入更多的自定义参数。

发布了19 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/LoveSolar/article/details/71724116