第二代增强和第三代增强的差别
1、tcode 不同
第二代:cmod 增强管理;smod 实施的增强点。
第三代:SE18 BADI的定义;SE19 BADI的实现
2、实现方式不同
SMOD是基于函数模块的增强,函数名称是 EXIT_程序名_’XXX’。
使用 CALL customer-function ‘XXX’ 调用函数模块。
函数里面一般是 INCLUDE ZXXX 一句话,进去里面进行代码增强;
SE19是基于面向对象的增强,
源代码发布以接口的方式,通过接口的方法的调用来实现使用。
第三代:基于类的增强(BADI)
BADI新方式实现
1-构建BADI
2-实现BADI
3-使用ABDI过滤器
4-多个实现时调用谁
查找系统中的BADI
BADI详细说明文档
示例:通过BADI实现采购订单屏幕增强
需求说明
step1:标准表ekko、ekpo结构扩展
step2:创建自定义表
step3:create function group
功能函数
标准表扩展所涉及的函数
Z_PO_SUBSCREEN_GRP_POP_HEAD
Z_PO_SUBSCREEN_GRP_POP_ITEM
Z_PO_SUBSCREEN_GRP_PUSH_HEAD
Z_PO_SUBSCREEN_GRP_PUSH_ITEM
自荐表扩展所涉及的函数
Z_PO_SUBSCREEN_GRP_POP_ITEM2
Z_PO_SUBSCREEN_GRP_PUSH_ITEM2
Z_PO_SUBSCREEN_GRP_INIT
Z_PO_SUBSCREEN_GRP_OPEN
Z_PO_SUBSCREEN_GRP_GET_DATA
Z_PO_SUBSCREEN_GRP_SET_DATA
Z_PO_SUBSCREEN_GRP_POST
Z_PO_SUBSCREEN_GRP_COMMIT
全局数据定义
LMEVIEWSF01
子屏幕设计
0100
0101
0102
0103
step4:BADI ME_GUI_PO_CUST 的实现,子屏幕数据传递处理
step5:BADI ME_PROCESS_PO_CUST 的实现,数据处理
通过程序查找出口对象或ABDI
Enhancement Framework基本概念
为自己的程序创建显示增强Explicit Enhancement Spot
隐式与显式增强
系统标准表结构增强
Include Struture
Append Struture
SE14调整
BADI新方式实现
1-构建BADI
1.SAP BADI的由来
由于各个国家财务制度以及税务制度的差异,SAP希望在自己的程序开发平台中引入BADI,能够让开发人员自己编写业务插件,系统会自动调用这些插件程序来完成某种业务运算。
2.创建一个Enhancement Spot
Enhancement Spot 是作为一个BADI容器,在这个容器里面,我们可以定义自己的多个BADI。
在TCODE SE18
3、定义一个BADI
在新建的Enhancement Spot中创建一个BADI,选择如图的按钮
4、定义一个BADI接口
接下来我们需要一个接口来定义这个BADI所需要的方法
双击接口,此时可以选择或者输入一个新的接口名
为z_if_test3创建一个方法get_test,并设置其参数
至此,我们已经建立了一个Enhancement Spot,而且带有一个BADI和一个接口,仅仅如此是不能使用这个BADI的,我们需要一个BADI实例来在程序中被调用。
5、现在我们调用一个小程序来调用这个BADI的方法get_test,系统中有两个关键字用来得到BADI实例和调用BADI,分别是get badi 和call badi。
由于还没有实现,所以报错。
2、实现BADI
一个Enhancement Spot 可以定义多个BADI,每个BADI又是由一个接口和多个实例类组成的。
Enhancement Spot相当于容器的概念,用来存储多个BADI,而每个BADI又必须定义一个接口,该接口可以有一个或者多个实现类,BADI实质上就是将接口和实现类组织在一起,而BADI本身又可以代表接口本身的概念了,(因为一个BADI只有一个接口)。
1、建立一个BADI增强实现容器
由于一个BADI的实现可以有多个类,这些多个实现类需要组织在一起(与多个BADI放在一个Enhancement Spot中是一个概念),所有需要先创建一个新的BADI增强实现容器,如图:
2、BADI类实现
紧接着要求输入BADI的实现名和实现类
当保存后,会自动跳转到BADI增强实现的界面(因为BADI的实现类可以有多个,所以新开一个界面来专门来进行BADI的实现过程)
一个增强实现(Enhancement implementation)可以有多个implementations(相当于多个版本),但起作用的同时只能有一个,有多个版本时需要进行设置:
两个实现版本类所实现接口GET_TEST方法如下:
上面虽然建了两个BADI Implementation (Z_BADI_IMPL_01、Z_BADI_IMPL_02),或者说两个实现类(Z_CL_BADI_IMPL_01、Z_CL_BADI_IMPL_02),但这些都属于同一个Enhancement Implementation(Z_BADI_IMPL_C)的,对于BADI定义(Z_BADI_TEST3)来说,只有一个增强实现,而增强实现里虽然创建了两个实现类,但同时只有一个起作用,所以目前最终只有一个Enhancement Implementation,可以创建多个不同Enhancement Implementation 增强实现。
如果激活方法时出错,原因是目前有连个BADI的实现,所以需要把其中一个的Implementation is active 前的钩去掉才能被激活。
当加上过滤器之后,需要将此钩打上,不然在运行时如果通过过滤器选择的是此实现时,调用程序是dump掉
当有多个BADI实现时,需要增加过滤器来选择使用那个实现类。