`
jgtang82
  • 浏览: 405877 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SAP BAdI 实现原理解析

阅读更多

最近几天发现这篇文章被单击的次数比较高, 这里把文档内容再充实一下:

本文谈得是SAP BAdI 机制背后的一些设计问题, 关于如何使用BAdI请参考:
...

在SAP系统中 BAdI 相关类的 类图 如下:
 

下面能过代码分析 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) 为什么不说它是个Factory Method? 是因为它没把类的创建工作延迟到子类。
    c) 为什么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.

3. ZCL_EX_BADI->CUSTOM_VALIDATION,这个方法是SAP系统自动生成的,核心代码如下:

  1. ...
  2. LOOP AT INSTANCE_BADI_TABLE ASSIGNING <exit_obj></exit_obj>
               WHERE METHOD_NAME  = 'DISPLAY'.   
  3.     APPEND TO EXIT_OBJ_TAB.   
  4. ENDLOOP.   
  5. ...
  6. LOOP at exit_obj_tab ASSIGNING  <exit_obj></exit_obj>
        WHERE ACTIVE   = SXRT_TRUE.   
  7.     CHECK <exit_obj></exit_obj>-imp_class NE old_imp_class.   
  8.     <flt_cache_line></flt_cache_line>-valid = sxrt_true.   
  9.     flt_val_db = <exit_obj></exit_obj>-flt_val.   
  10.     ...   
  11.     MOVE <exit_obj></exit_obj>-imp_class to <flt_cache_line></flt_cache_line>-imp_class.   
  12.     MOVE <exit_obj></exit_obj>-imp_switch to <flt_cache_line></flt_cache_line>-imp_switch.   
  13.     MOVE <exit_obj></exit_obj>-order_num to <flt_cache_line></flt_cache_line>-order_num.   
  14.     INSERT INTO TABLE INSTANCE_FLT_CACHE.   
  15.     old_imp_class = <exit_obj></exit_obj>-imp_class.   
  16. ENDLOOP.   
  17. ...
  18. LOOP AT INSTANCE_FLT_CACHE ASSIGNING <flt_cache_line></flt_cache_line>   
  19.        WHERE flt_name    = flt_name   
  20.          AND valid       = sxrt_true   
  21.          AND method_name = 'CUSTOM_VALIDATION'.   
  22. ...   
  23. CALL METHOD ('CL_FOBU_METHOD_EVALUATION')=>load   
  24.   EXPORTING   
  25.     im_class_name     = <flt_cache_line></flt_cache_line>-imp_class   
  26.     im_interface_name = 'ZIF_EX_BADI'   
  27.     im_method_name    = 'CUSTOM_VALIDATION'   
  28.   RECEIVING   
  29.     re_fobu_method    = <flt_cache_line></flt_cache_line>-eo_object   
  30.   EXCEPTIONS   
  31.     not_found         = 1  
  32.     OTHERS            = 2.   
  33. ...   
  34. ENDLOOP.  

这时我们会发现这段代码会找到所有Active的BAdI Implemention然后去执行它。这里有点Adpater的味道而且在SAP标准文档中确实是把ZCL_EX_BADI 类为Adapter Class, 但是我觉得这个叫法不合适,改变接口不是这个类的主要价值,里面的Loop调用实现类方法和Filter显得更主要。所以它的主要价值应该是对实现类的访问控制,改称Adapter Class为 Proxy或许更合适。下面是Proxy模式的类图:
 
关于Proxy模式, 《Head First Design Pattern》中讲的非常不错,这里推荐一下。

总结:
1. 通过 Factory 获得Adapter Class 的实例 (障眼法 / 封装创建细节)
2. 通过 Proxy 对象(Adapter Class) 实现对 BAdI Implementations 的访问控制

分享到:
评论

相关推荐

    SAP BADI开发示例

    需要注意的是,在实现BADI时,需要遵守SAP的开发规范和命名惯例,以确保开发出的解决方案符合SAP的标准和要求。此外,BADI的实现还需要考虑到性能和安全性等方面的因素,以确保解决方案的稳定性和安全性。 本文提供...

    SAP BADI增强PO GR

    BADI是SAP中用来实现面向对象的增强技术,它允许用户不改动标准代码的情况下,通过接口来扩展或改变系统行为。 描述:“对于MIGO,看它使用了哪些BADI:找到MIGO的program: System-&gt;status它的program为:SAPLMIGO ...

    SAP ABAP开发BADI与增强资料

    BADI(Business Add-In)和屏幕增强是ABAP开发中的关键概念,它们允许用户自定义和扩展标准SAP功能以满足特定业务需求。 **BADI简介** BADI是一种灵活的、面向对象的设计技术,它允许开发人员在不修改标准SAP代码的...

    SAP BADI出口增强的查找方法

    理解CL_EXITHANDLER类及其GET_INSTANCE方法的工作原理,以及如何通过设置断点来追踪具体出口的名称,是实现这一目标的关键。这种方法不仅提高了SAP系统的灵活性,也确保了在维护和升级过程中,不会破坏原有的功能和...

    SAP_ABAP_BADI_增强_开发

    详细讲述SAP ABAP的BADI增强的概述及使用。详细讲述SAP ABAP的BADI增强的概述及使用。详细讲述SAP ABAP的BADI增强的概述及使用。详细讲述SAP ABAP的BADI增强的概述及使用。详细讲述SAP ABAP的BADI增强的概述及使用。...

    SAP 开发 SD 相关的增强BADI.pdf

    企业客户在使用SAP SD模块的过程中,经常会遇到需要对标准流程进行个性化调整或功能扩展的情况,而SAP提供的BADI (Business Add-Ins) 正是用于实现这种业务增强的技术手段。 BADI是SAP开发中用于业务增强的一种技术...

    怎么写一本BADI程序

    如何写一本BADI程序,详细手顺

    SAP_ABAP_BADI

    SAP_ABAP_BADI SAP_ABAP_BADI 是 SAP 系统中的一种业务增强工具,BADi 全称为 Business Add-In...这个资源提供了关于 SAP 系统中的业务增强接口 BADi 的详细介绍和实现过程,以及一个示例程序来展示 BADi 的实际应用。

    什么是BADI_如何从SAP中查找BADI

    #### BADI概念解析 BADI(Business Add-In)是SAP提供的一种增强技术,它基于ABAP Objects框架,旨在为用户提供一种灵活的方式来满足特定需求而无需修改标准SAP交付内容。这种机制允许企业根据自己的特殊业务需求...

    查找sap标准程序用户出口以及badi的方法

    本教程将深入讲解如何查找 SAP 标准程序中的用户出口和 BADI 实现方法,帮助开发者更高效地进行系统扩展。 一、用户出口(User Exits) 1. **理解用户出口**:用户出口是 SAP 为开发者预留的特定代码段,允许在...

    如何使用BADI对XD01/XD02/XD03进行附加屏幕,字段的增强

    需要注意的是,在实现 BADI 时,我们需要遵守 SAP 的开发标准和命名惯例,以确保我们的 BADI 实现能够与标准系统集成。 使用 BADI 对 XD01/XD02/XD03 进行附加屏幕,字段的增强是一个非常有用的功能,它可以满足...

    sap_BADI技术

    ### SAP BADI 技术详解 #### 一、BADI技术概述 SAP BADI (Business Add-In) 技术是一种先进的ABAP对象技术,它为SAP系统提供了灵活的扩展性和可定制性。与传统的增强技术相比,BADI提供了一个更加结构化的方法来...

    sap 增强 badi userexit customerexit

    SAP增强BADI UserExit CustomerExit SAP增强BADI UserExit CustomerExit是SAP系统中的一种扩展机制,通过预留的Form/Subroutine,allowing开发者在系统中添加自己的逻辑。这种机制分为三种类型:User Exits、...

    BADI --实现步骤

    BADI(Business Add-In)是 SAP 提供的一种用户出口机制,允许用户在不修改 SAP 标准代码的情况下,实现自己的业务逻辑。BADI 的实现步骤可以分为两个部分:BADI 定义和在应用程序中调用 BADI。 BADI 定义 1. 使用...

    BADI作为SAP的第三代用户出口

    ### BADI作为SAP的第三代用户出口 #### BADI简介 在SAP系统中,BADI(Business Add-In)作为一种非常重要的扩展性机制被广泛应用于各个模块中。它为开发人员提供了一种灵活的方式来增强标准SAP应用的功能,而无需...

    BADI-BADI介绍

    BAdI(Business Add-In)是一种由SAP提供的增强技术,用于向现有的SAP应用程序中添加自定义的业务逻辑或功能。通过预定义的接口,BAdI允许开发人员在不修改原生SAP标准代码的基础上扩展或覆盖现有业务流程的行为。这...

    SAP ABAP BADI

    SAP ABAP BADI(Business Add-Ins)是SAP系统中一种用于扩展标准功能的机制,它允许开发者在不修改标准代码的情况下实现业务逻辑的定制化。BADI为开发者提供了一个灵活的方式来插入自定义代码,从而满足特定业务需求...

    SAP how to find a badi

    ### SAP如何查找BADI 在SAP系统中,BADI(Business Add-In)是一种非常重要的扩展机制,允许用户自定义业务逻辑而不修改标准SAP代码。对于开发人员来说,了解如何快速有效地查找与特定事务代码或功能模块相关的BADI...

    BADI及UserEXIT查找工具

    ### SAP ABAP中的BADI与UserExit:查找与理解 #### 概述 在SAP ABAP编程领域,BADI(Business Add-In)与UserExit是两种常见的扩展点,允许客户自定义或增强标准SAP应用程序的功能。这些扩展点对于满足特定业务...

Global site tag (gtag.js) - Google Analytics