除了BADI,在实际的项目开发中还可能用到其它的增强技术,如出口技术——User exit(用户出口)、Customer exit(客户出口)等,而BADI技术,即业务附加(Business Add-ins)相当于面向对象的出口技术,所能完成的功能也类似。

BADI是英文Business Add-ins的缩写,我们可以简单地将其翻译成业务附加,是SAP提供的相对于出口技术来讲新一代的增强技术。BADI可以和出口一样,完成对SAP标准功能的增强,包括程序增强、屏幕增强和菜单增强,与出口不同的是,BADI是面向对象的,因此BADI相对于出口技术最大的不同是可重用性,出口技术的增强只能被实现一次,同一出口是不能被包涵在两个增强项目(CMOD创建)中的,但大多数BADI都允许存在多个实例,且可同时生效。

BADI增强技术和其它增强技术不同的是,它只能被实施一次并且可以被任何数量的用户同时调用.此外,BADI可以被按照过滤值定义, 这就允许你控制BADI的实施以及使它基于特殊的条件(比如,在某个特殊的国家)


如果第一次看BADI,不是很能理解的话,可以跟着下面的例子做一遍,边做边理解。

1.查找的方法

  1.1 通过查找关键字“CL_EXITHANDLER”

     执行任意你想找的程序的T-code,然后点 系统->状态,得到如下图:

然后双击“程式(画面)”进入编译画面,然后直接搜索。如下图:

找到对应的 call method cl_exithandler=>get_instance 在此处打断点,然后在重新运行T-code,进入调试状态,exit_name中的就是badi名称。

1.2 通过表SXS_ATTRT直接查找

2.创建BADI.

运行Tcode se18 创建。

本例子,创建了一个名为“Z_BADIDEF_BADITEST2” BADI.

   

如果这个增强将要多次使用或者你想要它的实施基于一个特殊过滤值,就在type栏中选择相关的复选框.更多关于过滤支持和多重调用的信息稍后会介绍.

本示例只针对基本的增强,因此两个复选框都不必选中.

"Multiple use" :

1.不勾选。(只能用一个Implementation)
*有返回值
*可以使用importing、changin、returning参数
*即使BADI本身不支持Mulitiple Use也可以同时存在多个Implementations,只不过只能有一个激活的Implementation

2.勾选
*无返回值
*可以使用importing,changing参数
*同时实施多个Implementation时,由于在BADI定义时,不知道哪些Implementation被激活,所有Implementation的执行顺序不能被确定
*应用程序可以调用所有被激活的Implementations

然后双击‘介面’


然后双击 Interface name "ZIF_EX__BADIDEF_BADITEST2" 进入类的定义。

注:看到这里的时候,感觉对BADI以及有点了解了,因为BADI是面向对象的,所以有类,所以使用BADI的关键字是“CALL  METHOD cl_exithandler=>get_instance"。

如上图,维护方法,然后点击“参数”按钮,维护参数如下图。

保存激活(注意!一定要确保激活成功,不然在后面的调用中是看不到效果的)。这样,BADI的类就定义好了。就如面向对象一般,类有定义(definition)和实现(inplementation),那么,接下来就是对类的实现。

运行TCODE  “se19”,创建一个在BADI  “Z_BADIDEF_BADITEST2” 下的实现,这里取名为“Z_BADIDEF_BADITEST2I”,如下图

双击上图圈红位置,进行类的实现。

双击方法名字,进入代码编辑,在这里我准备做一个大小写转换的BADI,相当于写一个类。

然后再写一个程序,来调用这个BADI,代码如下:

REPORT z_businessaddin .CLASS cl_exithandler DEFINITION LOAD.   "声明DATA exit TYPE REF TO zif_ex__badidef_baditest2.
DATA word(15) TYPE c VALUE 'Business Add-in'.START-OF-SELECTION.CALL METHOD cl_exithandler=>get_instanceCHANGING instance = exit.WRITE :/'Please click here'.AT LINE-SELECTION.NEW-PAGE.WRITE: / 'Original word: ',word.CALL METHOD exit->methodCHANGINGparameter = word.WRITE: / 'Changing word: ',word.

效果如下:

3.过滤支持

BADI可以基于一个特殊过滤值来实施.如果标准的允许一个增强,比如,某国家版,这就象各个合作伙伴想实施这个按照不同的国家创建和激活的截然不同的增强一样.

在定义你的增强时输入一个样过滤类型(比如,一个国家或行业区域) .所有在增强的接口类里创建的方法都含右一个输入参数"FLT_VAL"作为过滤值.应用程序为该增强方法提供过滤值.方法然后为此值选择激活的实施.

下面的描述是一个过滤支持的BADI如何在字符串转换的上下文例子里执行.在下面的例子中,不同的实施将被不同的过滤值调用.


3.1定义一个过滤支持的BADI

如下图:

勾选Filter dependent,然后编辑过滤的类型(Filter type) ,这个值是需要自己维护的,当然也可以使用系统中所存在的资料元素。上图的“Z_BADITEST”是在se11里创建的资料元素。具体维护的栏位看下图:

输入你想作为过滤类型的数据元素(data element)或从帮助列表中选择一个过滤类型.

一个过滤类型可以是一个数据元素或一个结构( structure). 一个数据元素必须满足一下条件:

  • 数据元素的域最多包含30个字符并且必须是字符型(Character.).
  • 数据元素必须

要么

  1).有一个含有和数据元素类型一致的帮助参数的搜索帮助(search help)并且这个参数同时是输入和输出参数.

  或者

  2). 元素的域必须有固定的域值或者有一个包含与该数据元素类型一致的列的值表.

我这里进行筛选的值是 A01-大写   A02-小写

然后通过SE19打开类的实现 Z_BADIDEF_BADITEST2I,就会看到下图:

然后再点击介面, 双击ZCL_IM__BADIDEF_BADITEST2I进入代码编译:

再修改调用程序(代码如下):

REPORT z_businessaddin .CLASS cl_exithandler DEFINITION LOAD.DATA exit TYPE REF TO zif_ex__badidef_baditest2.
DATA word(15) TYPE c VALUE 'Business Add-in'.
DATA flt TYPE z_baditest.
*
START-OF-SELECTION.PERFORM formatlist.CALL METHOD cl_exithandler=>get_instanceCHANGING instance = exit.WRITE :/'Please click here'.AT LINE-SELECTION.NEW-PAGE.WRITE: / 'Original word: ',word.CALL METHOD exit->methodEXPORTINGflt_val = fltCHANGINGparameter = word.WRITE: / 'Changing word: ',word.*&---------------------------------------------------------------------*
*&      Form  formatlist
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM formatlist.WRITE:/'A01->Conversion to upper case'.flt = 'A01'.HIDE flt.WRITE:/'A02->Conversion to lower case'.flt = 'A02'.HIDE flt.ENDFORM.                    " formatlist

效果如下:

                                          

4.多重调用(Mutiple use)

1.不勾选。
*有返回值
*可以使用importing、changin、returning参数
*即使BADI本身不支持Mulitiple Use也可以同时存在多个Implementations,只不过只能有一个激活的Implementation

2.勾选
*无返回值
*可以使用importing,changing参数
*同时实施多个Implementation时,由于在BADI定义时,不知道哪些Implementation被激活,所有Implementation的执行顺序不能被确定
*应用程序可以调用所有被激活的Implementations

5.菜单增强


SAP允许你用功能代码(function code)在用户界面上增强菜单.这些功能代码必须符合格式/namespace/+<...>,,就象在SMOD/CMOD 增强.它们指定到一个特殊的增强并且一旦这个增强的实施被激活就在它们相应的菜单中显示.

开发者在定义一个BADI的时候保留一些特殊的功能代码给客户.他们用菜单制作器把这些代码包纳到合适的菜单列表中.开发者必须保证这些菜单选项在程序中调用,而且相应插件的方法也能找到. 客户可以创建一个新的实施来使用菜单增强,从菜单选项里选择一个文本,然后编写当菜单增强被调用时决定执行何种操作的方法.

菜单增强只允许无过滤支持的唯一调用(而非多重调用).目前,菜单增强只能与程序增强结合创建.

创建一个菜单增强,按以下步骤操作:

  1. 创建一个插件并定义它的接口类.
  2. 从标签栏选择Fcodes
  3. 输入你的程序的名字,功能代码,和描述.

这里的功能代码要和调用该程序的status中的功能代码一致,如下图:

然后定义类,实现类,如下图:

定义类

实现类:

看到这里可以知道,我想实现胡这个BADI的功能是,点击程序菜单,实现num的加2功能,调用程序代码如下:

REPORT z_businessaddin .CLASS cl_exithandler DEFINITION LOAD.DATA flt TYPE z_baditest.
DATA ok_code TYPE sy-ucomm.
DATA num TYPE i VALUE 0.
DATA exit TYPE REF TO zif_ex__badi_menu.
START-OF-SELECTION.CALL METHOD cl_exithandler=>get_instanceCHANGING instance = exit.CALL SCREEN 0001.*&---------------------------------------------------------------------*
*&      Module  STATUS_0001  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0001 OUTPUT.SET PF-STATUS 'STATUS'.
*  SET TITLEBAR 'xxx'.ENDMODULE.                 " STATUS_0001  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0001 INPUT.CASE sy-ucomm.WHEN 'BACK'.LEAVE TO SCREEN 0.WHEN '+CUS'.CALL METHOD exit->methodCHANGING num = num.WRITE num.ENDCASE.ENDMODULE.                 " USER_COMMAND_0001  INPUT

画面就定义了一个input,操作如下

点击菜单中的"badi test" 会实现对你输入在input里的值加2。

待续......



    


SAP ABAP(增强技术) BADI自己的一些了解,以及用法相关推荐

  1. SAP产品增强技术回顾

    Jerry最近的工作和SAP某云产品的扩展性设计相关,因此借这个机会,把我过去工作中积累的SAP产品扩展技术相关的知识做一个梳理和回顾. 文章目录 SAP产品标准 SAP Field Extensib ...

  2. [SAP ABAP开发技术总结]选择屏幕——SELECT-OPTIONS

    12.4.         SELECT-OPTIONS. 89 12.4.1.     输入ABAP程序默认值时,需要加上"=". 89 12.4.2.     选择条件内表多条 ...

  3. [SAP ABAP开发技术总结]ABAP调优——Open SQL优化

    11.1.     数据库编程方面优化 1.   不要使用 SELECT * ...,选择需要的字段, SELECT * 既浪费CPU,又浪费网络带宽资源,还需占用大量的ABAP内存 2.   不要使 ...

  4. [SAP ABAP开发技术总结]SD销售订单定价过程

    16.3.2.     定价过程 16.3.2.1.           条件技术七要素 16.3.2.2.           条件表V/03.V/04.V/05 16.3.2.3.         ...

  5. [SAP ABAP开发技术总结]EXIT-COMMAND

    12.8.     EXIT-COMMAND 12.8.1.           MODULE <mod> AT EXIT-COMMAND 对话屏幕中,对于E类型的Function Cod ...

  6. [SAP ABAP开发技术总结]动态语句、动态程序

    在ABAP中写动态的程序,灵活的程序,一定要知道的 1.13.         动态语句 1.13.1.     内表动态访问 1.13.2.     动态类型 1.13.3.     动态SQL 1 ...

  7. [SAP ABAP开发技术总结]ABAP读写、解析XML文件

    20.6.         XML. 236 20.6.1.     生成... 237 20.6.2.     解析... 240 20.6.     XML if_ixml if_ixml_doc ...

  8. [SAP ABAP开发技术总结]ABAP调优——代码优化

    11.2.     程序 1.   READ TABLE ...WITH [TABLE] KEY...BINARY SEARCH读取标准内表使用二分查找 2.   在循环(LOOP AT ...WHE ...

  9. [SAP ABAP开发技术总结]屏幕跳转

    12.18.             屏幕跳转 LEAVE SCREEN. or LEAVE TO SCREEN <next screen>. LEAVE SCREEN语句会结束当前屏幕并 ...

最新文章

  1. 字符串面试题(一)字符串逆序
  2. 如何选择版本控制系统之二
  3. Paper:《A Few Useful Things to Know About Machine Learning—关于机器学习的一些有用的知识》翻译与解读
  4. 机器学习之 weka学习(三)
  5. java 类的执行顺序_Java中类的执行顺序
  6. [MyBatisPlus]模拟多数据源环境及测试
  7. 【第8篇】Python爬虫实战-批量删除csdn私信记录
  8. MyBatis的mapper.xml中对于一个传参的多重判断
  9. jQuery Event 模块 源码浅解
  10. 【路径规划】基于matalb遗传算法机器人栅格地图路径规划【含Matlab源码 175期】
  11. WFDB工具箱在Matlab2010b及更高版本上的安装
  12. 老旧电脑救星,Windows 8.1 原始系统安装
  13. pycharm下django实战
  14. 计算机表格数字怎么,电脑表格数字打不出来
  15. Romax Designer 机械传动系统 视频
  16. python中显示第三行数据_在Python中Dataframe通过print输出多行时显示省略号的实例...
  17. 【Dubbo实战】基础学习篇(一)
  18. aux ps 和top_关于vmstat,top,ps aux查看的cpu占用率不一致的问题
  19. 关于keil的一些基础知识(持续更新)
  20. 笨办法学python3进阶篇下载_笨办法学Python 3:进阶篇

热门文章

  1. MRS 配套ARM内核单片机烧录工具使用说明(RISCV/ARM IDE)
  2. 狗狗有角膜溃疡怎么办?
  3. java 复数_java 中实现复数的加减
  4. 无线局域网WLAN之初步认识
  5. 智能家居核心 —— wifi模块
  6. 如何用PYTHON代码写出音乐
  7. (项目部署)day60javaEE基础查漏补缺
  8. python下载抖音视频_抖音好看的视频你想下载吗?
  9. CCF2018年:小明放学C++答案
  10. 微信商城开发的主要特点是什么