zoukankan      html  css  js  c++  java
  • SAP BADI的“多次使用”(multiple use)

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

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

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

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

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

      

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

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

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

     1 REPORT ZTEST_BADI.
     2 
     3 DATA: lt_classes TYPE STANDARD TABLE OF sic_s_class_descr.
     4 DATA: ls_class   LIKE LINE OF lt_classes.
     5 
     6 TRY.
     7 
     8     lt_classes = cl_sic_configuration=>get_classes_for_interface( 'IF_EX_N1_CANCEL' ).
     9 
    10   CATCH cx_class_not_existent .
    11 
    12 ENDTRY.
    13 
    14 
    15 LOOP AT lt_classes INTO ls_class.
    16   WRITE: ls_class-clsname, / .
    17 ENDLOOP.

    运行程序,得到结果:

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

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

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

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

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

    更具体的代码就不贴了。

  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/hhelibeb/p/6473960.html
Copyright © 2011-2022 走看看