SAP 4代增强

第二代增强和第三代增强的差别

1、tcode  不同

第二代:cmod 增强管理;smod 实施的增强点。

第三代:SE18  BADI的定义;SE19  BADI的实现

2、实现方式不同

SMOD是基于函数模块的增强,函数名称是 EXIT_程序名_’XXX’。

使用 CALL  customer-function  ‘XXX’  调用函数模块。

函数里面一般是 INCLUDE  ZXXX   一句话,进去里面进行代码增强;

 

SE19是基于面向对象的增强,

源代码发布以接口的方式,通过接口的方法的调用来实现使用。

 

第三代:基于类的增强(BADI)

BADI新方式实现

   1-构建BADI

   2-实现BADI

    3-使用ABDI过滤器

    4-多个实现时调用谁

查找系统中的BADI

BADI详细说明文档

示例:通过BADI实现采购订单屏幕增强

    需求说明

    step1:标准表ekko、ekpo结构扩展

    step2:创建自定义表

    step3:create function group

          功能函数

               标准表扩展所涉及的函数

                    Z_PO_SUBSCREEN_GRP_POP_HEAD

                    Z_PO_SUBSCREEN_GRP_POP_ITEM

                    Z_PO_SUBSCREEN_GRP_PUSH_HEAD

                    Z_PO_SUBSCREEN_GRP_PUSH_ITEM

               自荐表扩展所涉及的函数

                    Z_PO_SUBSCREEN_GRP_POP_ITEM2

                    Z_PO_SUBSCREEN_GRP_PUSH_ITEM2

                    Z_PO_SUBSCREEN_GRP_INIT

                    Z_PO_SUBSCREEN_GRP_OPEN

                    Z_PO_SUBSCREEN_GRP_GET_DATA

                    Z_PO_SUBSCREEN_GRP_SET_DATA

                    Z_PO_SUBSCREEN_GRP_POST

                    Z_PO_SUBSCREEN_GRP_COMMIT

          全局数据定义

          LMEVIEWSF01

          子屏幕设计

                    0100

                    0101

                    0102

                    0103

    step4:BADI  ME_GUI_PO_CUST  的实现,子屏幕数据传递处理

    step5:BADI  ME_PROCESS_PO_CUST 的实现,数据处理

通过程序查找出口对象或ABDI

Enhancement Framework基本概念

      为自己的程序创建显示增强Explicit  Enhancement Spot

      隐式与显式增强

系统标准表结构增强

      Include Struture

      Append Struture

      SE14调整

 

 

BADI新方式实现

1-构建BADI

1.SAP  BADI的由来

由于各个国家财务制度以及税务制度的差异,SAP希望在自己的程序开发平台中引入BADI,能够让开发人员自己编写业务插件,系统会自动调用这些插件程序来完成某种业务运算。

2.创建一个Enhancement Spot

Enhancement Spot 是作为一个BADI容器,在这个容器里面,我们可以定义自己的多个BADI。

在TCODE  SE18

Enhancenment Spot

计算税率

3、定义一个BADI

在新建的Enhancement Spot中创建一个BADI,选择如图的按钮

创建badi

 

4、定义一个BADI接口

接下来我们需要一个接口来定义这个BADI所需要的方法

双击接口,此时可以选择或者输入一个新的接口名

定义一个badi接口

为z_if_test3创建一个方法get_test,并设置其参数

定义badi接口方法

至此,我们已经建立了一个Enhancement Spot,而且带有一个BADI和一个接口,仅仅如此是不能使用这个BADI的,我们需要一个BADI实例来在程序中被调用。

5、现在我们调用一个小程序来调用这个BADI的方法get_test,系统中有两个关键字用来得到BADI实例和调用BADI,分别是get badi 和call  badi。

调用badi方法

由于还没有实现,所以报错。

2、实现BADI

一个Enhancement Spot 可以定义多个BADI,每个BADI又是由一个接口和多个实例类组成的。

Enhancement Spot相当于容器的概念,用来存储多个BADI,而每个BADI又必须定义一个接口,该接口可以有一个或者多个实现类,BADI实质上就是将接口和实现类组织在一起,而BADI本身又可以代表接口本身的概念了,(因为一个BADI只有一个接口)。

Enhance.Spot

1、建立一个BADI增强实现容器

由于一个BADI的实现可以有多个类,这些多个实现类需要组织在一起(与多个BADI放在一个Enhancement Spot中是一个概念),所有需要先创建一个新的BADI增强实现容器,如图:

BADI实现容器

2、BADI类实现

紧接着要求输入BADI的实现名和实现类

BADI的实现类

当保存后,会自动跳转到BADI增强实现的界面(因为BADI的实现类可以有多个,所以新开一个界面来专门来进行BADI的实现过程)

BADI的一个实现

BADI实施界面

一个增强实现(Enhancement implementation)可以有多个implementations(相当于多个版本),但起作用的同时只能有一个,有多个版本时需要进行设置:

一个实现类

两个实现版本类所实现接口GET_TEST方法如下:

实现类方法1

实现类方法2

上面虽然建了两个BADI  Implementation (Z_BADI_IMPL_01、Z_BADI_IMPL_02),或者说两个实现类(Z_CL_BADI_IMPL_01、Z_CL_BADI_IMPL_02),但这些都属于同一个Enhancement  Implementation(Z_BADI_IMPL_C)的,对于BADI定义(Z_BADI_TEST3)来说,只有一个增强实现,而增强实现里虽然创建了两个实现类,但同时只有一个起作用,所以目前最终只有一个Enhancement Implementation,可以创建多个不同Enhancement Implementation 增强实现。

 

如果激活方法时出错,原因是目前有连个BADI的实现,所以需要把其中一个的Implementation is  active 前的钩去掉才能被激活。

active

当加上过滤器之后,需要将此钩打上,不然在运行时如果通过过滤器选择的是此实现时,调用程序是dump掉

当有多个BADI实现时,需要增加过滤器来选择使用那个实现类。

 

 

posted @ 2017-06-01 17:23  赵瑞朋  Views(1546)  Comments(0)    收藏  举报