SAP-增强

概念

  • 增强的概念其实很广,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类

  1. 功能模块增强:这些出口是以Exit_打头的函数,可以在se37中查看,也可以在数据字典中TFDIR(函数表)中查询Exit_打头的函数
  2. 子屏幕增强
  3. GUI status功能码
  4. 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来查询的。
  1. 打开运行事务码:STO05先择"table buffer trace"而不是常用的"SQL trace"
  2. activatetrace(开始跟踪)
  3. 运行事务码:me21n
  4. 创建一个采购订单,保存
  5. deactivate trace(结束跟踪)
  6. 点击displaytrace,在出来的选择条件中:objects中输入:V_EXT_IMP和V_EXT_ACT;在operations中输入"OPEN"
  7. 查询通过查询的结果可以看出,视图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)  评论(0)    收藏  举报