SAP ABAP之第一,二,三代出口类型BADI实现 概念解释

小编 2026-07-07 阅读:1715 评论:0
BADI是用户的第三代出口类型,我们来看看其具体的是如何实现的。 一,用户出口的类型 1,第一代 sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都...

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


作者:forever_crazy
来源:CSDN
原文:https://blog.csdn.net/forever_crazy/article/details/27636709
版权声明:本文为博主原创文章,转载请附上博文链接!

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表