ABAP初体验五:增强

2022-03-11 10:58:31 浏览数 (2)

声明:本文仅代表原作者观点,仅用于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 在标准代码

在标准程序

0 人点赞