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

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.

运行程序,得到结果:

cl_sic_configuration
-->

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

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

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

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

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

更具体的代码就不贴了。

SAP BADI的“多次使用”(multiple use)的更多相关文章

  1. 如何从SAP中查找BADI

    如何从SAP中查找BADI   如何从SAP中查找BADI http://blog.csdn.net/CompassButton/article/details/1231652 BADI作为SAP的第 ...

  2. 查找增强出口和BADI程序

    *&---------------------------------------------------------------------* *& Report Z_FIND_EX ...

  3. SAP CRM settype的创建,背后发生了什么

    来自我的同事Sara. 当我们在CRM系统里创建一个settype之后,其实系统后台悄悄的帮我们创建了很多ABAP对象,比如对应的database tables, other ABAP Diction ...

  4. SAP增强Enhancement

    第一代:基于源码增强(子过程subroutine) 第一代增强基于源代码,是SAP提供的一个空代码的子过程.在这个子过程中用户可以添加自己的代码,控制自己的需求.这类增强集中在一些文件名倒数第二个字符 ...

  5. SAP 4代增强

    *20170325 160000 以下之外, 还有:.替代, -用过一次:.BTE -没用过,需要学习: 第二代增强和第三代增强的差别: 1.Tcode 不同:第二代: CMOD 增强管理,SMOD ...

  6. AMDP + XSLX Workbench 报表开发模式

    本文介绍了我和同事通过使用AMDP + XSLX Workbench缩短报表开发周期.分离数据查询处理逻辑和前端展示工作的经验.欢迎讨论. 前言 最近接到了一套人力资源报表的开发需求,需要以EXCEL ...

  7. AMDP + XLSX Workbench 报表开发模式

    本文介绍了我和同事通过使用AMDP + XLSX Workbench缩短报表开发周期.分离数据查询处理逻辑和前端展示工作的经验.欢迎讨论. 前言 最近接到了一套人力资源报表的开发需求,需要以EXCEL ...

  8. ZFIND_EXIT_BADI

    *&---------------------------------------------------------------------* *& Report  ZFIND_EX ...

  9. 查找SAP标准程序用户出口及BADI的方法

    查找SAP标准事务代码中使用的BADI: 在SE24中,查看类对象CL_EXITHANDLER,在其方法(Methods)GET_INSTANCE 的第14行打断点,之后运行事务代码: 当有BADI将 ...

随机推荐

  1. ubuntu连接android设备(附最简单方法)

    在ubuntu下连接android设备,虽然不用像windows那样安装驱动,然而却会遇见一个错误:输入adb shell,会提示insufficient permissions for device ...

  2. springMVC源码分析--容器初始化(二)DispatcherServlet

    在上一篇博客springMVC源码分析--容器初始化(一)中我们介绍了spring web初始化IOC容器的过程,springMVC作为spring项目中的子项目,其可以和spring web容器很好 ...

  3. 华为解锁BL

    华为手机要怎么查看手机是否需要解锁呢?相信许多机油都不懂自己入手的手机是否需要解锁.而华为手机自华为C8812之后的高通手机均需要先解锁才能够尽兴刷机或获取Root权限的.那么下面我给大家分享一下华为 ...

  4. 【Android 应用开发】 Android APK 反编译 混淆 反编译后重编译

    反编译工具 : 总结了一下 linux, windows, mac 上的版本, 一起放到 CSDN 上下载; -- CSDN 下载地址 : http://download.csdn.net/detai ...

  5. ADFS部署过程中设置network service对证书的读取权限

    今儿在部署客户正式环境的ADFS时候遇到一问题,在配置完基于声明的身份验证后通过url访问居然报错了,这干过N回的事怎么会出错了呢,百思不得其解 网页报错如下 系统日志报错如下, 回想过程中的每一步, ...

  6. UNIX环境高级编程——进程基本概述

    一.什么是进程 从用户的角度来看进程是程序的一次执行过程.从操作系统的核心来看,进程是操作系统分配的内存.CPU时间片等资源的基本单位.进程是资源分配的最小单位.每一个进程都有自己独立的地址空间与执行 ...

  7. UNIX环境高级编程——进程控制

    一.进程标识符 ID为0的进程是调度进程,常常被称为交换进程.该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程.进程ID 1通常是init进程,在自举过程结束时由内核调用.ini ...

  8. 小强的HTML5移动开发之路(16)——神奇的拖放功能

    来自:http://blog.csdn.net/dawanganban/article/details/18181273 在智能手机发展飞速的现在拖放功能已经成为一种时尚,但是在我们的浏览器上是不是还 ...

  9. UVa - 1616 - Caravan Robbers

    二分找到最大长度,最后输出的时候转化成分数,比较有技巧性. AC代码: #include <iostream> #include <cstdio> #include <c ...

  10. [WinForm]dataGridView自定动态设定序号列框

    你可以在数据绑定或者行数有很大变化时测量一下DataGridView最大行数的行数的宽度然后在绘制代码如下 SolidBrush solidBrush; StringFormat stringForm ...