BADI:Bussiness Add-In。
第三代增强:源代码是以接口的形式发布,通过调用接口方法的方式实现。用户增强是通过实现一个或多个基于这个接口的类,对同一个增强可能会出现不同的源代码,这些源码是通过过滤器实现的。
分为Classic BADI和New BADI,
传统方式的的BADI的调用是使用cl_exithandler=>get_instance,
新BADI的调用方式是get badi / call badi
创建ClassIc BADI 步骤:
1、SE19输入BADI名字,比如MB_MIGO_BADI,单击按钮“创建实现”,在弹出的对话框中输入BADI实现的名字和描述,比如ZMB_MB_MIGO_BADI,(自动)为BADI实现指定一个接口(IF_EX+BADI名);
2、创建一个实施类来实现这个接口(ZCL_IM_BADI名);
3、在实施类的相应方法中编写代码实现业务逻辑。
NEW BADI的创建步骤:
SE19 输入增强点的名字,比如MB_MIGO_BADI,单击按钮“创建实现”,在弹出的对话框中输入增强实现的名字和描述,比如ZMB_MB_MIGO_BADI_NEW,(自动)为BADI实现指定一个接口(IF_EX+BADI名);
2、创建一个实施类来实现这个接口(ZCL_IM_BADI名);
3、在实施类的相应方法中编写代码实现业务逻辑。
目前Classic BADI会自动迁移至NEW BADI中:
1、SE19输入BADI名字,比如MB_MIGO_BADI,单击按钮“创建实现”,在弹出的对话框中输入BADI实现的名字和描述,比如ZMB_MB_MIGO_BADI,(自动)为BADI实现指定一个接口(IF_EX+BADI名);
2、创建一个实施类来实现这个接口,ZCL_IM_BADI名;
3、保存,提示已移植BADI实现,回车,在弹出的对话框中,单击创建按钮,创建NEW BADI(增强实现),输入增强实现的名字和描述,比如ZMB_MIGO_BADI_NEW;
4、保存激活NEW BADI;
5、删除刚创建的BADI实现;
6、在NEW BADI(增强实现)中的执行类的相应方法中写代码实业务逻辑。
上图表示Classic BADI ZMB_MIGO_BADI 会自动的转化为 NEW BADI ZMB_MIGO_BADI_SPOT
并且在实际调用过程中,二者都是用的new badi的调用语法,原因应该是这个BADI正好是存在一个enhancement spot。
MIGO中的另一个增强BADI:MB_DOCUMENT_BADI 好像不存在enhancement spot,它就不存在NEW BADI
Enhancement spot 是BADI的容器,在容器中定义我们自己的多个BADI,
- 创建 emhancement spot
- 创建BADI (multiple use 多次使用,single user 只能有一个实现类,如果在SE18中创建了多个实现类或者多个enhancement implementation需要通过创建过滤器来解决,同一enhancement 不同的badi class之间可以通过过滤器或者default implementation和runtime behavior控制)
- 定义BADI接口 ,创建method
- 创建Enhancement的实例( implementation ),同一个badi可以建立多个实例class,但是需要打包在一起,但是他们都属于同一enhancement Implementation(一个enhancement implementation 可以有多个BADI的实例,但是起作用的是只有一个,如果想实现JAVA中的多态,需要创建多个enhancement implementation )
BADI和NEW BADI的区别:
1、CLASS BADI用call method获取BADI,CALL METHOD CL_EXITHANDLER=>GET_INST CHANGING INSTANCE = badi_name
NEW BADI不能用call method获取BADI,要用GET BADI badi_name;
2、CLASS BADI用CALL METHOD调用BADI中的方法 CALL METHOD badi_name->method EXPORTING LGORT = wa_lgort;
NEW BADI用CALL BADI调用BADI中的方法 CALL BADI badi_name->method EXPORTING LGORT = wa_lgort;
3、NEW BADI中新增了ENHANCEMENT SPOT增强点、ENHANCEMENT SECTION以及隐式增强点的概念。
创建不同的BADI的实现以及对应的实现类 BADI Implementation 和 implementing class的关系是一对一的
怎么查找已经实施BADI:找到该程序所在的Package,运行程序SNIF,输入package可得到已经实现的自定义增强
寻找新BADI,进入debug模式,然后再增加break/watchpoints新增动态断点( GET BADI),变量名就是SE18中的BADI,然后可以找到增强实现。