BADI这是第三代用户出口型。让我们来看看如何实现的细节。

一个,用户出口的类型
1,第一代
sap提供了一个空的子程序代码。在这个过程分,用户可以添加自己的代码。为了控制自己的需求。这样的改进是需要改变sap标准代码。演示样本:USEREXIT.. in SAPMV45A
2,第二代
sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完毕实现。 3,第三代
sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),你能够通过EXIT_HANDLER这个单词查找BADI。 另外另一种出口叫BTE。在前一个项目里我们做的OPENFI就是用的这个BTE
相关TCODE: FIBF
Business Transaction Events (Open FI) 二。用户出口比較
第一代用户出口是form出口  如
FORM USEREXIT_FIELD_MODIFICATION.
* CASE SCREEN-GROUP3.
*   WHEN '900'.
*     IF VBAK-VBTYP NE 'A'.
*       SCREEN-ACTIVE = 0.
*     ENDIF.
* ENDCASE.
* CASE SCREEN-NAME.
*   WHEN 'VBAK-VBELN'.
*     SCREEN-ACTIVE = 0.
* ENDCASE.
ENDFORM.
找法省略。 SD的用户出口和定价的用户出口等多採用这样的方式。 第二代用户出口多是 call customer-function ‘001’ 这样的方式实现的。 后面我们会具体介绍此方法,此方法是如今SAP系统开发用的最多的一种 第三代用户出口 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。 在SAP系统中 BADI 相关类的 类图 例如以下:
三,BADI的解释
BADI实现主要通过SE18和SE19实现的,看看例如以下:
SE18
ZIF_EX_BADI (Interface)
ZCL_EX_BADI (Class)
Method()
SE19
ZIF_EX_BADI (Interface)
ZCL_IM_BADI (Class)
实装Method() 以下能过代码分析 BAdI 机制背后的一些设计问题:
1. 定义指向BAdI interface的Reference
DATA: exit_ref TYPE REF TO ZIF_EX_BADI.
2. 获得继承BAdI interface的子类实例
CALL METHOD cl_exithandler=>get_instance
    CHANGING
        instance = exit_ref.
这里的cl_exithandler=>get_instance方法是一个简化的Abstract Factory.
a) 为什么说它是个简化的Abstract Factory呢? 由于CL_EXITHANDLER没有一个抽象的工厂类, 仅仅有一个产品簇, 仅仅完毕单一的创建工作。 b) 为什么cl_exithandler=>get_instance要用工厂模式呢?
在Client代码端看来,通过调用get_instance这种方法就能够得到详细实现类实例。然后调用以下的方法:
CALL METHOD exit_ref->CUSTOM_VALIDATION
    IMPORTING
        param = 'xxx'
    EXPORTING
        flt_val = 'xxx'.
就调用到实现类中的接口方法了。但通过Debug代码你会发现这个调用返回的是Adapter Class 'ZCL_EX_BADI'而非我们的Impl Class!事实上这就是创建型模式的意义 - 隐藏对象的创建细节. 也就是说当我们调用CUSTOM_VALIDATION时,事实上是调用了ZCL_EX_BADI->CUSTOM_VALIDATION. 四。BADI的实现
A.BADI定义
1.SE18。
2.输入要创建的BADI的名字,点击"Create"。
3.输入BADI的描写叙述性文本,在"Interface"选项卡上输入接口的名字,也能够採用SAP建议的接口的名字。同一时候,BADI类也会被创建。 比如:对于BADI "ZTEST",SAP会建议"ZIF_EX_TEST"作为接口的名字,"ZCL_EX_TEST"作为类的名字。 4.保存BADI。
5.双击接口的名字,会跳转到Class Builder界面。在这里你能够定义接口的方法。 6.保存并激活接口。 B.在应用程序中调用BADI
1.声明一个BADI接口的參考引用变量。
比如:DATA exit_ref TYPE REF TO zif_ex_test.
2.调用类CL_EXITHANDLER的静态方法GET_INSTANCE,将返回一个请求对象的实例。 比如:
CALL METHOD CL_EXITHANDLER=>GET_INSTANCE
CHANGING instance = exit_ref。 3.如今你能够调用BADI的全部方法了
C.BADI实现
1.SE19。
2.输入BADI实现的名字,点击"Create"。
3.输入BADI定义的名字。 4.输入实现的描写叙述性文本,在"Interface"选项卡上输入实现类的名字。能够採用SAP建议的名字。
比如:"ZIMPTEST",SAP会建议"ZCL_IM_IMPTEST"。
5.保存实现。
6.双击某一方法名会跳转到Class Builder界面,在这里你能够加入代码来重定义接口方法。 7.激活实现 五。查找BADI
本帖隐藏的内容BADI是SAP的第三代用户出口,採用了面向对象的方式。据说在4.6A版本号之后才引入的BADI。
使用st05查找BADI
1)ST05。选择SQL trace、buffer trace。然后activate trace
2)执行TCODE
3)deactivate trace
4)display trace,显示display trace的对话框。在表的栏位上加上? V_EXT_IMP和 V_EXT_ACT
5)查看以IF_EX_开头的字符串,这是interface class 的名字,IF_EX_它的背后BADI。例如IF_EX_EQUI_UPDATE

版权声明:本文博客原创文章。博客,未经同意,不得转载。

SAP ABAP第一,两,三代出口型BADI实现 解释的概念的更多相关文章

  1. 【ABAP系列】SAP ABAP 取两个内表的交集 比较两个内表的不同

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 取两个内表的交 ...

  2. SAP abap 需找出口(BADI)的几种方法

    需找BADI方法有很多,据公司的牛人说,他知道的就不止5种 现在给出一些比较简单的方法 首先,大家要知道,一个程序的出口不会太多,需找出口,很多的时候都是在尝试 第二,方法:首先会给出事务码,然后通过 ...

  3. 【ABAP系列】SAP ABAP模块-查找系统出口或BADI的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-查找系统出 ...

  4. 【ABAP系列】SAP ABAP常用函数总结第一篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP常用函数总结第一 ...

  5. 【ABAP系列】SAP ABAP 资产类BAPI过账 BAPI_ACC_DOCUMENT_POST

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 资产类BAPI ...

  6. [SAP ABAP开发技术总结]字符串处理函数、正则表达式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. 【ABAP系列】SAP ABAP MIR7预制凭证BAPI

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP MIR7预制凭 ...

  8. ABAP开发顾问必备:SAP ABAP开发技术总结

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. [SAP ABAP开发技术总结]ABAP程序之间数据共享与传递

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. java.lang.NullPointerException错误分析

    java.lang.NullPointerException是什么错误 你使用了空的指针.在java中虽然号称抛弃了C++中不安全的指针,但其实他所有的东西你都可以理解为指针.这种情况一般发生在你使用 ...

  2. jquery再体验

    $(function(){ var obj = $("div[id^='channel_'][id$='_left']"); var val = obj.html(); var i ...

  3. centos6.5安装nodejs

    Preface(前言) 一次偶然的机会知道有nodejs这个东西,确实对它还是非常感兴趣的.刚開始仅仅知道它能让javascript写后台,然后前后台都由javascript来写,确实认为真的挺爽,毕 ...

  4. Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程

    原文:Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程 Red Gate系列之二 SQL Source Co ...

  5. AccountManager教程

    API阅读 此类提供所述用户接口到集中登记帐户. 用户只需输入一次帐号password后,您将能够访问internet资源. 不同的在线服务用不同的方式来管理用户,所以account manager ...

  6. java.net.SocketException: Unconnected sockets not implemented 解

    JDK 这一问题的版本号,至Oracle公司JDK版本号bug.于6u12-rev号修复了该问题     请将JDK版本号升级到 1.6.0_12-b05 以上.推荐1.6.0_37 http://b ...

  7. 修改字符串中特定的内容,用于OpenRecovery Script

    下面的是实例内容 目标是把OpenRecovery Script输入的内容进行修改 当有下面的输入:(作用是安装/emmc目录下面的update-signed.zip 刷机包) install /em ...

  8. CF 452A(Eevee-直接试)

    A. Eevee time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  9. iOS结合导航控制器和标签栏控制器

    <span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name=& ...

  10. setsockopt角色

    功能描写叙述: 获取或者设置与某个套接字关联的选 项. 选项可能存在于多层协议中.它们总会出如今最上面的套接字层. 当操作套接字选项时.选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 ...