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

                                       除了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,然后点 系统->状态,得到如下图:

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第1张图片

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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第2张图片


SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第3张图片

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


1.2 通过表SXS_ATTRT直接查找




2.创建BADI.

运行Tcode se18 创建。


SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第4张图片


本例子,创建了一个名为“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 


然后双击‘介面’

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第5张图片

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

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


SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第6张图片


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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第7张图片

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

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



SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第8张图片


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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第9张图片


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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第10张图片

然后再写一个程序,来调用这个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_instance
                    CHANGING instance = exit.
  WRITE :/'Please click here'.

AT LINE-SELECTION.
  NEW-PAGE.
  WRITE: / 'Original word: ',word.

  CALL METHOD exit->method
  CHANGING
     parameter = word.

  WRITE: / 'Changing word: ',word.
效果如下:

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第11张图片


3.过滤支持

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

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

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



3.1定义一个过滤支持的BADI

如下图:

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第12张图片


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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第13张图片


SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第14张图片


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

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

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

要么

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

  或者

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

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

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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第15张图片


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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第16张图片

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

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_instance
                 CHANGING instance = exit.
  WRITE :/'Please click here'.

AT LINE-SELECTION.
  NEW-PAGE.
  WRITE: / 'Original word: ',word.

  CALL METHOD exit->method
     EXPORTING
      flt_val = flt
  CHANGING
     parameter = 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

效果如下:

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第17张图片                                          SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第18张图片


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. 输入你的程序的名字,功能代码,和描述.
SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第19张图片

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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第20张图片

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

定义类

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第21张图片

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第22张图片

实现类:

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第23张图片


看到这里可以知道,我想实现胡这个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_instance
                 CHANGING 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->method
        CHANGING num = num.
      WRITE num.
  ENDCASE.


ENDMODULE.                 " USER_COMMAND_0001  INPUT

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

SAP ABAP(增强技术) BADI自己的一些了解,以及用法_第24张图片

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




待续......




    


你可能感兴趣的:(abap)