ABAP 增强"/>
ABAP 增强
目录
一、概述
1、概念
2、项目中功能修改的流程和级别
3、增强应用案例
二、增强的发展
第一代,基于源代码的增强
1、简介
2、查找此类出口的方法:
3、实例:
第二代,基于函数模块的增强出口
1、简介
2、增强分类
3、增强相关函数和表格
4、Exit实现方法
5、SMOD和CMOD
6、查找Enhancement的方法
第三代,基于面向对象概念的增强BADI
1、简介
2、BADI存储
3、BADI查找方法
4、BADI实现方法
第四代,新BADI
1、简介
2、层次结构
3、BADI调用
一、概述
1、概念
- 增强(enhancement)的概念很广,SAP标准系统之上的所有二次开发,都可以理解为增强。
- 做增强的目的就是标准的sap正常的业务系统不能满足实际需求,需要增加不同的功能来达到不同企业的要求。
- ABAP开发的增强主要指的是标准系统事先预留好的接口,根据不同业务需求,进行开发,这种开发称为增强,又叫出口,如果增强满足不了,就只能修正(修改标准程序)。
对标准程序进行需求的添加,从而进行开发,才叫增强;如果是客户自定义的程序,我们自行开发程序,比如说出报表,不是增强而是自定义开发。
定制、个性化:通过后台配置达到特殊的需求,这是SAP预先留好的,但这不是接口。当定制满足不了的时候,就要用到增强了,增强就是填充预留好的接口(增强的方式有很多,接口的类型也很多)。 当增强还实现不了,就要修正来实现标准程序的改变。客户开发与标准开发也有所区别。
2、项目中功能修改的流程和级别
如果遇到要对标准的功能进行修改的话,第一反应是去向业务人员寻求帮助,看看功能能不能通过后台的配置来实现,这样就可以不用开发。
SAP四种用户出口(增强也叫做用户出口)的类型:
-
菜单出口-Menu Exits(在标准的菜单上加我们自己的菜单或功能码)
-
屏幕出口-Screen Exits(主要是在现有的屏幕增强或者创建子屏幕来增强)
-
功能模块出口-Function Module Exits(非常常见,函数增强,一般是具体的逻辑增强)
-
表/结构出口-structureExits(数据字典,通过append structure来增强)
3、增强应用案例
-
(1)业务检查(功能模块增强)
-
在某个工厂发货,设定在某个库位的出货只能使用某种移动类型
-
(2)界面增强(屏幕增强)
-
用户对某个字段要求大写,但是最终用户不按规范操作,可以在出口PBO中自动转换
-
有些模块能自定义数据库字段,并且可以在出口中增加字段输入
-
还有的模块能对输入数据检查,甚至实现自动替代等功能
-
(3)不规则业务的处理
-
按某种条件定价,设定从自己定义的表中按某种条件取值
-
(4)搜索帮助的出口
- 对Sap标准的搜索帮助做权限控制
二、增强的发展
第一代,基于源代码的增强
1、简介
- 功能增强:sap提供一个空代码的子例程,在这个子例程中用户可以添加自己的代码,控制自己的需求。
- 屏幕增强:以客户屏幕形式发布,它们包含在标准程序中,没有什么特别规律。
- 表/结构的增强是 append structure。
- 源代码增强和屏幕增强的说明可以从事务码 spro 后台配置中相关模块的路径里面找到。
- 需要修改sap的标准代码,集中在一些名称倒数第二个字符为Z的include程序中,所有程序的全局数据都可以使用。
- 一般是以UserExit_打头的子例程。
- 这类增强因为系统升级时会被新版本覆盖后不能使用,且如果在代码中改变了全局变量,还可能会破坏系统原有的逻辑,因而现在很少使用。
第一代增强,相当于修改源代码,做出来是有风险的,所以要谨慎。
2、查找此类出口的方法:
- 在需要增强的事务里面,点击工具栏上的“Display Object List”按钮,选择Subroutines,查找以“UserExit”开头的子例程,根据子例程的注释来找到对应的用户出口。
- 这类增强事先要到Service Marketplace 网站上申请对象键(ACCESS KEY),然后才能修改这些子程序。
3、实例:
- SAPMV45A=>MV45AFZZ =>FORM USEREXIT_SAVE_DOCUMENT 。
- USEREXIT开头的都是空的子程序,可以添加自己的代码。
第二代,基于函数模块的增强出口
1、简介
- 源代码增强以函数模块形式发布,在SAP的发行版本中使用 CALL CUSTOMER-FUNCTION 调用这些函数模块,它们在发布时只有一句代码 INCLUDE xxxxxxx。
- 用户增强时,无需申请对象键,直接创建这个INCLUDE xxxxxxx,编写相应的代码。
- 这些函数模块中只能使用接口中传递的参数,不能使用调用程序的全局变量。
2、增强分类
- 功能模块增强: 这些出口是以 Exit_打头的函数,可以到SE37中查看,也可以在数据字典中TFDIR(函数表)中查询Exit_打头的函数。
- 子屏幕增强。
- GUI status功能码。
- Include structure增强。
3、增强相关函数和表格
Function:
- DYNP_VALUES_READ
- MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)
- MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)
- MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
- MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)
Table:
- TFDIR->function module table
- MODSAP->sap enhancement table
- TSDIR->Dynpro Areas CALL CUSTOMER SUBSCREEN(屏幕增强)
- CUATEXTS-> GUI Interface: Menu Texts Changed(GUI 菜单文本增强)
MODSAP,这个表里重要的字段增强名(Name),组件类型(TYP: E C S T)
组件功能模块名(Member):里面记录了所有enhancement的增强.
TFDIR ,所有的函数表,重要字段FUNCName(函数名),MAND(功能模块激活状态如果是C代表此函数模块激活).
4、Exit实现方法
Enhancement exits实现方法:
- SMOD:查看增强组件,CMOD:实现增强
- T-code:CMOD中创建一个Project,添加所要使用的Enhancement,激活目标Components
- 在目标Function module中编写功能代码
- Subscreens实现方法:
- T-code:CMOD中创建一个Project,添加所要使用的Enhancement,激活目标Components
- 通过SMOD定位到目标程序,创建与其对应的屏幕号,屏幕属性为Subscreen,并编写功能代码
5、SMOD和CMOD
- SMOD包含具体的增强。(查看)
- CMOD是包含一组SMOD编写的增强,通过CMOD激活增强程序。(建一个增强的项目)
T-CODE:SMOD
T-CODE:CMOD
一个项目可以拥有多个组件。
点击函数模块进入,再点击显示对象列表,在包含中找到与INCLUDE后面同名的文件,点击右键选择创建。
返回即可看见“实施”列已打勾,表明组件已实现,激活后才可使用。
6、查找Enhancement的方法
- 代码找增强(有些exit使用它并不能找到)
查找增强的程序为ZTEST_ENHANCEMENT_FIND 【程序为网上找的】
- 利用函数(MODX_FUNCTION_ACTIVE_CHECK)寻找增强
先在se37输入函数MODX_FUNCTION_ACTIVE_CHECK,并设置断点。
再随意输入一个T-CODE,进入后,输入一些字段后回车,进入DEBUG。
点击“继续”按钮
继续点击“继续”按钮,就可以在白色区域填写字段进行增强。
第三代,基于面向对象概念的增强BADI
1、简介
主要是面向对象(ooalv中有详细介绍)的方式,实际上是把某一个实际的业务对象抽象成面向对象里面的对象,把它抽象成类,通过类的方法,实现某一个业务对象的动作的方法,比如屏幕修改、创建、显示(这方法其实跟函数差不多,只不过调用方式有所差异)。
第三代增强(基于面向对象概念的增强BADI(business add-in)),源代码发布以接口(指通过se24查看的接口)的方式,通过接口的方法调用来实现使用的。用户增强实际上是实现一个或多个基于这个接口的实现类,因为接口类实际上是一个抽象类(取好了名字,定义了方法的名字和参数,但是没有具体实现),所以对同一个增强会出现不同的源代码,这些不同的源代码是通过过滤器(adapter)来区别用于不同的业务场景的。这种增强是用SE18、SE19来实现的。【使用最多】
BADI和EXIT的区别:Exit中一个Enhancement只能使用一次,BADI一个接口可以被实现多次。
SE18是查看BADI。
SE19是为BADI接口创建一个实例,从而在里面实现想要增加的功能。
2、BADI存储
- BADI对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中(参见SECE包)。
- sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。
- 基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。
3、BADI查找方法
- SE24:CL_EXITHANDLER=>GET_INSTANCE中在CALL METHOD cl_exithandler=>get_class_name_by_interface上设置断点
- 通过ST05跟踪,badi对应的数据表为 SXS_INTER, SXC_EXIT, SXC_CLASS 和 SXC_ATTR,而这些表都是通过视图V_EXT_IMP 和 V_EXT_ACT来查询的。
- 打开运行事务码: ST05 选择“table buffer trace”而不是常用的"SQL trace"
- activate trace(开始跟踪)
- 运行事务码:me21n+、、7
- 创建一个采购订单,保存
- deactivate trace(结束跟踪)
- 点击display trace, 在出来的选择条件中: objects中输入:V_EXT_IMP和V_EXT_ACT;在 operations中输入“OPEN”
- 查询 通过查询的结果可以看出,视图V_EXT_IMP的BADI的接口类名字都是以IF_EX_开头的,其中IF_EX_之后的就是对应BADI接口的定义。
4、BADI实现方法
T-CODE:SE19,实例化接口生成一个类,SE24中编写功能代码。
第四代,新BADI
1、简介
- New BADI 就是所谓的enhancement spot中多BADI Definition.
- enhancement spot下面可以定义若干个BADI definition,BADI Definition可以通过se18进行创建查看修改。
- BADI Definition里面包含一个interface ,有且仅有一个interface,是一一对应的一个关系,除此以外,还包含若干个filter ,这些filter的数量也没有什么限制,filter可以通过se18进行创建查看修改。
- enhancement spot可以创建无数enhancement Implementation,通过se19进行创建修改和删除,在创建BADI implementation的时候需要指定BADI implementation的名字,Implementation class的名字,需要注意的是,每个BADI definition都对应一个interface,BADI implementation的class,实现了相应的interface。
2、层次结构
3、BADI调用
DATA:Z_BADI TYPE REF TO Z_TEST_BADI.
GET BADI Z_BADI.
CALL BADI Z_BADI->SAY EXPORTING FORSAY = 'Hi you'.
更多推荐
ABAP 增强
发布评论