1. 背景
在文章《SAP BAdI深度解读》中,我介绍了SAP BAdI的概念和使用方法。在本篇博客中,我将介绍下BAdI中Filter的使用方式。
2. 为什么要使用filter
使用筛选器Filter原因在于,我们需要一种在不同的BAdI实现之间进行选择的方法, 以提高BAdI的调用效率。
例如: 针对特定的场景A,我们仅希望BAdI的实现A调用,在场景B,我们仅希望BAdI的实现B调用。
3. 示例
3.1 创建Filter
右键BAdI name上右键,选择create Filter。
给定BAdI Filter的名字,这个名字会是BAdI实例化时需要输入的参数。在此例子中,我们定义一个IV_SCENARIO_ID的filter,用于区分不同的使用场景。
在定义filter时,我们可以对filter的值定义一些校验逻辑。在下图中,我们可以看到,有3种校验方式:
- No Check : 无校验
- Automatically by dictionary : 通过DDIC domain值进行校验(推荐)
- By separate program: 通过程序校验
在此示例中,为了简化的目的,我们选择No Check。
创建BAdI的interface,并定一个一个ADJUST( )方法。
激活并保存interface和BAdI definition。至此,filter的创建步骤结束。
此外,我们还可以限制一下所定义的filter数量,通过勾选limited filter use,可以限定在BAdI定义中最多只能定义一个筛选器。
3.2 使用Filter
首先对于场景A, 创建对应的BAdI实现A。
点击filter value,并选择创建combination,然后双击value1, 在弹出窗口中给定此implementation对应的filter值。
例如,此实现对应场景A。
保存并激活此实现。与此同时,在BAdI的实现类中,实现BAdI对应interface的方法。
相同的步骤,为场景B,创建implementation B。
这样,我们就实现了对于不同filter值的两个BAdI实现。
3.3 测试Filter
让我们使用下面的程序测试一下BAdI在filter场景下的行为。
REPORT zbadi_test.
DATA lo_badi_a TYPE REF TO zbadi_gg_test.
DATA lo_badi_b TYPE REF TO zbadi_gg_test.
DATA lo_badi_c TYPE REF TO zbadi_gg_test.
DATA lt_bapiret2 TYPE bapiret2_t.
BREAK-POINT.
GET BADI lo_badi_a FILTERS iv_scenario_id = 'A'.
CALL BADI lo_badi_a->adjust
CHANGING ct_bapiret2 = lt_bapiret2.
GET BADI lo_badi_b FILTERS iv_scenario_id = 'B'.
CALL BADI lo_badi_b->adjust
CHANGING ct_bapiret2 = lt_bapiret2.
GET BADI lo_badi_c FILTERS iv_scenario_id = 'C'.
CALL BADI lo_badi_c->adjust
CHANGING ct_bapiret2 = lt_bapiret2.
BREAK-POINT.
可以看到,对于Filter 值 ‘A’, 仅BAdI的实现A对应的实现类会被触发。
对于Filter 值 ‘B’, 仅BAdI的实现B对应的实现类会被触发。
对于不存在的Filter 值 ‘C’, 没有实现类会被触发。
因为我们在定义此BAdI时勾选了multiple use,因此,在调用BAdI实现时,不需要判断lo_badi是否bound。
若在定义时,未勾选multiple use,则在调用代码中需要有如下判断,否则,对于未实现filter值C的逻辑会产生dump,因为lo_badi_c会是initial。
REPORT zbadi_test.
DATA lo_badi_c TYPE REF TO zbadi_gg_test.
DATA lt_bapiret2 TYPE bapiret2_t.
GET BADI lo_badi_c FILTERS iv_scenario_id = 'C'.
IF lo_badi_c IS BOUND.
CALL BADI lo_badi_c->adjust
CHANGING ct_bapiret2 = lt_bapiret2.
ENDIF.
BREAK-POINT.
4. 小结
本文总结了BAdI中filter的用法,并给出了代码示例。希望对你有帮助!