关于增强知识的整理
最近在学习增强,总结如下:对于SAP标准程序的增强共有四种类型,用户出口增强(User Exit),函数增强(Enhancement),BADI增强(经典BADI和新式BADI),隐式增强和显式增强(explicit Enhancement ,implicit Enhancement),接下来会分别介绍。
一代增强:用户出口增强
系统提供一个空代码的子过程,用户可以添加自己的代码来实现需求,这类增强都需要修改SAP的标准代码,源代码增强以子程序形式发布,在SAP的发行版本中,使用PERFOMR调用这些子程序,它们在发布时都是空的,这些子程序可以使用程序中的所有全局数据。
一代增强的查找方法:
先找到要增强的主程序(可用SE93或系统->状态),然后找到UserExit_开头的子模块,可根据命名模糊判断其可以进行增强的功能
二代增强:Enhancement函数增强
- 源代码增强:以函数模块形式发布,使用CALL CUSTOMER-FUNCTION调用,这些函数模块中,这些函数模块中只能使用接口中传递的参数,不能使用程序的全局变量。
- 屏幕增强:也包含在函数增强所属的函数组中。
- 数据表的增强:通常时ci_结构,这些结构以.INCLUDE结构的形式包含在SAP发布的数据表中,用户可以通过向这些结构中添加字段而对数据表进行增强。
上述这类增强通过事务码SMOD进行维护,CMOD进行实现。SMOD中的一个增强可以包含上述的源代码、屏幕和表增强。
Enhancement比较重要的表MODSAP,组件功能模块名(Member):里面记录了所有enhancement的增强;表TFDIR,包括出口函数在内的所有函数表,字段MAND(值为C表示此出口函数被激活)
二代增强的查找方法:
第一种方法,在程序中搜索customer-function找到后面的3位数字编号,出口函数名称由三部分组成:EXIT_<程序名>_<3位数字>,通过找到的出口函数名到MODSAP表里查找对应的出口对象(即增强点),再通过SMOD查看这个增强点
第二种方法,通过调试系统相关函数:MODX_FUNCTION_ACTIVE_CHECK,找出口函数,通过找到的出口函数名到MODSAP表里查找对应的出口对象(即增强点),再通过SMOD查看这个增强点
第三种方法,SE93先查找到对应的程序名,然后SE11查询数据表TADIR(限定PGMID=“R3TR”、 OBJECT= “PROG”、OBJ_NAME=程序名)找对应开发类,如果找不到对应开发类,通过SE38查看程序,在菜单 “转到-属性”中找开发类。然后再用SE11查询数据表TADIR(限定PGMID=“R3TR”、 OBJECT= “SMOD”、DEVCLASS=开发类)就可找到此程序可用的增强点。
关于二代增强实例的注意事项:
(1) 屏幕增强时,屏幕字段名的前缀必须要设置为系统预先定义好的全局EKKO_CI内表类型名,这样的屏幕字段就可以自动与该内表进行交互,EKKO_CI即为系统预先预先定义好的增强屏幕所需的结构类型
当向预留结构CI_EKKODB中扩展字段时,EKKO_CI也会自动得到扩展,还有EKKO表结构也会被扩充。
(2) 对于增强的子屏幕,屏幕字段的前缀名一定要是EKKO_CI,这样才能与增强预留结构EKKO_CI进行数据交互,将最终内表中的数据读取到子屏幕绑定的内表中,再将子屏幕绑定的内表中的数据转存到最终全局变量的内表中
(3)最后想要使增强生效,必须同时激活,增强点,增强函数,和增强函数里的包含程序
关于二代增强的其他举例:
(1)如在ME23N中,找到的屏幕增强共有6个,含义是在此程序中,共预留了6个相关的屏幕增强出口,但是具体增强在什么位置,需要代码尝试后,才知道。
(2)屏幕增强一般需要配合功能增强来使用,屏幕增强将数据整合到函数组的全局变量,然后再通过功能增强的函数,将数据整合到程序的全局变量
(3)关于判断多个函数功能增强之间,有没有符合增强需求的,可通过查看描述,然后代码尝试,或者网上搜索来进行匹配
三代增强:BADI接口增强
BADI是基于面向对象的SAP增强技术:SAP预定义了接口,由客户来实例化继承相应的接口,应用程序通过调用来获得用户定义的类的实例,BADI对象的信息存储SXS_INTER、SXC_EXIT、SXC_CLASS和SXC_ATTR这四个表,SE18定义接口功能,SE19创建实现类并编写代码。
SAP保证所有的BADI接口兼容向上,版本更新既不会影响标准版本中增强的调用,也不会影响接口调用的正确性。BADI的源代码增强以接口形式发布,也是通过接口的方法调用来使用,用户增强时,实际是实现一个(或多个)基于这个接口的实现类。由于接口可以有多个实现类,所以对一个增强可以有多种不同的源代码,它们通过过滤器应用于不同的业务场景。
BADI也能做屏幕增强,取决于系统是否预留了接口,先找二代留下的屏幕增强出口,如果没有,再查找三代,代码实现时,将参数放入到全局变量里,程序的原有代码,后续会对全局变量进行数据处理;对于增强具体选什么方法进行实现,只有网上搜索,和代码尝试,实现的具体功能,可以参考方法描述,或者打断点进行测试
三代增强的查找方法:
(1)在SE24中对类cl=>get_instance方法进行调试,运行一个tcode,看一下exit_name的值,就是要找的BADI
举例:用SE24进行DEBUG查找BADI时,输入tcode:MM01以后,会分别进入到3个BADI,选择视图的时候,会有1个BADI,进入tcode后,还会有BADI,所以,对于同一个tcode的不同操作,不同的界面,会分别有不同的BADI
(2)在主程序中搜索cl_exitHandler,查看它所引用(TYPE REF TO)的接口名,根据接口命名规则 IF_EX_< badi >,得到badi名称
(3)ST05选择“table buffer trace”而不是常用的”SQL trace”,然后查找表和视图(SXS_INTER、SXC_EXIT,SXC_CLASS和SXC_ATTR),找到对应BADI
关于三代增强的实现:
(1)关于判断是否是符合需求的BADI方法,BADI都是一些接口,通过传入传出的参数去判断,是否是自己所需的数据和需要处理的数据。
(2)BADI内,类的方法是没有代码的,需要用户去实例化,然后写入代码,用BADI来实现需求
(3)对于BADI实现的具体操作,首先要创建一个BADI的实现(BADI是面向对象的思想,可以把BADI理解为一个类),然后双击方法进去写代码,并激活,然后再激活增强,(先是激活程序,后是激活增强,不是一个东西),一般来说测试增强前,都要检测确认下增强是否被激活
四代增强:隐式增强和显式增强(explicit Enhancement & implicit Enhancement)
四代增强包含隐式增强点和显式增强点,下图为显式增强点,系统预留的增强点,
隐式增强点需要用户手动添加,然后写入代码,首先查看可以进行隐式增强的地方
可以进行隐式增强的FORM,会出现下图的虚线标志,含义是可以在此处进行隐式增强,一般会出现在FORM的头部和尾部,点击增强的图标按钮,进入增强模式
然后创建增强,书写代码
四代增强对BADI做出了改进,基本可以在面向对象的程序里实现处处皆可增强,但是此种不建议使用,只有无法通过前三种增强实现时,才考虑四代增强
附:SAP自定义权限对象链接
https://mp.weixin.qq.com/s?__biz=MzAwODA2MjA2Mg==&mid=2247484793&idx=1&sn=08efa5545b0d16be53236a34e577a035&chksm=9b75d078ac02596e67a75defacd83b15aaedb05fba76843538d4c7019dc9fd0952e207dc52bb&mpshare=1&srcid=0818rytr9aKufWo07NbY2fsI&sharer_sharetime=1597713352759&sharer_shareid=c76365b69f75b7f20a4cbbf6b91bb777&from=singlemessage&scene=1&subscene=10000&clicktime=1597713392&enterid=1597713392&ascene=1&devicetype=android-29&version=27001139&nettype=ctnet&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AWJ5ZqOtbl%2B240SC7OFMglg%3D&pass_ticket=d3GP39vrUly10QZjrSqOb1QZ4h%2BbavWMwbyniPTNfWpdMJOav78oskCVskX0Vj7W&wx_header=1