如何从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.

5、补充7.00版后badi的几个处理变化

  • 以前的CL_EXITHANDLER=>GET_PROG_AND_DYNP_FOR_SUBSCR被CL_ENH_BADI_RUNTIME_FUNCTIONS=>GET_PROG_AND_DYNP_FOR_SUBSCR 代替.
  • 以前的 PUT_DATA_TO_SCREEN和GET_DATA_FROM_SCREEN不在需要。用户可以创建自己的数据传输函数,通过CALL BADI来调用.
  •   用户也不需要调用CL_EXITHANDLER=>SET_INSTANCE_FOR_SUBSCREENS 和 CL_EXITHANDLER=>GET_INSTANCE_FOR_SUBSCREENS函数. These methods are now unnecessary as they only place the BAdI reference in a temporary storage.
    SET_INSTANCE_FOR_SUBSCREENS is no longer necessary.
    GET_INSTANCE_FOR_SUBSCREENS can, if necessary, be replaced by GET BADI.

相关连接
http://blog.csdn.net/CompassButton/archive/2006/09/16/1230344.aspx
http://blog.csdn.net/CompassButton/archive/2006/09/16/1230614.aspx
http://blog.csdn.net/compassbutton/archive/2006/08/07/1032686.aspx
http://blog.csdn.net/compassbutton/archive/2006/08/07/1032510.aspx

<think>好的,我现在需要处理用户关于SAP BADI的查询。用户想了解BADI的示例及使用说明,并且引用了四篇相关的博客文章。首先,我需要回顾BADI的基本概念,确保自己理解正确。BADISAP的第三代增强技术,基于面向对象的设计,允许用户通过实现预定义的接口来增强标准程序的功能。 接下来,用户提供的引用中有提到BADI的操作步骤、Filter的使用、三代增强的区别,以及具体的业务逻辑示例,比如在MM01事务中自动填充税分类。我需要整合这些信息,确保回答覆盖基本概念、使用步骤、Filter的应用以及实际示例。 用户要求回答结构清晰,逐步解决问题,所以需要分步骤说明。首先,BADI的基本概念,然后创建和实现的步骤,接着是Filter的作用,最后结合引用中的例子说明应用场景。需要注意的是,引用中的示例涉及不同的BADI名称和事务码,比如BADI_SCREEN_LOGIC_RT和BADI_MATERIAL_OD,需要正确关联到对应的操作步骤。 同时,用户的问题可能涉及到如何查找合适的BADI,所以需要提到如何通过SPRO或SE24查找BADI,并检查是否有可用的增强点。另外,代码示例部分需要参考引用中的Python示例结构,但这里应该是ABAP代码,所以可能需要提供一个简单的BADI实现代码片段,比如METHOD IF_EX_BADI_MATERIAL_OD~CHECK_DATA. 需要确保所有技术术语准确,并正确引用提供的参考文献。例如,在解释Filter时,引用[2]提到使用Filter来区分不同的场景,所以在回答中要注明引用来源。同样,在业务逻辑示例中,引用[4]中的MM01事务和税分类默认值需要正确引用。 最后,生成的相关问题需要围绕BADI的扩展,比如性能优化、与其它增强技术的对比、常见错误处理等,确保问题覆盖用户可能感兴趣的后续内容。</think>### SAP BADI 示例及使用说明 #### 1. **BADI 基本概念** BADI(Business Add-In)是 SAP 的第三代增强技术,基于面向对象的设计,允许开发者在标准程序中插入自定义逻辑,而无需修改 SAP 标准代码[^3]。其核心是通过预定义的接口(Interface)实现增强,支持多实现(Multiple Implementations)和过滤器(Filter)功能[^2]。 --- #### 2. **BADI 使用步骤** **步骤 1:查找 BADI** - 通过事务码 `SE18` 或 `SE24` 输入 BADI 名称(如 `BADI_MATERIAL_OD`)查找增强点[^4]。 - 在 SPRO(SAP 项目配置)中,通过业务场景路径查找相关 BADI。 **步骤 2:创建 BADI 实现** 1. 事务码 `SE19` 创建新实现,输入 BADI 名称(如 `BADI_SCREEN_LOGIC_RT`)[^1]。 2. 定义实现类,并实现接口中的方法。例如: ```abap METHOD IF_EX_BADI_MATERIAL_OD~CHECK_DATA. " 自定义逻辑:自动填充税分类为'0' IF sy-tcode = 'MM01' AND iv_view = 'SALES'. cs_data-tax_class = '0'. ENDIF. ENDMETHOD. ``` **步骤 3:激活并测试** - 激活实现后,在对应事务码(如 `MM01`)中测试增强效果[^4]。 --- #### 3. **Filter 的使用** BADI 的过滤器(Filter)用于区分不同业务场景。例如: - 在定义 BADI 时添加过滤器字段(如 `W_RETAILSYSTEM_IDENT`),实现类需在过滤器中指定特定值(如零售系统标识),以控制增强逻辑的触发条件。 --- #### 4. **BADI 应用示例** **场景:物料创建时自动填充税分类** 1. **BADI 名称**:`BADI_MATERIAL_OD`。 2. **方法实现**:在 `CHECK_DATA` 方法中检查事务码和视图类型,强制设置 `tax_class` 字段为默认值 `0`。 3. **效果**:用户通过 `MM01` 创建物料时,销售视图的“税分类”字段自动填充。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值