BADI 介绍

      BADI作为SAP的第三代用户出口,他的应用也越来越广泛,但如何找到合适的badi是许多abap程序员的困惑。我这里就介绍一下我个人的应用的经验,供大家参考。 
1、badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中(参见SECE包); 
2、sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。 
3、基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。 
4、se18 查找接口,se19 实现接口就可以实现用户增强。


示例:用LE_SHP_DELIVERY_PROC控制跨月Cancel

METHOD if_ex_le_shp_delivery_proc~change_delivery_header .
  DATA : thismonth(2) TYPE c.
  DATA : wa_likp TYPE LINE OF shp_likp_t.
  DATA : wa_log TYPE LINE OF shp_badi_error_log_t.
  CLEAR: ct_log[],thismonth.
  thismonth = sy-datum+4(2). "----->這一個月的月份
  LOOP AT it_xlikp INTO wa_likp.
    CHECK is_v50agl-warenausg_storno ='X'."--->代表作GI cancel
    IF wa_likp-wadat_ist+4(2) < thismonth.
      wa_log-vbeln = cs_likp-vbeln.
      wa_log-msgty = 'E'. "錯誤訊息
      wa_log-msgid = 'ZDN_ERROR'. "這一個class要自己建
      wa_log-msgno = '001'.
      APPEND wa_log TO ct_log. "Error log寫入
    ENDIF.
  ENDLOOP.
ENDMETHOD.                    "IF_EX_LE_SHP_DELIVERY_PROC~CHANGE_DELIVERY_HEADER

BADI的实现步骤。
A.BADI定义
1.SE18。
2.输入要创建的BADI的名字,点击"Create"。
3.输入BADI的描述性文本,在"Interface"选项卡上输入接口的名字,也可以采用SAP建议的接口的名字。同时,BADI类也会被创建。
例如:对于BADI "ZTEST",SAP会建议"ZIF_EX_TEST"作为接口的名字,"ZCL_EX_TEST"作为类的名字。
4.保存BADI。
5.双击接口的名字,会跳转到Class Builder界面,在这里你可以定义接口的方法。
6.保存并激活接口。

B.在应用程序中调用BADI
1.声明一个BADI接口的参考引用变量。
例如:DATA exit_ref TYPE REF TO zif_ex_test.
2.调用类CL_EXITHANDLER的静态方法GET_INSTANCE,将返回一个请求对象的实例。
例如:
CALL METHOD CL_EXITHANDLER=>GET_INSTANCE
CHANGING instance = exit_ref。
3.现在你可以调用BADI的所有方法了

C.BADI实现
1.SE19。
2.输入BADI实现的名字,点击"Create"。
3.输入BADI定义的名字。
4.输入实现的描述性文本,在"Interface"选项卡上输入实现类的名字。可以采用SAP建议的名字。
例如:"ZIMPTEST",SAP会建议"ZCL_IM_IMPTEST"。
5.保存实现。
6.双击某一方法名会跳转到Class Builder界面,在这里你可以添加代码来重定义接口方法。
7.激活实现。

posted @ 2014-06-01 11:37  小鱼儿游  阅读(1359)  评论(0编辑  收藏  举报