第二代增强需要通过SMOD和CMOD维护,使用call customer-function '****'调用函数模块,SE37中的函数名则是:EXIT_程序名_'3位流水码',但是这种增强不能像第一代增强那样使用全局变量,只能够使用出入参,如果的确需要使用到全局变量,建议可以用指针的方式。
第二代增强中主要有4类:
1、E类: enhancement exits,函数增强,也就是用户出口( user exit ),可以在TFDIR中查询EXIT_打头的函数。
2、C类:Gui code,GUI增强
3、S类:Subscreen 屏幕增强,采购订单ME2*,销售订单VA0*,工单CO0*,都允许用户自定义输入界面并编写相应输入输出处理程序。
4、T类: include structure,比如说MM06E005中允许用户建立的两个结构,CL_EKKODB和CL_EKPODB。
Enhancement在MODSAP表(增强点与函数关系对应表)中可查到,而TFDIR表中字段 MAND的值为C时才表示此出口函数被激活了。当然可使用SMOD(CMOD)来激活exit function,但有时候一时难以查询到相关Enhancement时就无法使用SMOD(CMOD)来激活,则可使用下面程序将出口函数激活:
REPORT zactexitfun .
DATA ztfdir LIKE tfdir .
* select single * from tfdir into ztfdir * where FUNCNAME = * 'EXIT_SAPMM06E_013'. * ztfdir-MAND = 'C' .
* update tfdir from ztfdir.
* 将EXIT_SAPMM06E_013换成实际所需exit函数名
UPDATE tfdir SET mand = 'C'.
where funcname = 'EXIT_SAPMM06E_013'.
Enhancement比较重要的表MODSAP,这个表里重要的字段有增强名(Name,即出口对象名),组件类型(TYP: E C S T),组件功能模块名(Member):里面记录了所有enhancement的增强。TFDIR所有的函数表,重要字段有FUNCName(函数名),MAND(功能模块激活状态如果是C代表此函数模块激活)。
SMOD和CMOD的区别
SMOD可以查看具体的某个出口,包含具体的增强内容。用户出口MM06E005包括E类函数出口,S类屏幕增强和T类结构增强。
CMOD是项目,包含了这个项目中使用的增强SMOD,可以在CMOD中激活开发的增强( 注:不激活无法使用 )。一个出口只能被一个项目使用。
注:并不是新开发的SMOD增强都需要分配CMOD,如果没有分配CMOD项目,需要SMOD中激活,并且还需要再正式环境PRD和测试环境QAS中再次激活,否则无法使用。所以一般还是建议分配项目。
寻找出口函数:
根据关键字: CALL CUSTOMER-FUNCIOTN:或者找到程序所在的package,SE38运行程序SNIF。
所以下图的SE37出口函数模块名是EXIT_SAPMV45A_002。
找到了函数名之后通过表MODSAP可以找到所在的SMOD用户出口。
除此之外还可以通过package来找用户出口。表:TADIR。在:object 中输入SMOD和CMOD,DEVCLASS中输入pavkage。
二代增强几个重要的表
MODSAP 出口函数和增强点的联系
TFDIR 存储出口函数名,状态(是否激活)
TFTIT 函数功能的段文本
TSDIR 屏幕增强
CUATEXTS 菜单增强
MODSAPA 增强的属性
MODATTR 增强项目属性
TADIR 资源库对象的目录
屏幕增强
这一部分相对会复杂一些,所以单独拿出来介绍:
1、VA02中附加数据的增强(注:此部分最简单,是SAP预留的可直接修改的screen增强 )。
https://blog.csdn.net/weixin_42646630/article/details/113662608
2、VA02中增加新的一页视图(类似附加数据A、附加数据B),CS03增强,ME23N增强
https://blog.csdn.net/weixin_42646630/article/details/113663461
SAP屏幕增强汇总:https://max.book118.com/html/2017/0126/86826208.shtm,
https://wenku.baidu.com/view/9595ea9b8f9951e79b89680203d8ce2f01666585.html