概念
- 增强的概念其实很广,SAP标准系统之上的所有二次开发,都可以理解为增强。
- 做增强的目的就是标准的sap正常的业务系统不能满足实需求,需要增加不同的功能来达到不同企业的要求
- ABAP开发的增强主要指的是标准系统事先预留好的接口,根据不同业务需求,进行开发,这种开发称为增强,又叫出口,如果增强满足不了,就只能修正。
SAP四种用户出口的类型
- 菜单出口-Menu Exits
- 屏幕出口-Screen Exits
- 功能模块出口-Function Module Exits
- 表/结构出口-structureExits
增强的发展
- 第一代,基于代码的增强
- 第二代,基于函数模块的增强出口
- 第三代,基于面向对象概念的增强BADI
- 第四代,新BADI
第一代,基于源代码的增强
简介
- sap提供一个空代码的子例程,在这个子过程中用户可以添加自已的代码,控制自己的需求。
- 屏幕增强以客户屏幕形式发布,它们包含在标准程序中,没有什么特别规律。
- 表/结构的增强是append sturcture
- 源代码增强和屏幕增强的说明可以从事务码spro后台配置中相关的路径里面找到
- 需要修改sap的标准代码,集中在一些名称倒数第二个字符为Z的include程序中,所有程序的全局数据都可以使用
- 一般是以UserExit_打头的子例程
- 这类增强因为系统升级时会被新版覆盖后不能使用,且如果在代码中改变了全局变量,还可以会破坏系统原有的逻辑,因而现在很少使用使用
查找此类增强的事务里面,点击工具栏上的"Display Object List"按钮,选择* Subroutines,查找以"UserExit"开头的子例程,根据子例程的注释来找到对应的用户出口。
- 这类增强事先要到Service Marketplace 申请对象键(ACCESS KEY),然后才能修改这些子程序。
第二代,基于函数模块的增强Exit
简介
- 源代码增强以函数模块形式发布,在SAP的发行版中,使用CALL CUSTOMER-FUNCTION调用这些函数模块,它们在发布时只有一句代码INCLUDE xxxxxxx.
- 用户增强时,无需申请对象键,直接创建这个INCLUDE xxxxxxxx,编写相应的代码。
- 这些函数模块中只能使用接口中传递的参数,不能使用调用程序的全局变量
第二代增强中主要有4类
- 功能模块增强:这些出口是以Exit_打头的函数,可以在se37中查看,也可以在数据字典中TFDIR(函数表)中查询Exit_打头的函数
- 子屏幕增强
- GUI status功能码
- Include structure增强
增强相关函数和表格
- 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),组件类型(TYPE:E C S T),组件功能模块名(Member):里面记录了所有enhancement的增强。
- TFDIR,所胡的函数表,重要字段FUNCName(函数名),MAND(功能模块激活状态如果是C代表此函数模块激活)
Exit实现方法
- Enhancement exits实现方法
- SMOD:查看增强组件,CMOD:实现增强
- T-CODE:CMOD中创建一个Projec,添加所要使用的Enhancement,激活目标Components
- 在目标Function module中编写功能代码
- Subscreens实现方法
- T-code:CMOD中创建一个Project,添加所要用的Enhancement,激活目标Components
- 通过SMOD定位到目标程序,创建与其对应的屏幕属性为Subscreen,并编写功能代码。
SMOD和CMOD
- SMOD包含具体的增强
- CMOD是包含一组SMOD编写的增强,通过CMOD激活增强程序。
查找增强的方法
- 代码找增强(有些exit使用它并不能找到)
- 利用函数(MODX_FUNCTION_ACTIVE_CHECK)寻找增强
BADI简介
- 第三代增强(基于面向对象概念的增强BADI[business add-in],源代码发布以接口的方式,通过接口的方法调用来实现使用的)。用户增强实际上是实现一个或多个基于这个接口的实现类,因为接口类实际上是一个抽象类,所以对同一个增强会出现不同的源代码,这些不同的源代码是通过过滤器(adapter)来区别用于不同的业务场景的。这种 增强是用SE18,SE19来实现的。
- BADI和EXIT的区别:Exit中一个Enhancement只能使用一次,BADI一个接口可以被实现多次。
SE18和SE19
- SE18是查看BADI
- SE19是为BADI接口创建一个实例,从而在里面实现想要增加的功能。
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来监控一个TODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI
BADI查找方法
- 通过st05跟踪,badi对应的数据表为sxs_inter,sxc_exit,sxc_class和sxc_attr,而这些表都是通过视图V_EXT_IMP和V_EXT_ACT来查询的。
- 打开运行事务码:STO05先择"table buffer trace"而不是常用的"SQL trace"
- activatetrace(开始跟踪)
- 运行事务码:me21n
- 创建一个采购订单,保存
- deactivate trace(结束跟踪)
- 点击displaytrace,在出来的选择条件中:objects中输入:V_EXT_IMP和V_EXT_ACT;在operations中输入"OPEN"
- 查询通过查询的结果可以看出,视图V_EXT_IMP的BADI的接口类名字都是以IF_EX_开头的,其中IF_EX_之后的就是对应BADI接口的定义。
以面向对象的基本概念
- 对象
- 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
- 对象的状态和行为
- 对象的状态,一个对象用数据值来描述它的状态。
- 对象还有操作,用于改变对象的状态,操作就是对象的行为。
- 对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中
- 类
- 具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。
- 类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
- 类具有操作,它是对象的行为的商象,用操作名和实现该操作的方法来描述。
- 接口
New BADI
简介
- New BADI就是所谓的enhancement spot中多BADI Definition.
- enhancement spot的结构是个树形结构
- enhancement sopt下面可以定义若干个BADI definition,SAP官方的说法是,下面的BADI Definition的数量是没有限制的的,BADI Definition可以通过SE18进行创建查看修改。
- BADI Definiton里面包含了一个interface,有且仅有一个interface,是一一对应的一个关系,除此以外,还包含若干个filter,这些filter的数量也没有什么限制,filter可以通过se18进行创建查看修改。
- enhancement sopt可以创建无数enchancement Implementation,通过se19进行创建修改和删除,因为enhancement spot下面定义无数BADI definition,因此enhancement spot下面固然也可以创建无数个相应的BADI implementation,在创建BADI implementation的时候需要指定BADI implementation的名字,每个BADI definition都对应一个interface,那么BADI implementation就对应一具class,并且该class实现了相应的interface
posted @
2025-06-11 08:11
小章子
阅读(
146)
评论()
收藏
举报