SAP第三代增强:基于类的增强(BADI)

BADI维护是通过SE18SE19事务来来维护的。SE18用于创建及维护BADI对象SE19用于维护BADI的实例。

BADI的查找方法:

1、主程序都会调用cl_exitHandler=>get_instance(这只是经典BADI是这样来调用的,如果是新式的BADI,则调用为GET BADI handle-BADI定义名、CALL BADI handle->method)来判断对象是否存在,并返回实例。我们可以在se24中对类cl_exitHandler=>get_instance方法进行调试,运行一个tcode,看一下exit_name的值,这就是要找的BADI。

2、在主程序中搜索cl_exitHandler,查看它所引用(TYPE REF TO)的接口名,根据接口命名规则 IF_EX_<badi>,得到<badi>命称

3、通过程序查找

命名规则:

Badi definition: Z<badi>

Interface: ZIF_EX_<badi>

BADI implementation:Z<impl>

Implementing class:ZCL_IM_<impl>

BADI是基于SAP面向对象的的SAP增强技术:SAP预定义了Interface,由客户来实例化相应的接口,应用程序通过调用来获得用户所定义class的instance;BADI对象的信息存储在SXS_ INTER, SXC_ EXIT, SXC_ CLASSSXC_ ATTR 这四个表;使用se18, se1 9查询badi,Se18:定义接口功能,Se19:创建实现类并编码SAP保证所有的BADI接口向上兼容。版本更新即不会影响标准版本中增强的调用,也不会影响接口调用的正确性。

新式BADI创建

新式BADI中的增强容器Enhancement Spot、BADI定义 BADI Definitions、接口Interface、增强实现Enhancement Implementation、BADI实现BADI Implementation、实现类之间的关系:

一个增强容器下可以创建多个BADI定义,每个BADI定义由一个接口与多个增强实现组成,而每个增强实现里又可以创建多个BADI实现,而每个BADI实现里可以创建一个现实类。

首先需要创建BADI增强点(Enhancement Spot), Enhancement Spot是作为一个BADI的容器, 在容器里面,我们可以定义自己的多个BADI:

定义:Enhancement spot是对Enhancement的一 个管理半台;是作为一个的容器, 在这个容器里面,我们可以定义自己的BADI或者EnhancementPoint (第四类增强)

如果直接通过这里创建老版本的BADI会报错。

在新建立的enhancement spot中创建BADI:

定义BADI时,默认采用的是单一使用(single-use),如果没有选中复合使用选项(Multiple Use),单一使用的限制是只能有一个实现。
一个Enhancement Spot可以定义多个BADI,每个BADI又是由一个接口与多个实例类组成的。Enhancement Spot相当于容器概念,用来存储多个BADI,而每一个BADI必须定义一个接口,该接口可以有一个或多个实现(增强实现 Enhancement Implementation,每个增强实现里面才能定义实现类),BADI实质上就是将接口与实现类组织(打包、捆绑)在一起了:

BADI对象是由接口与实现组成的,下面创建BADI接口:双击接口名,可以创建接口,以及定义接口中的方法

BADI的实现

由于一个BADI的实现可以有多个类,这些多个实现类需要组织(打包、捆绑)在一起(与多个BADI放在一个Enhancement Spot容器中是一个概念),所以需要创建一个新的BADI增强实现容器ZBADI_DEM001_IMP



一个增强实现(Enhancement Implementation)可以有多个BADI Implementations(相当于多个版本,每个BADI Implementations即与一个且仅一个实现类对应),但起作用的同时只能有一个,有多个版本时需要进行设置:

如果想要达到像Java中多态的话,需要创建多个不同的Enhancement Implementation增强实现,BADI中的多态就是通过不同的Enhancement Implementation增强实现来实现的

当有两个增强实现ZBADI_DEMO01_IMP、ZBADI_DEMO02_IMP,需要把其中一个的Implementation is active前的钩去掉才能被激活:

过滤器

注意:上面过滤值一定要大写,否则运行时匹配不到。

17.3.1.3.1.调用
parameters: filter(2) type c.
DATA: handle TYPE REF TO z_badi_calc_vat,"z_badi_calc_vat为BADI定义名,不是接口也不是类
sum TYPE p,
vat TYPE p,
percent TYPE p.
sum = 50.
GET BADI handle
  FILTERS "SE18中定义的过滤器名作为这里的参数名
    filter1 = 'C'.
CALL BADI handle->get_vat
  EXPORTING
    im_amount      = sum
IMPORTING
    ex_amount_vat  = vat
    ex_percent_vat = percent.

  多个BADI/ Enhancement实现时究竟调谁

在同一Enhancement Implementation中(如下图中的Z_BADI_CALC_IMPL_C),不同的BADI Implementations(Z_BADI_CALC_IMPL、Z_BADI_CALC_IMPL2)之间究竟选谁的问题,是由 Default Implementation、Implementation is active选项共同来决定的,且在同一时间内只能有一个BADI Implementations能被激活调用,所以要通过这两个选项来控制究竟谁被用来当作当前实现被使用,是否被使用也可通过图中的 Runtime Behavior说明文字来查看:

不同的Enhancement Implementation之间(Z_BADI_CALC_IMPL、Z_BADI_CALC_IMPL2)调用由过滤器来决定

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SAP扫地僧

你的鼓励将是我最大的动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值