增强的目的就是标准的sap正常的业务系统不能满足实际需求.
但作为开发人员所说的增强主要是标准系统事先预留好的接口,根据不同业务需求,进行开发,我们称为增强,又叫出口。
比如:1:在业务检查时,比如在某个工厂发货,可以设定在某个库位的出货只能使用某种移动类型。2:在需要界面增强时,比如用户对某个字段要求大写,但是最终用户不按规范操作,这也可以在出口中自动转换,有些模块甚至能自定义数据库字段,并且可以在出口中增加字段输入。还有的模块能对输入数据检查,甚至实现自动替代等功能。3:有不规则业务时,比如按某种条件定价,可以设定从自己定义的表中按某种条件取值 4:搜索帮助的出口,可以对Sap标准的搜索帮助做权限控制。等等。
Sap的用户出口发展至今有四代:
一、第一代(基于源代码的增强)是sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码,它们在发布的时候都是空的,集中在一些文件名倒数第二个字符为Z的包含程序中,由于在标准程序中,所以所有程序的全局数据都可以使用,但同时系统升级时会被新版本覆盖;这种源代码增强和屏幕增强的说明可以从事务码 spro 后台配置中相关模块的路径里面找到;一般是以UserExit_打头的子模块。找到所要增强的的程序,查找UserExit关键字。这类增强事先要到 service marketplace 申请对象键(ACCESS KEY),然后才能修改这些子程序。
查找此类出口的方法:
1、 在增强程序中找第二个字符为Z的包含程序;
2、 在后台找对应模块增强;
3、 在程序中搜索USEREXIT_打头的关键字子程序;
4、 字节列出对象列表“Display Object List”按钮,在Subroutines列表下找“userexit”打头的子程序;
二、第二代增强(基于函数模块的增强),用SMOD和CMOD维护;在SAP发布的版本中,使用Call customer-function ‘xxx’调用函数模块的,所以你可以通过在程序中收customer-function来查找第二代增强,第二代增强函数名构成:Exit_程序名_’xxx(3 digital number)’,这样你就可以找到对应的增强函数模块了,它们在发布的时候只有一句代码include ‘xxxxxxx’,修改时无需像第一代增强一样需要ACCESS key,直接双击回车就可以了,但同时这种增强以及后面几代的增强都不能像第一代一样随便使用程序的全局数据,只能使用接口中传递进来的参数。
第二代增强中主要有3类:
1)E . Ehancement exits:这些出口 Exit_打头,你可以到SE37中查看,也可以在数据字典中TFDIR(函数表)中查询Exit_打头的函数。
2)C .GUI codes, (GUI增强)
3)S . Subscreens(屏幕增强)。
4)T. include structure增强
Enhancement比较重要的表MODSAP,这个表里重要的字段增强名(Name),组件类型(TYP: E C S T),组件功能模块名(Member):里面记录了所有enhancement的增强.TFDIR所有的函数表,重要字段FUNCName(函数名),MAND(功能模块激活状态 如果是C代表此函数模块激活)。
查找Enhancement的方法:
1、在程序中搜索Customer-function找到后面的3为digit suffix,然后出口函数组成就是Exit_程序名_3 digit suffix.
2、代码找增强 利用如下代码找enhancement(有些exit使用它并不能找到)
3、利用系统函数寻找增强
Function:
[1].DYNP_VALUES_READ
[2]. MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)
[3].MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)
[4].MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
[5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)
我们可以在函数最后设置断点,然后通过跑对应的增强程序就会去调用这样的函数,这样你就可以在调试模式下找到对应的增强。
三、第三代增强(基于面向对象概念的增强BADI(business add-in)),源代码发布以接口的方式,通过接口的方法调用来实现使用的。用户增强实际上是实现一个或多个基于这个接口的实现类,因为接口类实际上是一个抽象类,所以对同一个增强会出现不同的源代码,这些不同的源代码是通过过滤器(adapter)来区别用于不同的业务场景的。这种增强是用SE18 SE19来实现的。
BADI的查找方法:
1、BADI对象的信息存储在SXS_INTER,SXC_EXIT,SXC_CLASS和SXC_ATTR这四个表中。
2、SAP BADI程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例,这个方法实际就是对上面4个表和视图V_EXT_IMP和V_EXT_ACT进行查询和搜索的。我们可以在这个方法处设置断点,获取实例。
3、它的调用方式是call method(instance), 可以通过exit_handler关键词来查找。
4、ST05选择“table buffer trace”而不是常用的"SQL trace",然后查找上面的几个表和视图找到对应的BADI.
5、se18 查找接口,se19 实现接口就可以实现用户增强
四、第四代其实是第三代的加强switch Framework当sap进入newweaver 7.0以后推出的新增强体系,将BADI进行了改进,叫新BADI了。还新增 Enhancement Spot 和 Enhancement Section 以及隐式增强点的概念,基本可以在面向对象的程序里实现处处皆可增强的最高境界。
1 增强 用户出口
Customer Exits, 顾名思义,就是用户自定义出口。
有3类这样的出口:Function Module Exits; Menu Exits; Screen Exits
有两个常用的T-code:
CMOD: 用于增强项目的管理
SMOD: 增强项目的具体实现
Function Module Exits: 就是在标准程序中预置有形如call customer-function ‘NNN‘的call function语句,来动态调用相关的出口程序。‘NNN‘是3位数字,而实际的出口函数命名方式为:EXIT_<program name>_<exit number>。寻找这样的可以用SMOD的查询功能,同时也有一个程序可以用T-CODE来帮助查找。这个出口形式比较简单,所以就不举例子了。
Menu Exits: 个人觉得是用得比较少的一种出口,项目上很少使用,SAP预留的出口也很少。抓住几点关键就可以了,Menu Exits会有一个预留的function code 比如+PGE什么的
增强:SMOD
方法一、利用TCODE寻找增强(第二代的增强)
执行一个程序(源代码后附),在选择屏幕处输入你所需要增强的程序TCODE,执行後,就会出现一个列表,那里就有关于如何增强这个的绝大部分SMOD增强。
点击进去,自己手动寻找需要的增强。
这是第二代增强
方法二、利用系统函数寻找
MODX_FUNCTION_ACTIVE_CHECK
在这个FUNCTION的代码最后添加一个断点。执行需要增强的TCODE,如果有增强,就会自动跳入DEBUG界面。在DEBUG界面,查看f_tab字段,这里面所显示的Smod就是关于这个TCODE所有的增强项目的列表。这些增强都是属于EXIT_XXXXXX_XXX这种形式。
至于如何查看这个增强是属于哪个SMOD,可以自己查阅 MODSAP这个表(SAP Enhancements).
这是第二代增强。
还有一些FUNCTION供参考:
[1].DYNP_VALUES_READ
[2]. MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)
[3].MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)
[4].MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
[5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)
这些的使用方法和上述的一样,可以针对各种情况寻找增强。
方法三、从程序代码中找
在需要增强的事务里面,打开SYSTEM——》status,双击进入PROGRAM,查看所有的subroutines, 重点观察所有形似 userexit_******* 这种,由描述来确定合适的需要增强的FORM。这里是第一代的增强。
方法四、针对BADI的增强
1、badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中。
2、sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。
3、基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。
4、se18 查找接口,se19 实现接口就可以实现用户增强。