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

  • 17
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 'b'sap abap bapi、badi、区别' 的意思是什么? 这个问题的意思是要求解释 "bapi"、"badi" 和 "abap" 之间的区别。"abap" 是德国软件公司 SAP 开发的编程语言,用于开发 SAP 系统的应用程序。"bapi" (Business Application Programming Interface) 是 SAP 系统的一个功能模块,用于连接不同的 SAP 应用程序和传递数据。而 "badi" (Business Add-Ins) 则是一种钩子机制,允许在 SAP 系统插入自定义代码,以增强系统的功能和灵活性。所以,虽然 "bapi" 和 "badi" 都是 SAP 系统的编程接口,但它们的作用和实现方式是不同的。 ### 回答2: SAP ABAPSAP的编程语言,是一种面向对象的编程语言,用于开发SAP系统的应用程序。而BAPI和BADI则是SAP ABAP的两种不同的编程方法。 BAPI是Business Application Programming Interface的缩写,是一组已定义的函数模块,用于与SAP系统进行交互。BAPI可以用来调用SAP系统的标准功能模块,以实现对标准SAP应用程序的访问和修改,还可以通过自定义函数模块进行个性化定制。BAPI旨在使不同的系统和应用程序能够无缝地进行集成,使它们更加灵活和可扩展。 BADI是Business Add-ins的缩写,是一种钩子(hook)技术,用于扩展SAP系统的标准功能。BADI提供了一种平台来开发、实现和操作可插入业务功能,使用户可以轻松地定制和扩展SAP应用程序,而且不会影响到标准SAP系统。用户可以在不同的SAP系统使用同一种BADI实现,这使得BADI具有极大的灵活性和可重用性。 总体来说,BAPI是SAP系统的开放接口,用于与外部系统集成和定制,而BADI则是在SAP系统增加附加业务逻辑的一种方式。虽然它们都是SAP ABAP编程的重要技术,但它们的应用场景和目的有所不同。 ### 回答3: SAP ABAP BAPI和BADISAP系统两种不同的编程方式。BAPI(Business Application Programming Interface)是SAP系统一种标准的用于开发对外接口的编程方式,而BADI(Business Add-In)是SAP系统一种基于面向对象的扩展点的编程方式。 BAPI是一种标准化编程接口,它允许开发人员将SAP系统的业务逻辑封装成可重复使用的程序集,这些程序集可以被任何其他系统或应用程序使用使用BAPI开发的程序可以被称为SAP的Web服务或API,它们可以通过网络调用,实现不同系统之间的数据传输和业务逻辑交互。BAPI通过一些标准提供的接口,如RFC(远程函数调用)和IDoc(间文档)来实现与外部应用程序的数据交互。 与之不同的是,BADI是在SAP应用程序内部定义的一个特定点,用于扩展标准SAP业务逻辑。BADI是基于面向对象编程的原则,允许开发人员在SAP业务流程插入自定义逻辑。BADI具有良好的可维护性和灵活性,因此比其他的扩展点如User Exit更加强大。BADI通常为开发人员提供了一些固定的入口点,使其可以在SAP系统的不同流程添加自定义逻辑以满足业务需求。BADI可以在程序运行时被动态调用,因此可以大大增加程序的可扩展性。 需要注意的是,虽然BAPI和BADI都是SAP系统的编程方式,但是它们有着不同的应用前提和场景。BAPI是为了将SAP系统扩展到其他系统或平台而开发的,其应用场景一般限制于外部应用程序与SAP交互的数据传输;而BADI则主要用于对SAP系统内的特定点进行业务逻辑扩展,其应用场景则更加广泛。在实际开发,开发人员需要根据具体应用场景的需求进行选择和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十年铸器

给作者赏杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值