第一代:基于源码增强(子过程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实现接口就可以实现用户增强。

第四代:Enhancement Framework 

       在不改变(或尽量少改变)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提供了一个标准程序SNIF,通过这个程序可以直接查找出系统已经实施的BAdi、BTE、客户出口、字段出口甚至是调用的BAPI。具体操作方法:打开【系统】|【状态】菜单,双击进入程序,点击【对象列表】按钮,然后通过点击【上级对象列表】按钮,找到程序所在的包。SE38运行程序SNIF,输入包名,如果勾上【也选择SAP实施业务加载项】就会把SAP标准的增强实现也显示出。运行后,可以点击各Tab页查看已经实现的自定义增强。

 

posted on 2017-06-15 17:52  ~秋无痕~  阅读(6647)  评论(0编辑  收藏  举报