之前面试被人问到了增强相关的内容,后面了解了其中的一种二代增强。其余的几代等后面有空了补齐吧。
SAP 二代增强
一、二代增强类型
- Ehancement exits:出口增强以Exit_打头,可以在SE37中查看,也可以在数据字典TFDIR(函数表)中查询Exit_打头的函数。
- GUI Codes:GUI增强,用于区域菜单和工具菜单栏的增强
- Subscreens:屏幕增强,用于子屏幕设计增强
- Include Structure增强:用于表结构增强。
二、查找增强的方法
1.SAP增强出口检查函数
- MODX_ALL_ACTIVE_MENUENTRIES:菜单增强
- MODX_FUNCTION_AVTIVE_CHECK:出口函数增强
- MODX_MENUENTRY_ACTIVE_CHECK:MENU菜单增强
- MODX_SUBSCREEN_ACTIVE_CHECK:屏幕增强
2.查找增强步骤
(1)在检查函数打断点

(2)执行需要检查的T/C
以CV12为例

(3)取得函数名
存在多个增强,所以会循环执行多次。可以看见下方的L_FUNCNAME的值为:EXIT_SAPLCSDI_002。

(4)查询MODSAP表
通过上面获取到的Function名,到MODSAP表中查询扩展名:PCSD0002。


(5)SMOD(查看增强)/ CMOD(实施增强)
通过事务代码SMOD可以查看并修改该出口对象。

单击工具栏中的“组件”按钮,可以查看该出口对象所包含的组件清单

单击工具栏的执行按钮可以输入出口对象所包含的函数清单,并可以查看该出口对象目前的状态,若该出口对象未被激活,其输出清单将会由红色的图标来表示,否则会显示绿色的图标,可以通过工具栏按钮来激活该对象,可以被激活的对象才可以在程序执行的时候被调用,如下图所示,打勾的部分为已实施的对象。

三、逆向查找函数
函数增强的命名方式有其固定的格式:
- 前四个字母是固定的EXIT
- 第二部分为程序名
- 第三个部分为3位数字的序列号
基于函数的出口在程序中通过引用代码“CALL CUSTOMER-FUNCTION <3位数字>”来调用,以VA01的主程序SAPMV45A为例,在程序中查找包含“CALL CUSTOMER-FUNCTION”的字符串,可以找到例如代码“call customer-function ‘003’”,如下图所示:

根据以上命名原则可以判断出该增强出口函数名称为“EXIT_SAPMV45A_003”,通过SE37查询该Function,可以看到该函数中指定了一个预留的程序,名称为“ZXVVAU05”。

程序名“ZXVVAU05”为SAP的预留程序名,以Z开头的程序可以在SAP中直接创建和维护。在代码中双击该程序名,若程序没有被创建,系统将提示在系统中按该名称进行创建新的程序。
四、二代增强实施案例
通过CMOD实现销售订单控制实例。
1.创建项目对象
使用TCODE:CMOD,进入项目管理维护工具。创建一个对象。

点击创建按钮后进入维护界面,编写描述、选择保存的包和语言等信息。

在属性页面上可以看到在工具栏上有三个按钮。
- 编辑:在编辑与显示状态中切换
- 增强分配(Enhancement assignments):分配增强的组件对象
- 组件(Parts):列出组件中所对应的功能函数
2.增强分配
进行完上面的操作之后,点击保存按钮。之后点击增强分配按钮,系统进入组件对象维护页面,可以在一个项目中同时输入多个增强组件对象,需要注意的是,一个组件对象只能被引用一次,若在本CMOD项目中被引用了,那么这个组件就不可能在其他的CMOD中输入。
组件对象以“V45A0003”为例。

3.组件列表界面
在上述的界面中点击组件按钮,系统将会进入到组件列表界面。该界面将会列出组件包含的功能函数,如组件对象“V45A0003”中维护的功能函数。若同时维护了多个组件对象,则会在该页面中将所有函数对象按照顺序列出来。

从页面中也可以看到组件对象的状态,在组建所对应的列表表头,会有一个只是图标来表示该对象的状态。组件对象必须激活才能使用,若未激活,将会显示一个红色的指示图标。激活后则是一个绿色的图标。在函数一栏,也会有一个图标指示该函数的Include程序是否被激活,具体如上图所示。
4.维护函数
以第一个函数“EXIT_SAPMV45A_003”为例,双击该函数名称进入到函数维护界面。双击该函数中预留的程序“ZXVVAU05”。若未创建则创建之。

5.编写增强代码
上述Function使用方法与普通Function使用方法相同。
(1)Importing参数:
- XVBAK:用于保存订单的表头数据。
- XVBUK:于保存订单抬头的状态等数据。
- XKOMK:用户保存订单中行项目的定价等信息。
(2)Tables参数
- XVBKD:保存表头相关凭证信息。
- XVBFA:保存行项目凭证流信息。
- XVBUP:保存订单行项目物料相关信息。
- XVBUP:保存行项目的状态信息。
编写增强逻辑:
1 | DATA LS_XVBKD LIKE LINE OF XVBKD. |
变更完成之后需要激活新建的CMOD项目,不然增强内容无法识别。测试结果如下:
