前言:
SAP ABAP,增强就是对SAP 标准程序功能的扩充。比如在事物码ME21N 新建PO 时,
在保存时需要做一些特定的检查,这时候就需要用到增强:
【 ME_PROCESS_PO_CUSE 】
SAP 系统已经给我们预设好了很多增强,我们只需要往这些增强里写代码就行了。
以下以个人理解,粗略的介绍下:
SAP增强按照历史先后, 主要四类:
-
1.第一代(基于源代码的增强)是SAP提供了一个空代码的子过程,
现在多用于SD模块的销售订单增强:SAPMV45A 程序,还有PP模块(学习中)
这个子过程中,用户可以添加自己的代码,控制自己的需求。
这类增强需要修改sap的标准代码,它们在发布的时候都是空的,
集中在文件名倒数第二个字符为 Z 的包含程序中,
因为在标准程序中,所以:
(1)程序的全局数据可以使用。
弱点:系统升级时会被新版本覆盖;
这种源代码增强和 屏幕增强的说明
可以从Tcode:
SPRO 后台配置的相关模块的路径里找到;
一般是 UserExit_ 打头的子模块。
这类增强事先要到 service marketplace 申请对象键(Access key),
然后才可以修改这个子程序。
这类增强比较多用在SD模块,比如创建SO 时(VA01).
-
2.第二代增强(基于函数模块的增强),用SMOD和CMOD 维护
在SAP发布的版本中,使用Call customer-function 'xxx'调用函数模块的,
所以你可以通过在程序中搜索
cusomer-function 来查找第二代增强,
第二代增强函数名构成:EXIT_程序名_'xxx',
这样你就可以找到对应的增强函数模块了,它们在发布的时候只有一句代码
include 'xxx'
修改时无需像第一代增强一样需要ACCESS key,直接双击回车就可以了。
从第二代增强都是 子程序了,include or ???
只能使用接口中传递进来的参数。
第二代增强主要有以下几类:
1)E. Enhancement exits:
这些出口以Exit_ 打头,你可以到SE37 中查看,
也可以在表 TFDIR 中查询Exit_ 打头的函数,
2)C. Gui codes,(GUI增强)
3)S. Subscreen (屏幕增强)
4)T. include structure 表/结构 增强,
SAP扩充(增强表) MODSAP,里面记录了所有的smod 增强,
这个表里重要字段
NAME X 增强名
TYP X 组件类型
MEMBER X 增强
TFDIR 函数清单
重要字段:
FUNCName(函数名),
MAND(功能模块激活状态如果是C代表此函数模块激活)。
曾经被问过这个问题 CMOD和SMOD的差别:希望能和大家交流
都是用CMOD曾经实施,SMOD可以查看实施的组件
-
3.第三代增强(基于面向对象概念的增强 BADI-[ business add-in ]),使用SE18管理,SE19实施,
(1)SAP保证所有BADI的向上兼容性。版本升级不影响标准系统中增强的调用,也不会影响调用接口的有效性。你不必在SSCR中注册BADI。
(2)只能使用一次实施,增强功能可以同时被任意数量的客户激活。?
BADI可根据过滤器的值定义。这使您可以根据特定的标准来控制实施(例如:按照在特定国家)。
(3)BADI包含了所有必要实现特定任务的接口。?
源代码发布以接口方式,通过接口的方法调用来实现使用。
自定义增强实际上是实现一个或者多个基于这个接口的实现类,
因为-接口类实际上是一个抽象类,所以- 对于同一个增强会出现不同的源代码,
这些不同的源代码通过 过滤器(adapter) 来区分不同的 业务场景。
Tcode:SE18, SE19 来实现,
***BADI 的查找方法:
1)BADI 对象的信息存储在
SXS_INTER,
SXC_EXIT,
SXC_CLASS,
SXC_ATTR 这四个表
其中 SXC_ATTR 【Exit: Implementationsseite: Attribute】可以找到自建BADI,
IMP_NAME CHAR 20 0 业务加载项实施
VERSION CHAR 6 0 版本号
ACTIVE CHAR 1 0 客户增强激活
MST_LANG LANG 1 0 语言代码
ANAME CHAR 12 0 最后修改人
ADATE DATS 8 0 日期
ATIME TIMS 6 0 时间
UNAME CHAR 12 0 最后修改人
UDATE DATS 8 0 日期
UTIME TIMS 6 0 时间
LAYER CHAR 80 0 业务加载项管理的层值
MIG_ENHNAME CHAR 30 0
2)SAP BADI 程序都会调用
cl_exithandler=>get_instance 来判断对象是否存在,并返回实例,
**我们可以在这个方法处设置断点,获取实例。
这个方法实际是对上面四张表和视图 V_EXT_IMP 和V_EXT_ACT 进行检索,
3)它的调用方式是call method(instance), 可以通过exit_handler关键词来查找。
4)ST05选择“table buffer trace”而不是常用的"SQLtrace",
查找上面的几个表和视图找到对应的BADI.
5)se18 查找接口,se19 实现接口就可以实现用户增强
-
4.第四代是第三代的加强switch Framework
-
SAP 进入NewWeaver 7.0后 推出的新增强体系,将BADI 改名叫新BADI。
还新增了 Enhancement spot 和Enhancement section 以及隐式增强点的概念,
基本在面向对象的程序里实现处处可以增强,
这类增强一般
可以加在一个函数过程的开头和结尾的地方。 -
***隐式增强:
1)寻找隐式增强方法:
使用debug 方式,跟踪业务处理过程,记下经过的 程序,子程序,函数名,
最好是在标准业务结束前的最后环节,去确认是否有可用的隐士增强点。 -
如有,实施步骤:
(1)使用轮回眼圈圈:增强menu, -
(2)菜单:编辑-》增强操作-》显示隐式增强选项;
-
(3)代码框行号前有箭头的表明有隐式增强点,可以创建,
操作隐式增强点 4个menu:
创建,更改,替代,撤销,(所以隐式增强没有删除,是使用标准撤销)
(4)创建实施,声明代码;