赛跑网

 找回密码
 注册

QQ登录

只需一步,快速开始

快捷登录

查看: 8025|回复: 61

[P3J10]ABAP之BADI实现

  [复制链接]
发表于 2010-11-29 10:32:27 | 显示全部楼层 |阅读模式
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
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

最近访客

  • tbb1177
    2024-01-17
  • admin
    2023-12-04
  • wx_75910
    2022-10-21
  • EricCai
    2022-08-30
  • austin
    2022-03-23
  • blacklul
    2021-10-13
  • chenchao
    2021-10-12
  • 15173179
    2021-10-09
  • chenc880
    2021-07-03
  • Cruise
    2021-02-06
  • 秃尾巴草
    2021-02-04
  • 042566
    2021-01-19
  • Bella
    2021-01-19
  • wangxiao
    2021-01-18




上一篇:[P3J9]ABAP之锁机制实现
下一篇:[P3J11]ABAP之数据结构
本楼点评(0) 收起
发表于 2011-2-26 18:33:32 | 显示全部楼层
学习 谢谢楼主分享
本楼点评(0) 收起
发表于 2011-4-22 14:42:11 | 显示全部楼层
回复 1# admin
要是能够有DEMO就更好了
本楼点评(0) 收起
发表于 2011-5-17 13:06:29 | 显示全部楼层
谢谢老师分享!!
本楼点评(0) 收起
发表于 2011-6-7 18:44:50 | 显示全部楼层
good good study
本楼点评(0) 收起
发表于 2011-7-21 15:28:32 | 显示全部楼层
学习 谢谢楼主分享
本楼点评(0) 收起
发表于 2011-8-4 16:04:50 | 显示全部楼层
看隐藏内容
本楼点评(0) 收起
发表于 2011-8-4 16:16:40 | 显示全部楼层
学习一下SAP
本楼点评(0) 收起
发表于 2011-8-18 22:10:16 | 显示全部楼层
这个内容确实不错
本楼点评(0) 收起
发表于 2011-9-6 08:29:07 | 显示全部楼层
谢谢老师分享!!
本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|联系我们|赛跑网 ( QQ:108519493QQfsq

GMT+8, 2024-4-26 09:08 , Processed in 0.232713 second(s), 71 queries .

Powered by 91SAP X3.4

© 2001-2023 91sap Team.

快速回复 返回顶部 返回列表