ABAP增强-第二代:基于函数出口增强(Function)

 第二代:基于函数出口增强(Function)

SMOD(激活增强,只需一次激活)和CMOD(实现增强)维护;在SAP发布的版本中,使用CALL CUSTOMER-FUNCTION <3位数字>调用函数模块的,所以你可以通过在程序中查找cusomer-function来查找增强,出口函数名称由三部分组成:EXIT_<程序名>_<3位数字>(注:这里的<程序名>即指调用此出口函数的程序名),这样你就可以找到对应的增强函数了

针对数据表的增强出口是 “CI_ ”打头的结构,这些结构将.INCLUDE 结构的形式包含到时相应的数据表中,用户可以通过向这些结构中添加字段从而达到对数据表字段的增加

 

第二代增强中主要有4类:

1)E. Function exits:函数增强(最常用,在SAP上线很多年后都会使用,如:销售单VA02中,对PO长度限制在10-15位之间,且不能为中文与其他特殊字符,还有如对PO采购日期不能晚于交货日期的检验等,这些都会用来函数增强

2)C.GUI codes:GUI增强

3)S. Screens:屏幕增强   增强屏幕的调用是使用CALL CUSTOMER-SUBSCREEN(不常用,一般在上线之初才会做,上线后不常用)

4)T. Tabes:表结构增强

 

查找Enhancement的方法:

1、  在程序中搜索CUSTOMER-FUNCTION找到后面的3位数字编号,出口函数名的规则为EXIT_<程序名>_<3位数字>,然后通过找到的出口函数名到MODSAP表里查找所对应的出口对象(即增强点)

2、  通过调试系统相关函数:MODX_FUNCTION_ACTIVE_CHECK

3、  代码找增强

image210

以VA01对应的主程序SAPMV45A为例,在源码中可以查找包含CALL CUSTOMER-FUNCTION的字符串,可以找到这样的代码:

image211

根据出口所对应的函数名规则,这个函数名为EXIT_SAPMV45A_003

MODSAP表:增强点(出口对象)与函数关系对应表

再根据出口函数,到MODSAP表中查找对应的增强点(出口对象):

image212

注:一个出口函数只对应一个出口对象,而一个出口对象可以对应到多个出口函数

Enhancement比较重要的表MODSAP,这个表里重要的字段有增强名(Name,即出口对象名),组件类型(TYP: E C S T),组件功能模块名(Member):里面记录了所有enhancement的增强。TFDIR所有的函数表,重要字段有FUNCName(函数名),MAND(功能模块激活状态如果是C代表此函数模块激活)

image213

image214

 示例:采购订单屏幕增强

image215

通过调试MODX_FUNCTION_ACTIVE_CHECK系统函数,运行ME23N,找到名为EXIT_SAPMM06E_006的出口函数,再根据这个出口函数到MODSAP表中找到对应的出口对象(增强点)MM06E005,再通过SMOD查看这个出口对象(增强点):

image216

MM06E005包含功能出口、屏幕出口、表出口三种增强

 

在上面MM06E005增强的SMOD界面上双击表出口“CI_EKKODB”,可以对EKKO表结构进行扩充

在上面MM06E005增强的SMOD界面上双击出口函数“EXIT_SAPMM06E_006”,则会打开函数编辑器SE37,再点击工具栏中的“Display Object List”按钮,则切换到SE80编辑器模式中显示,这样就可以找到出口函数所在的函数组为XM06,主程序为SAPLXM06:

image217

INCLUDE LXM06TOP(Global Data在此为增强定义global data)

INCLUDE LXM06UXX.(Function Modules实际上包含所有可用的user exit出口函数)

INCLUDE LXM06F00. (SAP-Formpool for Customer-Use可在此建立Form pool)

INCLUDE ZXM06ZZZ. (Subprograms and Modules,在此创建增强子屏幕)

定义全局变量

image218

屏幕字段名的前缀必须要设置为系统预先定义好的全局 EKKO_CI 内表类型名,这样屏幕字段的就可以自动与该内表结构进行交互,EKKO_CI即为系统预先就定义好的增强屏幕所需的结构类型:

image219

image220

当向结构预留结构CI_EKKODB中扩展字段时,EKKO_CI也会自动的得到扩展,还有EKKO表结构也会被扩充

子屏幕

在MM06E005增强点的SMOD界面上双击出口函数“SAPMM06E         0101 CUSTSCR1 SAPLXM06     0101”屏幕出口行,则会新创建屏幕0101(屏幕属性需设置为子屏幕):
image221

image222

屏幕与业务表数据间传递

image223

image224

相关函数说明

MM06E005增强出口中各个出口函数功能说明:

006:Export Data to Customer Subscreen for Purchasing Document Header (PBO)                    Header,显示子屏幕调用,即在子屏幕的PBO事件块执行前就会先调用此函数在该函数中可以:将数据表中扩展字段所存业务数据导出到采购凭证头中的客户增强子屏幕中

007:Export Data to Customer Subscreen for Purchasing Document Header (PAI)             Header,输入校验

在该函数中:可以对输入的数据进行检验

008:Import Data from Customer Subscreen for Purchasing Document Header                  Header,将通过验证后的最终屏幕数据转存到业务数据内表中,将作为最终业务数据插入到数据库中

012:Check Customer-Specific Data Before Saving                                                                        按保存按钮后执行,保存前调用

016: Export Data to Customer Subscreen for Purchasing Document Item (PBO)                    Item,与006相同

017:Export Data to Customer Subscreen for Purchasing Document Item (PAI)                   Item,与007相同

018:Import Data from Customer Subscreen for Purchasing Document Item                       Item,与008相同

  如何快速找到增强

尽管可以快速根据Tcode找到其对应的增强,可是往往因为这样找到的是所有的增强,而且有些增强可能是随着系统启动了某模块才可能会用到的,这样你可能会面临究竟使用哪个增强的困惑, 所以在此介绍一种方法不用任何程序可以快速定位每个事务码对应的增强,一刀致命.

第一步:在检查出口增强函数设置断点(Tcode:SE37).

image225

SE37输入出口检查函数MODX_FUNCTION_ACTIVE_CHECK.

系统有3种类增强,一是FUNCTION增强,这个最常用,我们一般所用的增强就是它,一是MENUENTRY菜单增强,还有一个就是SUBSCREEN增强,比如采购订单(Tcode:ME21N),工单等很多主数据上都允许屏幕增强,就是如果你有非常极其BT的需求,允许自定义一个用户屏幕,在屏幕上搞些自定义的字段,这些东西当然最后被保存在自定义的表格中,这种思路代表了ERP设计的先进方向,如果你有兴趣可以学习学习.

第二步:执行你想执行的任何Tcode

现在假设我执行MB1B我需要做一些检查增强,系统自然执行到MODX_FUNCTION_ACTIVE_CHECK ,输入变量l_funcname看看它是啥值,比如是EXIT_SAPLF048_001,这个增强的输入参数有doc header and Item(如图3),凭证头和身子在这俩内表都有了,应该可做任何检查.

image226

根据屠宰经验,是这样的,函数包括增强函数都躺在表TFDIR,如果强函数TFDIR-MAND = ‘C’则表示该增强是激活的,于是系统赋予一个标志active = ‘X’,测试一下,现在有人将TFDIR-MAND改成’C’或直接将Active改成’X’, 系统马上会到增强哪去逛一下,如果增强有诸如某个条件不match就错误的逻辑,系统就报告错误知道你纠正为止. 不过,象我这样一看就非常老实厚道的人一般不会做这种欺骗系统的事情.

image227

第三步:快速找到增强名称(SE16|SMOD|CMOD).

确定增强函数EXIT_SAPLF048_001可用后,SE16:MODSAP,这表保存了函数和增强名称的对应关系,在MEMBER输入EXIT_SAPLF048_001,如图4,找到增强F180A001 .

image228

SMOD|CMOD激活增强F180A001,激活函数EXIT_SAPLF048_001,建立程序ZXF48U01,在该程序中写入增强逻辑并激活,注意一个增强生效时必须同时激活这3个东东.

有个弟兄说跟我在项目中学到了不少”歪门邪道“,什么世道?祖传的杀猪独门功夫都让他学去了

 

RIPRO主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
SapiBook » ABAP增强-第二代:基于函数出口增强(Function)

发表评论