第一代:基于源码增强(子过程subroutine)

第一代增强基于源代码,是SAP提供的一个空代码的子过程。在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强集中在一些文件名倒数第二个字符为Z的包含程序中。 一般是以UserExit_打头的子过程,因此形象地称其为用户出口。

用户出口Include在SAP标准程序的源代码里,可以说是源代码的一部分,更改用户出口就相当于更改SAP标准程序,是需要在SAP Service MarketPlace里申请对象键(Access Key)才能更改,不需要建立工程;由于是在标准程序中,所以标准程序的全局数据都可以使用,但同时系统升级时会被新版本覆盖。

用户出口的说明可以从后台配置SPRO的相关模块的路径找到,大部分SD的出口都是此类增强。

查找此类出口的方法:
   1、在程序中查找文件名倒数第二个字符为Z的Include包含程序。
   2、在后台查找对应的模块增强:在程序中搜索USEREXIT_打头的子过程;在SAP中以PERFORM的形式被调用。
   3、单击”Display Object List”按钮,在子程序列表查找“UserExit_”打头的子过程。

第二代:基于函数模块增强(Function)

第二代增强基于函数模块,用事务:SAP增强管理(SMOD)和增强编辑器(CMOD)维护。在SAP发布的版本中,使用Call Customer-Function 'xxx'调用函数模块,所以可以通过在程序中搜索 Customer-Function来查找第二代增强,第二代增强函数名构成为Exit_程序名_'xxx(3 digital number)'。它们在发布时只有一句代码include "ZXxxxxxx",修改时无需像第一代增强一样申请对象键,直接按两次Enter键就可以了。但同时这种增强以及后面几代的增强都不能像第一代一样随便使用程序的全局数据,只能使用接口中传递进来的参数。由于带有关键字Customer,故被称为Customer Exits(客户出口)。
   第二代增强主要有4类:
   E.Ehancement exits:这些出口以Exit_打头,可以在SE37中查看,也可以在数据字典TFDIR(函数表)中查询Exit_打头的函数
   C.GUI codes(GUI增强):用于区域菜单和工具菜单栏的增强
   S.Subscreens(屏幕增强):用于子屏幕设计增强
   T.include structure增强:用于表结构的增强
   另外,按用途分类:
   功能模块出口(Function Module Exits):在SAP标准事务中添加业务逻辑,一般用于验证标准事务中的字段
   屏幕出口(Screen Exits):定义自己的子屏幕嵌入应用屏幕,在标准事务中添加子屏幕
   菜单出口(Menu Exits):定义自己的菜单项或激活屏蔽标准事务中的菜单项
   表出口(Table Exits):与上述T型出口一样,属同一类型
   数据元素出口(Data Element Exits):在ABAP/4字典的关键字数据元素中添加文档。结果是在使用这些数据元素的字段处按F1键后会出现自定义的说明文档
   关键字出口(Keyword Exits):在ABAP/4字典中的关键字数据元素更改表示文本
   字段出口(Field Exits):根据ABAP/4字典中域验证某些标准事务的某些屏幕字段。

Ehancement 比较重要的表
   MODSAP:SAP扩充表,重要字段增强名(Name)、组件类型(TYPE:ECST)、组件模块名(Member)里面记录了所有Enhancement的增强
   TFDIR:功能模块表,重要字段FuncName(函数名)、功能模块激活状态MAND(如果是C,代表此函数模块激活)
   TSDIR:动态程序区CALL CUSTOMER SUBSCREEN(屏幕增强)
   CUATEXTS:修改GUI界面,菜单文本被客户改变(GUI菜单文本增强)
   MODSAPA:SAP扩展的属性
   MODATTR:SAP增强项目属性
   TADIR:资源库对象的目录
   TFTIT:函数功能的短文本

查找Ehancement 的方法:
   1、查找关键字
   在程序中搜索Customer-Function,找到后面的3位数字后缀,然后出口函数组成就是Exit_程序名_3位数字后缀
   2、代码查找
   3、利用系统函数寻找增强
   常与出口相关的函数有:
   DYNP_VALUES_READ
   MODX_ALL_ACTIVE_MENUENTRIES 菜单增强
   MODX_FUNCTION_ACTIVE_CHECK 函数增强
   MODX_MENUENTRY_ACTIVE_CHECK 菜单增强
   MODX_SUBSCREEN_ACTIVE_CHECK 屏幕增强
   可以在函数最后设置断点,然后通过运行对应的增强程序就会调用这样的函数,这样就可以在调试模式下找到对应的增强。

第三代:基于类的增强(BADI)

BADI(Business Add-in)是一个新的SAP增强技术,是基于ABAP的面向对象技术。源代码的发布是通过接口的方法调用来实现使用的。此类增强实际上是实现一个或多个基于这个接口的实现类,因此对同一个增强会出现不同的源代码,这些不同的源代码是通过过滤器(Adapter)来区别用于不同的业务场景的。这种增强使用事务码 SE18 定义、SE19 实现。 SAP预定义了一些接口(Interface),客户可以自行定义实现Interface的类(Class),在标准程序中会调用客户自定义类的实例,获取实例的过程使用了工厂模式。

业务交易事件(BTE,Business Transaction Events)是SAP的一种增强方式,技术上讲是介于第二代增强(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),选择环境。

BADI查找方法:

BAdI对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和 SXC_ATTR这4张表中(参见SECE包)。SAP BAdI程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例。这个方法实际就是对上述4张表及视图V_EXT_IMP 和 V_EXT_ACT进行查询和搜索。基于以上机理有以下方法:

(1)使用SE24进入Class Builder,查找CL_EXITHANDLER,进入get_instance方法,在get_class_name_by_interface调用处设置断点。Debug需要增强的事务,在断点处查看exit_name即可找到对应的BAdI。

(2)使用性能分析器(事务码ST05)跟踪。

1、运行事务码ST05,选择“table buffer trace”,而不是常用的“SQL trace”

2、activate trace(开始跟踪)

3、运行事务码:me21n

4、创建一个采购订单,保存

5、deactivate trace(结束跟踪)

6、点击display trace,在出来的选择条件中: objects中输入:V_EXT_IMP和V_EXT_ACT;operations中输入“OPEN”

7、查询,通过查询的结果可以看出,视图V_EXT_IMP的BADI的接口类名字都是以IF_EX_开头的,其中IF_EX_之后的就是对应BADI接口的定义。

(3)SE18查找接口,SE19实现接口就可以实现用户增强

第四代:EnhancementFramework

在不改变(或尽量少改变)SAP标准程序的情况下满足客户的定制开发需求。Keep less Modification.

Enhancement Framework的基本概念:

Ehancement Spot: 用来组织Enhancement options,it's a container of Enhancement options.

Enhancement Implementation:用来组织Enhancement options的实现代码。

隐式增强

隐式增强就是系统内置的Enhancement options,是系统本身就预留的,如在:执行程序,包含程序,函数组,对话模块的结尾;Form例程,函数模块,方法等的开始和结尾;结构的结尾这些地方都会有。Implicit enhancements comprise class enhancements, function group enhancements and predefined enhancement points at particular predefined positions such as the end of a report, a function module, an include or a structure and the beginning and the end of a method.

显示增强

显式增强就是手工加入到程序中的Enhancement options,有两种显式增强:

ENHANCEMENT-POINT: 只有一个预留点, 没有代码,用来在程序中直接插入新的功能代码,其概念与BADI的USER_EXIT类似,标准程序预留了部分已定义好的增强点可以让ABAP做插入代码来实现这个增强(也可以自定义增强点,但不能自定义增强选项,增强选项一定是系统预留下来的,如果没有增强选项则该处不可做增强),但是不能做屏幕和菜单增强。

其最大的优势在于方便,可以使用程序中已定义的变量,不像BTE和Customer EXIT中只能使用函数接口传过来的参数。

一般增强步骤:

1、DEBUG标准程序找到需要增强的位置,点EDIT->SHOW IMPLICIT ENHANCEMENT OPTIONS查看是否有预留增强选项(标准程序不能自己创建enhancement option ,只能使用系统预留的)。

2、创建增强点实现

为自己程序创建显示增强选项Explicit Enhancement options

单击[创建选项]菜单进入创建增强选项界面,输入增强点名及增强容器名(以Z开头),确认回车。

注:Enhancement Spot 就是SE18中的Enhancement Spot

随后Editor上会多出一条语句,然后单击按钮切换增强模式。

光标定位到增强语句上,单击[创建实现]菜单项创建增强点实现。

注:Enhancement Spot相当于一个容器,创建一个增强点的必要条件是要有一个容器。每个增强点都可以创建到这个容器当中,也可以再创建一个容器。

删除这个容器的方法:在本地对象或它的包中删除或在SE18中删除,激活程序,退出后再打开程序。

ENHANCEMENT-SECTION: 用来替换原有的功能代码,ENHANCEMENT-SECTION 和 END-ENHANCEMENT-SECTION之间有代码, implementation 之后, 替换旧代码,只执行新代码,原来的代码不再执行。

两者的区别是:enhancement-point没有代码,只有一个预留点,允许在这个位置插入新代码(implementation),类似于AOP.而enhancement-section和end-enhancement-section.之间有代码,implementation之后,替换旧代码,只执行新代码,原来的代码不再执行,类似于OO中的方法重写/覆盖。

SAP增强Enhancement的更多相关文章

  1. SAP 增强-出口选找方法-全部

    ■ SAP 中如何寻找增强 方法一:利用TCODE寻找增强(第二代的增强) 执行一个程序(源代码后附),在选择屏幕处输入你所需要增强的程序TCODE,执行後,就会出现一个列表,那里就有关于如何增强这个 ...

  2. SAP 增强说明

    转自http://blog.csdn.net/lyb_yt/article/details/8177974 (一)什么是增强(Enhancement)? 简单地说,增强就是ERP系统中标准程序的出口, ...

  3. SAP 增强表MODSAP 和TFDIR

    2.第二代增强(基于函数模块的增强),用于SMOD和CMOD 维护 在SAP发布的版本中,使用Call customer-function 'xxx'调用函数模块的, 所以你可以通过在程序中搜索 cu ...

  4. SAP增强 和VA01相关增强点介绍

    -转 sap寻找用户出口方法 sap的用户出口总共有三代: 一.User EXIT 第一代的用户出口,它们include在SAP标准程序的源代码里,可以说他们是源代码的一部分,你改了这种出口就相当于改 ...

  5. [SAP ABAP开发技术总结]增强Enhancement

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. SAP 隐式增强 Enhancement point

    1.进入编辑器:SE38/SE37/SE24 Edit-->Enhancement Operations-->Create Option 2.填写相关信息,点击对号. 3.点击Enhanc ...

  7. 几种sap增强的查找方法

    ***方法一**************************************** 通过SE30,运行TCODE后,点Evaluate后,查看运行时间分析评估:命中清单. 找以“exit”开 ...

  8. SAP 增强篇 Method1 BADI增强的查找方法

    查找BADI的方法:(1)通过SE24,输入CL_EXITHANDLER,然后在方法GET_INSTANCE中设置断点,然后运行事务代码判断 exit_name的值,操作过程如下:输入se24,然后输 ...

  9. SAP增强总结-第二代增强(SMOD、CMOD)【转载】

    第二代增强比第二代增强安全性提高了很多,第一代增强毕竟是在原标准程序中修改,大部分传递参数都可以直接使用,第二代增强做了一些封装,对用户可以修改的参数做了限制. 1.增强点查找方法 首先根据事物码找到 ...

随机推荐

  1. centos7网卡名称修改以及配置

    1.vi /etc/sysconfig/network-scripts/ifcfg-enoxxxxxx 为ifcfg-eth0并 将里面的NAME项修改为eth0 2.禁用该可预测命名规则.在启动时传 ...

  2. svn常用功能使用简介

    1.文档库地址: https://xxx.xxx.xxx.xxx/svn/ 2.svn添加文件 2.1 在本地电脑上任何空白地方,右键-->打开“浏览版本库(Repo-browser)”,如图: ...

  3. linux 编程笔记 2

    1.使用create建立文件: #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include ...

  4. (转)Linux之split命令详解

    Linux之split命令详解 原文:http://m.jb51.net/article/73632.htm Linux split命令用于将一个文件分割成数个,该指令将大文件分割成较小的文件,在默认 ...

  5. Spring自动注入有关的注解

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. 1,@Comp ...

  6. Shell笔试题2

    1. 从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":"分割的 ...

  7. Cmd命令 关机

    at 22:00 Shutdown -s 到了22点电脑就会出现"系统关机"对话框,默认有30秒钟的倒计时并提示你保存工作 Shutdown.exe -s -t 3600 这里表示 ...

  8. C 碎片六 函数

    一.程序编译执行过程 程序的编译执行过程分为4个阶段:预处理阶段.编译阶段.汇编阶段.连接阶段 1. 预处理阶段:预处理器(cpp)处理以头文件.宏.条件编译(字符#开头)等内容的替换.此阶段不进行语 ...

  9. 基于screen.width的伪响应式开发

    一.站在用户的角度看问题 一个用户,访问一个web页面的真实场景是怎样的呢? 下面是某用户访问某站点的一个场景: 1. 小明打开了自己的电脑,访问了鑫空间-鑫生活: 2. 小明体内洪荒之力无法控制,疯 ...

  10. a href="javascript:"与a href="#"

    <a href="javascript:;"></a> <a href="#"></a> 这两种写法.这两种写法 ...