SAP几种增强方式
一,USER EXIT (基于源码的增强)
二,CUSTOMER EXIT(基于函数模块的增强)
三,BADI(基于类的增强)
四,Enhancement Framework(隐式增强)
五,BTE
六,校验和替代(FI模块)
一、USER EXIT
第一代增强基于源代码,是SAP提供的一个空代码的子过程。在这个子过程中用户可以添加自己的代码,控制自己的需求。一般是以UserExit_打头的子过程,所以一般也称用户出口。
用户出口Include在SAP标准程序的源码里,更改用户出口就相当于更改SAP标准程序,S4以前版本要在SAP Service MarketPlace里申请对象键(Access Key)才能更改,S4版本可以点击编辑使用修改助手直接更改。
示例:例如在子程序MV45AFZZ 的
FORM USEREXIT_SAVE_DOCUMENT_PREPARE.
中增强:
方便之处是标准程序的全局变量都可以使用,但是不能支持系统升级,如果升级需要手工迁移代码,就是要重新创建增强。
用户出口的说明可以从后台配置SPRO的相关模块的路径找到,大部分SD的出口都是此类增强。
查找此类出口的方法:
1、在程序中查找文件名倒数第二个字符为Z的Include包含程序。
2、在后台查找对应的模块增强:在程序中搜索USEREXIT_打头的子过程;在SAP中以PERFORM的形式被调用。
3、单击”Display Object List”按钮,在子程序列表查找“UserExit_”打头的子过程。
二、CUSTOMER EXIT
用事务:SAP增强管理(SMOD)和增强编辑器(CMOD)维护。
在SAP发布的版本中,使用Call Customer-Function 'xxx'调用函数模块,所以可以通过在程序中搜索 Customer-Function来查找第二代增强....
详细可参考 :增强篇6 CMOD增强
三、BADI
BADI(Business Add-in)是一种面向对象的增强技术。
源代码的发布是通过接口的方法调用来实现使用的。此类增强实际上是实现一个或多个接口的实现类,因此对同一个增强会出现不同的源代码,这些不同的源代码是通过过滤器(Adapter)来区别用于不同的业务场景的。
这种增强使用事务码 SE18 定义、SE19 实现。 SE18用于创建及维护BADI对象;SE19用于维护BADI的实例。
SAP预定义了一些接口(Interface),客户可以自行定义实现Interface的类(Class),在标准程序中会调用客户自定义类的实例。
BADI的查找方法:
1、主程序都会调用cl_exitHandler=>get_instance(这只是经典BADI是这样来调用的,如果是新式的BADI,则调用为GET BADI handle-BADI定义名、CALL BADI handle->method)来判断对象是否存在,并返回实例。我们可以在se24中对类cl_exitHandler=>get_instance方法进行调试,运行一个tcode,看一下exit_name的值,这就是要找的BADI
2、在主程序中搜索cl_exitHandler,查看它所引用(TYPE REF TO)的接口名,根据接口命名规则 IF_EX_
3、通过程序查找
BADI 的主要信息存在这4张表:
SXS_INTER text:Exit: Definition side: Interfaces
SXC_EXIT Exit: Implementation side: Assignment: Exit - Implementation
SXC_CLASS Exit, implementation side: Class assignment (multiple)
SXC_ATTR Exit: Implementation side: Attributes
BADI实施 可参考:增强篇1 PO保存增强
还有个有意思的问题:Classic BAdi and New BAdi
四、Enhancement Framework
Enhancement Framework的基本概念:
-
Ehancement Spot: 用来组织隐式增强选项,它是隐式增强选项的容器。
-
Enhancement Implementation:用来组织隐式增强选项的实现代码。
隐式增强就是系统内置的Enhancement options,是系统本身就预留的,如在:执行程序,包含程序,函数组,对话模块的结尾;Form例程,函数模块,方法等的开始和结尾;结构的结尾这些地方都会有。
对应隐式增强,还有个显示增强 显式增强就是手工加入到程序中的Enhancement options,有两种显式增强:
ENHANCEMENT-POINT: 只有一个预留点, 没有代码,用来在程序中直接插入新的功能代码,其概念与BADI的USER_EXIT类似,标准程序预留了部分已定义好的增强点可以让ABAP做插入代码来实现这个增强(也可以自定义增强点,但不能自定义增强选项,增强选项一定是系统预留下来的,如果没有增强选项则该处不可做增强),但是不能做屏幕和菜单增强。
示例:
其最大的优势在于方便,可以使用程序中已定义的变量,不像BTE和Customer EXIT中只能使用函数接口传过来的参数。
一般增强步骤:
1、DEBUG标准程序找到需要增强的位置,点EDIT->SHOW IMPLICIT ENHANCEMENT OPTIONS查看是否有预留增强选项(标准程序不能自己创建enhancement option ,只能使用系统预留的)。
2、创建增强点实现
五、BTE
业务交易事件(BTE,Business Transaction Events),
技术上讲是介于第二代增强(Customer Exits)和BAdIs之间的产物。这类增强为会计模块独有的增强,用于财务会计模块(Open FI)、总账会计(FI-GL)、应收账款和应付账款(FI-AR/FI-AP)及销售和分销(SD)的组件。
有两种类型,类似于会计凭证校验和替代:
1、Publish and Subscribe Interface:只提供SAP数据源,可以供外部程序使用或达到数据检查的目的。
用于告诉外部软件在SAP标准应用中触发了某些事件,并且把产生的数据提供给他们。外部软件不能给R/3系统返回任何数据,可以用在以下地方:主数据被创建、修改或锁定;凭证被输入、预制、修改或冲销;项目被清除或重置也可以在附加的开发中基于此事件和数据产生附加的处理:启动工作流;产生或修改附加数据;请求通信
2、Process Interface:可以达到数据修改的目的,用来增强标准的业务流程。
用于控制与标准R/3系统处理方法不同的业务流程,也就是用Process Interface替换标准处理。它们干预标准流程,并返回数据给SAP应用。
BTE查找方法,两种方法:
1、运行事务码(例如XK02),选择Sytem-Status,双击Program(screen),选中In main Program,查找OPEN_FI_PERFORM字符串
2、IMG-财务会计全局设置(新)-工具-客户增强-业务事务事件(FIBF),选择环境。
BTE实现:后续会单独写一遍文章介绍。增强篇9 BTE
六、校验和替代
替代就是在会计凭证生产时(包括手工和自动过帐)允许用户根据需求对凭证抬头和凭证行项目进行一定的内容修改,这种灵活的功能可以满足一些非常变态的需求,要不怎么说SAP什么东西都能轻易配置出来呢?
比如国内很多企业都要求会计凭证有个文本摘要可对某些自动凭证根据规则写入一些文本摘要,或修改凭证的利润中心,功能范围等,同样,理论上讲,SAP系统几乎允许你修改会计凭证的任何内容,甚至包括会计科目,SAP一直强调科目没有级别,对自动科目设置非常严谨,所以修改会计科目通常发生在自动过帐时人工无法干预科目的情况,典型的是MIRO时科目只能对应供应商主数据科目,如果一个供应商发票校验需要对应应付或其他应付,系统就无法自动实行,就可采用科目替代。
替代Tcode:
OBBH:AP/AR/GL Doc.
OACS:AM Create Assets
OA02:Mass change Assets
GCVY:Global Substitution(In SPL,Company Level)
GCVX:Local Substitution(In SPL,Company code Level).
GGB1:各模块全部替代
替代如何工作?
相关表格:
GB01|T001Q|T80D|GB03|GB03T|GB31|GB31T||GB907|GB90|GB92|GB922|GB901
|OXT_GENOBJDTL|。
相关函数和程序:
FI_SUBSTITUTION_ACTIVE
FI_SUBSTITUTION_DOC
FI_SUBSTITUTION_HEADER
FI_SUBSTITUTION_ITEM
GBTDMFI0|
GBTDMFIJ|
RGUGBR00|
RGUGBR00|
GBTDMFIJ|GBTDMFIG|
MF05AIENJ
检验和替代实例:后续会单独写一遍文章介绍。 增强篇10 财务校验和替代
补充
标准程序SNIF,
通过这个程序可以直接查找出系统已经实施的BAdi、BTE、客户出口、字段出口甚至是调用的BAPI。
具体操作方法:打开【系统】|【状态】菜单,双击进入程序,点击【对象列表】按钮,然后双击程序名,找到程序所在PACKAGE。
SE38运行程序SNIF,输入包名,如果勾上【也选择SAP实施业务加载项】就会把SAP标准的增强实现也显示出。运行后,可以点击各Tab页查看已经实现的自定义增强。
以CO这个PACKAGE为例: