SAP中的某些BADI是不允许多用(multiple use)的,即不能同时存在多个活动的增强实施类。如下图中的这种,无论为其创建多少个实施类,都只有活动的那一个会被触发:

SAP BADI的“多次使用”(multiple use)-LMLPHP

tips : 业务加载项定义的多重可用性:

业务加载项定义的多重使用意味着可以有多个活动的 业务加载项实施。在进行调用时,将调用所有上述实施,但调用顺序不可预期。

因此,如果使用多重使用 业务加载项定义,那么顺序不得起到任何作用。一个典型的示例是保存前执行检查。

本文链接:http://www.cnblogs.com/hhelibeb/p/6473960.html

  

  在某些情况下,出于业务需求,可能存在多个开发内容需要放置在这种BADI的实施中。因为只有一个实施类可用,就可能会导致不同开发人员的代码发生碰撞,造成一些不好的结果。这时会自然地产生为这种BADI创造多个实施、并让它们依次执行的需求。

  怎样满足这一需求呢?解决办法其实比较简单。我们知道,使用BADI增强,实际上是一个对系统为了我们准备的接口定义去创建实施类的过程。那么,如果有一种方式能读取到BADI接口对应的自定义实施类,并为它们创建实例,就可以很容易地调用它们的方法了。

  有一个工具类可以帮我们实现这一目的:cl_sic_configuration . 这是一段示例代码:

 REPORT ZTEST_BADI.

 DATA: lt_classes TYPE STANDARD TABLE OF sic_s_class_descr.
DATA: ls_class LIKE LINE OF lt_classes. TRY. lt_classes = cl_sic_configuration=>get_classes_for_interface( 'IF_EX_N1_CANCEL' ). CATCH cx_class_not_existent . ENDTRY. LOOP AT lt_classes INTO ls_class.
WRITE: ls_class-clsname, / .
ENDLOOP.

运行程序,得到结果:

SAP BADI的“多次使用”(multiple use)-LMLPHP

cl_sic_configuration
-->

这是两个系统自带的类,说明我们还没有对其创建增强实施。

如果开发人员为N1_CANCEL创建过增强实施,将会得到这样的结果:

SAP BADI的“多次使用”(multiple use)-LMLPHP

既然得到了自定义类的类名,接下来只要对存放它们的内表lt_classes进行过滤、循环,创建自定义类的实例并调用方法即可。

总结一下本文给出的方法:

  1. 为我们想要增强的类创建一个基本BADI实施,在该实施类中使用cl_sic_configuration获取BADI对应的所有自定义实施类的列表。
  2. 过滤掉系统类、以及基本实施类本身。为剩余的自定义实施类创建实例、并调用相关方法。
  3. 基本BADI实施需要设置为活动状态。
  4. 创建的其它BADI是非活动状态。

更具体的代码就不贴了。

05-06 07:11