Fork me on GitHub

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是非活动状态。

 

更具体的代码就不贴了。

posted @   氢氦  阅读(2145)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示