如何使用SAP BAdI中的Filter

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的用法,并给出了代码示例。希望对你有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年铸器

给作者赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值