Classic BADI总结

这里对sap Classic Badi 做一下总结,虽然已经是过时的技术了.

  • Classic BADI的创建
  • Classic BADI的实施
  • Classic BADI的调用及运行原理
  • New BADI
  • FCODE增强
  • 屏幕增强
  1. Classic BADI的创建

事务代码:SE18

由于Classic Badi 已经是过时的技术了,现在提倡用4代增强NEW BADI.所有三代增强的创建入口被隐藏在实用程序下边.

入口 SE18--Utilities--Create classic BAdi.

填写必要字段

  

注意一下系统自动生成的类 ZCL_EX_TEST_OLD_BADI2.这个类是BADI运行的关键.后面会讲到.

Multiple Use 如果打勾了,那么这个Badi可以同时存在多个激活的实例.但实例执行的顺序是没有规律的.

如果Multiple Use打勾了,则该BADI定义就不能有按键增强和子屏幕增强了.

Filter-Depend如果打勾了,需要填写一个过滤器类型,过滤器类型有如下限制: 是char类型的数据元素;长度不能超过30位;具有搜索帮助;有一个具有固定值或者值表的域.

如果启用了过滤器,则所有BADI接口的方法的参数中会自动(也必须)包含一个输入参数(importing):FLT_VAL.

如果Filter-Depend打勾了,则该BAID就不能有按键增强.

在创建BADI时系统会自动根据BADI的名称建议一个接口名称,该名称和自动生成的BADI类只是前缀不同.当然接口名称可以修改.

双击接口名称就可以创建该接口,在接口创建界面定义方法和属性值.

如果启用了过滤器,则所有BADI接口的方法的参数中会自动(也必须)包含一个输入参数(importing):FLT_VAL.

此处创建的接口将作为BADI实施类的接口.

当激活BAID时,系统将会根据接口生成有一个上边提到的BADI类ZCL_EX_TEST_OLD_BADI2,自然该类将包含接口中的所有方法及属性.

关于按键增强(状态栏增强)及子屏幕增强将在后边讲.

     2.     Classic BADI的实施  

               事务码:SE19.

              

                在Create Implementation 框中,选择Classic BAdI.输入BADI名称,点击Create按键创建BADI实施.

               

              指定BADI实施名称,继续.

             如果BADI包含过滤器FILTER.则在BADI实施的属性页中必须指定过滤值Filter value(可以是多值).只有在在调用BADI的类的接口方法时,传入给参数FLT_VAL的值等于该实施的 Filter value 时,该实施对应的方法才会被调用.详情见BADI的调用.

            

          

            然后可以在interface页中重写所有BADI接口的方法了. 没有问题后激活,则badi实施就完成了.

           如果BADI不是多次使用的.则同时只能有一个实施是激活的.

       3. Classic BADI的调用,运行原理及相关数据库透明表.

           与三代之前的增强相关的内容都放在包SECE(Enhancement concept)中.

           其中与三代BADI相关的视图或者表如下:

          视图BADI_DATA:包含了BADI名称,过滤器Filter的数据元素,是否可以重复可以多次使用,BADI接口,BADI类等信息


           视图:V_EXT_ACT 包含了BADI对应的活动的实施

        BADI调用时,需要先定义一个类型为BADI接口的参考变量.当然类型为BADI类也可以.

       然后调用类cl_exithandler的静态方法get_instance.

      然后用返回的参考变量调用方法就可以了.

复制代码
DATA gr_test_odl_badi TYPE REF TO zif_ex_test_old_badi.
DATA gv_string TYPE string.

PARAMETERS p_bukrs TYPE bukrs.

START-OF-SELECTION.


  CALL METHOD cl_exithandler=>get_instance 
*  EXPORTING
*    exit_name                     =
*    null_instance_accepted        = SEEX_FALSE
*  IMPORTING
*    act_imp_existing              =
    CHANGING
      instance = gr_test_odl_badi  "需要注意的时此时返回的参考变量为BADI类的参考变量,而不是实施类的参考变量.
*  EXCEPTIONS
*     no_reference                  = 1
*     no_interface_reference        = 2
*     no_exit_interface             = 3
*     class_not_implement_interface = 4
*     single_exit_multiply_active   = 5
*     cast_error                    = 6
*     exit_not_existing             = 7
*     data_incons_in_exit_managem   = 8
*     others   = 9
    .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  CALL METHOD gr_test_odl_badi->get_butxt   
    EXPORTING
      flt_val = p_bukrs
    CHANGING
      butxt   = gv_string.

复制代码

     前边我们提到过,在激活BADI时系统会自动生成一个BADI的类(这个类也是参考BADI接口创建的)及其方法.

     使用cl_exithandler=>get_instance归回的参考变量就是BADI类的参考变量.

    该方法通过cl_abap_typedescr=>describe_by_data 获取changing参数gr_test_odl_badi类型对应的接口.

    通过接口在表SXS_INTER中找到BADI名称.然后通过拼接获取BADI对应类的名称.

    之后我们调用的方法gr_test_odl_badi->get_butxt就是激活BADI时,系统自动生成的方法.

    该方法的作用在于检查该BADI是否有激活的实施.

    如果存在,则依次调用每个实施类的相同的方法.

posted @   女鬼的朋友  阅读(775)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示