ABAP 增强

编程入门 行业动态 更新时间:2024-10-25 12:17:14

<a href=https://www.elefans.com/category/jswz/34/1768287.html style=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:实现增强
  1. T-code:CMOD中创建一个Project,添加所要使用的Enhancement,激活目标Components
  2. 在目标Function module中编写功能代码
  • Subscreens实现方法:
  1. T-code:CMOD中创建一个Project,添加所要使用的Enhancement,激活目标Components
  2. 通过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来实现的。【使用最多】

se18查看接口

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来查询的。
  1. 打开运行事务码: ST05 选择“table buffer trace”而不是常用的"SQL trace"
  2. activate trace(开始跟踪)
  3. 运行事务码:me21n+、、7
  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接口的定义。

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 增强

本文发布于:2024-03-14 02:59:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1735480.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:ABAP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!