一、增强的概念
SAP 开发除了接口和报表,还有增强开发。接口和报表是自开发的内容,增强就是SAP系统中标准程序的出口,在该出口中由用户根据企业实际需求编写客户化逻辑代码。
增强是SAP系统设计时考虑到企业实际的流程有可能和系统默认标准流程不同,在标准流程框架下专门留的接口。
每个接口对应一个客户化函数,这些出口函数有标准处理程序传入的参数和输出参数,用户可根据系统输入参数做条件编写适合本企业流程的逻辑,然后通过输出参数传输回。
二、增强的分类
1.用途分类
E类
Enhancement exits ,即通常所谓的用户出口( User_ exit )。用户出口也叫功能出口(Function Exit)。
使用Tcode:SE37,搜索EXIT*,找到的函数大都是做系统预留的出口函数,前面说过,用户出口是标准程序留给用户的接口,标准程序通常不允许用户任意修改,如果修改需要申请Access Key ,而且修改标准程序可能导致的错误erp公司通常是不负责的。在SAP中自定义的程序通常以保留字 Y或Z开头,因此,出口函数中都预包含了一个 Z 开头的程序。
C类
GUI接口(Gui Codes)。菜单增强就属于这类增强。
S类
屏幕增强(Screen Exit)。 比如,在建立采购订单,工单和固定资产主数据时,系统都预留屏幕增强,也就是说允许用户自定义用户输入界面并编写相应的输入输出处理程序。
T类
在各类增强中,可能还 用户自己定义结构或表格,系统对应类型T类。比如增强MM06E005允许用户建 立两个结构CI_ EKKODB和CI_ EKPODB。(数据库增强)
2.发展分类
第一代增强(增强嵌入标准程序中)
第一代增强(基于源代码的增强)是sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码,它们在发布的时候都是空的,集中在一些文件名倒数第二个字符为Z的包含程序中,由于在标准程序中,所以所有程序的全局数据都可以使用,但同时 系统升级时会被新版本覆盖;这种源代码增强和屏幕增强的说明可以从事务码spro后台配置中相关模块的路径里面找到; 一般是以UserExit_ 打头的子模块。这类增强事先要到service marketplace申请对象键(ACCESS KEY) ,然后才能修改这些子程序。
第二代增强(SMOD,CMOD)
第二代增强(基于函数模块的增强) , 用事务SMOD和CMOD来维护;
在SAP发布的早期版本中, Call Function ‘EXIT_ 主程序_ XXX’ 来调用函数模块;而在较新的版本中使用Call Customer-Function ’ XXX’ 调用函数模块的。第二代增强函数名构成: Exit_ 主程序名’XXX(3 digital number)’, 这样你就可以找到对应的增强函数模块了,它们在发布的时候只有一句代码Include ’ZXXXXXXX’ , 修改时无需像第一代增强一样需要Access Key,直接双击回车就可以了,但同时这种增强以及后面几代的增强都不能像第一代一样 随便使用程序的全局数据,只能使用接口中传递进来的参数。
第三代增强(BADI,SE18/SE19)
第三代增强(基于面向对象概念的增强BADI ( business add-in ) ),源代码发布以接口的方式,通过接口的方法调用来实现使用的。用户增强实际上是实现-个或多个基于这个接口的实现类,因为接口类实际上是一个抽象类,所以对同一个增强会出现不同的源代码,这些不同的源代码是通过过滤器(adapter)来区别用于不同的业务场景的。这种增强是用事务SE18和SE19来实现的。
第四代增强 ( Enhancement Framework )
第四代其实是第三代的加强switch Framework。 当sap进入newweaver 7.0以后推出的新增强体系,主要包含四个方面:
Source Code EnhancementImplicit enhancement option 隐式增强
Explicit enhancement option 显示增强
Enhancement pointSAP增强
Enhancement sectionSAP New Enhancement Framework代码增强
Function Group EnhancementClass Enhancement.
三、示例—以采购申请增强为例做一个 BADI 增强
方法1:事务代码:se18
采购申请的 BADI 名称是 ME_PROCESS_REQ_CUST,输入名称点击显示,可以查看方法和接口参数。
点击功能栏》实施》创建,会出现方法2中的弹框。
方法2:事务代码:se19,输入 BADI 名称
以 Z 开头命名,点√
输入描述(实施短文本),点击保存。
点击对应的方法,编辑代码。这里是行项目的方法,我们写一个当数量大于100时,弹出错误类型提示。
PS:一定要激活才能生效。
当我们输入事务代码 ME52N ,数量输入大于100时,会报错我们增强里写的信息。
实例代码如下:
method IF_EX_ME_PROCESS_REQ_CUST~PROCESS_ITEM.
DATA: obj_header TYPE REF TO IF_PURCHASE_REQUISITION,
re_header TYPE MEREQ_HEADER,
re_item TYPE mereq_item.
//获取基本数据
obj_header = im_item->GET_REQUISITION( ).
re_header = obj_header->get_data( ).
re_item = im_item->get_data( ).
DATA:menge TYPE EBAN-MENGE,
bsmng TYPE EBAN-BSMNG.
IF re_item-FRGZU = 'X' AND re_item-BSMNG = 0.
SELECT SINGLE menge INTO menge FROM eban WHERE BANFN = re_header-BANFN and BNFPO = re_item-BNFPO.
IF SY-SUBRC = 0.
IF menge is not INITIAL and menge > re_item-menge.
MESSAGE 'PR已审批,禁止增加数量和新增行项目!' TYPE 'E'.
ENDIF.
ENDIF.
ENDIF.
endmethod.
参考文章:https://www.jianshu.com/p/5646194449f9