2010年(14)
分类: 项目管理
2010-09-07 14:34:44
SAP预定义了一些Interface,客户可以自己定义实现Interface的Class进行客户化,在标准程序中会使用调用客户自定义Class的Instance,在获取Instance的过程使用了工厂模式,因此获取过程对用户是未知的。不过BADI也有一些局限性,就是有哪些Interface是固定死的,有的时候会发现需要Mix客户化代码的时候找不到Interface,什么时候SAP的OO里面直接支持AOP就好了。
如何从SAP中查找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
TCODE:
SE18
SE19
BADI的实现步骤。
例如:DATA exit_ref TYPE REF TO zif_ex_test. |
chinaunix网友2010-09-09 16:11:49
Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com