声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。注:文中所示截图来源SAP软件,相应著作权归SAP所有。
01
目录
5 增强
5.1 定义
5.2 第一代
5.3 第二代
5.3.1 SMOD维护激活,CMOD最终实现激活
5.3.1.1 MODSAP表,存的是增强总信息
5.3.1.2 TFDIR表,主要是存E功能的,MAND字段为C表示激活
5.3.2 第二种方法,通过一些函数,主要是查增强的
5.3.3 增强示例-物料主数据修改mm02
5.3.3.1 随便针对一个物料,修改下旧物料描述
5.3.3.2 发现EXIT_SAPLC1F2_001增强,而且直接走到退出
5.3.3.3 去TFDIR表核实下是否被激活**
5.3.3.4 去modsap里面,找到增强对应的函数信息C1F20001
5.3.3.5 *smod定义该增强,选择C1F20001**
5.3.3.6 保存,在TFDIR查看并未激活**
5.3.3.7 使用cmod激活,发现该增强已经建立到REACH200中去了,激活即可**
5.3.3.8 在TFDIR查看已激活**
5.3.3.9 修改函数添加**
5.4 第三代
5.4.1 继承程序代码示例
5.4.2 再论直接改代码增强弊端
5.4.3 BADI
5.4.4 BADI两部分组成
5.4.5 SE18创建Enhancement spot和BADI
5.4.6 代码调用
5.4.7 定义正规军,BADI实现
5.4.8 还是销售订单做示例,查找
5.5 第四代
5.5.1 自己创建代码做测试
5.5.2 在标准代码
02
正文
5 增强
5.1 定义
5.2 第一代
这些Form集中存储在一些文件名倒数第二个字符为Z的包含程序中(如后面销售凭证主程序SAPMV45A中的MV45ATZZ、MV45AOZZ等Include文件)
这些Form的名称一般是以UserExit_打头的子模块,所以一般找到所要增强的主程序,再查找UserExit_ 关键字即可找到相关的出口
Form源代码增强事先要到 service marketplace 申请对象键(ACCESS KEY),然后才能修改这些子程序,另外,可以在SPRO中搜索 USER EXIT关键字来查找
子程序中,user开头的
5.3 第二代
在SAP发布的版本中,使用CALL CUSTOMER-FUNCTION <3位数字>调用函数模块的,所以你可以通过在程序中查找cusomer-function来查找增强,出口函数名称由三部分组成:EXIT_<程序名>_<3位数字>(注:这里的<程序名>即指调用此出口函数的程序名),这样你就可以找到对应的增强函数了
针对数据表的增强出口是 “CI_ ”打头的结构,这些结构将.INCLUDE 结构的形式包含到时相应的数据表中,用户可以通过向这些结构中添加字段从而达到对数据表字段的增加
查找Enhancement的方法:
1、 在程序中搜索CUSTOMER-FUNCTION找到后面的3位数字编号,出口函数名的规则为EXIT_<程序名>_<3位数字>,然后通过找到的出口函数名到MODSAP表里查找所对应的出口对象(即增强点)
2、 通过调试系统相关函数:MODX_FUNCTION_ACTIVE_CHECK
3、 代码找增强
以VA01对应的主程序SAPMV45A为例,在源码中可以查找包含CALL CUSTOMER-FUNCTION的字符串,可以找到这样的代码:
根据出口所对应的函数名规则,这个函数名为EXIT_SAPMV45A_910
5.3.1 SMOD维护激活,CMOD最终实现激活
用SMOD(激活增强,只需一次激活)和CMOD(实现增强)维护;
5.3.1.1 MODSAP表,存的是增强总信息
功能增强:例如字段校验、字段之间日期校验等 屏幕增强:例如销售订单附加数据等 表增强:append和include GUI增强:增加个功能操作按钮
屏幕增强和表增强是相互关联的。
例如RMVKONOO这个增强,包含两个E的和一个T的:
5.3.1.2 TFDIR表,主要是存E功能的,MAND字段为C表示激活
5.3.2 第二种方法,通过一些函数,主要是查增强的
例如函数:MODX_FUNCTION_ACTIVE_CHECK 1.设断点
2.执行VA02,保存后,断点到函数
3.关注几个变量
4.双击F_TAB[]进入,内表存的是两个出口,MAND表示未被激活,正常一个是表头,一个是行。通过函数的描述可以判断
5.se37找到函数EXIT_SAPLMCS1_001,没激活不好用
5.3.3 增强示例-物料主数据修改mm02
5.3.3.1 随便针对一个物料,修改下旧物料描述
5.3.3.2 发现EXIT_SAPLC1F2_001增强,而且直接走到退出
5.3.3.3 去TFDIR表核实下是否被激活**
5.3.3.4 去modsap里面,找到增强对应的函数信息C1F20001
5.3.3.5 smod定义该增强,选择C1F20001*
5.3.3.6 保存,在TFDIR查看并未激活**
5.3.3.7 使用cmod激活,发现该增强已经建立到REACH200中去了,激活即可**
5.3.3.8 在TFDIR查看已激活**
5.3.3.9 修改函数添加**
最终效果
5.4 第三代
SAP增强类别
5.4.1 继承程序代码示例
5.4.2 再论直接改代码增强弊端
一段程序是多个事务代码公用,不确定是否第二代改完后,是否影响其他事务代码,例如VA01的程序,其实为N多的TCODE使用。
5.4.3 BADI
为什么要BADI
在BW对数据源做增强时,往往出现2个顾问同时修改一个数据源,同时增强一个数据源的情况,有可能进度不统一,只能排队操作。而如果用面向对象的BADI增强,那么只关注自己的实现即可,避免了这种情况。
5.4.4 BADI两部分组成
Enhancement spot,就是管理“类接口的,一般不用定义,都由SAP管理,类似于函数组
5.4.5 SE18创建Enhancement spot和BADI
SE18创建Enhancement spot
作用是为BADI使用
在Enhancement spot创建BADI
去掉复合使用(能用于其他使用)
BADI必需有一个接口
接口里面有各种属性,函数等 定义接口方法
点击参数,定义函数的参数,其中输出参数2定义为值传递
5.4.6 代码调用
因为没写具体的实现代码,肯定报错的
如果想在未定义自己的实现类时,走默认的继承方法,可以在空实现时,定义回调类,说白了就是后补
点击到代码里面去
定义代码:
再次调用BADI
5.4.7 定义正规军,BADI实现
建包,类似于目录
创建空类
编辑代码
编辑代码如下(中间实现的名字修改过一次为Z_LGZBADI_LGZ,当时不知道为何进不去代码编辑页面,可能因为引用了BAK回调类):
再次调用call,跟回调类结果大不相同。
5.4.8 还是销售订单做示例,查找
在SAPMV45A查找
例如找到了
查找其定义的地方if_ex_badi_sd_dpbp
用SE18查看
5.5 第四代
5.5.1 自己创建代码做测试
直接创建一段代码,点击创建选项
最终代码
点击增强
然后继续点击创建实施
添加代码,执行效果,相当于在源程序里面加了自己的一段。但是再修改原程序就不让修改增强了(其他肯定可以再修改)
5.5.2 在标准代码
在标准程序