这里对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 <> .
* 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是否有激活的实施.

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

Classic BADI总结的更多相关文章

  1. Classic BAdi and New BAdi

    Former Member Classic BAdi and New BAdi ... 2007年04月27日 04:43 | 1.5k Views Hi all, I have a question ...

  2. 查找SAP标准程序用户出口及BADI的方法

    查找SAP标准事务代码中使用的BADI: 在SE24中,查看类对象CL_EXITHANDLER,在其方法(Methods)GET_INSTANCE 的第14行打断点,之后运行事务代码: 当有BADI将 ...

  3. ME21N/ME22N/ME23N屏幕增强BADI ME_GUI_PO_CUST

    最近想更深入学习下classic BADI, 以前没玩过BADI屏幕增强, 所以决定玩一下. 这次的屏幕增强主要用到两个BADI: ME_GUI_PO_CUST和ME_PROCESS_PO_CUST ...

  4. 20170520 BADI增强学习

    一.要求:Tcode:FF_5 导入数据运行时,产生财务凭证之前修改某些字段值.Exmp:FEBRE-VWEZWBKPF-XBLNRFEBEP-CHECTBSEG-ZUONR there is a b ...

  5. F110 BADI增强

    F110*JOB*&------------------------------------------------------------- F110 BADI FI_BSTM_MC_EXI ...

  6. 第四代增强 NEW BADI的定义及实现

    NEW BADI 是在第四代增强框架下创建的BADI,是相对于第三代增强Classic Badi 而言的. 根据第四代增强的基本概念,所有显式增强Enhancement options 都必须放在增强 ...

  7. BADI FCODE(菜单) 增强

    菜单增强功能只能用于非依赖于过滤器的一次性BADI(不是多用途的). 目前,菜单增强功能只能与程序增强功能(界面)一起创建. 定义一个没有过滤器的一次性增强 2.Classic Badi在FCODE ...

  8. 关于EXIT和BADI增强的查找

    EXIT出口的查找: 方法一: 第一步:通过SE30,输入TCODE(例如ME21N),执行EXCUTE,前台创建一张采购订单.点击TIMES页签,查找EXIT开头的SAP程序.  第二步:这些fun ...

  9. ABAP Enhancement:第一部分

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

随机推荐

  1. 刺激(codevs 1958)

    题目描述 Description saffah的一个朋友S酷爱滑雪,并且追求刺激(exitement,由于刺激过度导致拼写都缺了个字母),喜欢忽高忽低的感觉.现在S拿到了一张地图,试图制定一个最长路径 ...

  2. codevs2597 团伙

    题目描述 Description 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友 ...

  3. Ubuntu 16.04安装Intel显卡驱动(解决Intel HD Graphics 630显卡驱动问题)

    一般Ubuntu都默认包含了Intel显卡的驱动,如果没有,那么先确定是不是显卡太高,比如I7第7代的CPU核显在Ubuntu 16.04中是没有的,导致画面会很卡,原因是Linux 4.4内核不包含 ...

  4. Ubuntu 16.04安装GTX960闭源驱动

    GTX960的闭源要Nvidia 346版才行,闭源驱动能很大提升显卡的性能,例如双显示输出等,缺点是不开源. 有以下方式来安装: 1.命令行: sudo add-apt-repository -y ...

  5. clamav完整查杀linux病毒实战(摘抄)

    http://dadloveu.blog.51cto.com/blog/715500/1882521 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,L ...

  6. Linux 下添加 Eclipse 桌面图标

    1. sudo gedit  /usr/share/applications/eclipse.desktop 2. 向eclipse .desktop中添加以下内容: [Desktop Entry] ...

  7. Project Perfect让Swift在server端跑起来-Perfect in Visual Studio Code (四)

    编者语 : 本系列文章已经被Perfect官方引用了,这样的感觉非常好.感恩!Thx all ! Visual Studio Code是一个轻量级的编辑器,但也功能丰富,通过插件你能够完毕如Cordo ...

  8. i18n国际化的例子

    这个可以点击菜单进行中英文切换,每次切换就可以改变sessionStorage.languge,进行改变i18n的参数lang的值,然后重新调用下就可以了. 工程结构: i18n--| |---css ...

  9. Mahout贝叶斯算法拓展篇3---分类无标签数据

    代码測试环境:Hadoop2.4+Mahout1.0 前面博客:mahout贝叶斯算法开发思路(拓展篇)1和mahout贝叶斯算法开发思路(拓展篇)2 分析了Mahout中贝叶斯算法针对数值型数据的处 ...

  10. 一些Razor语法

    Layout asp.net mvc中的一些子视图忽然不行了,点击主视图后发现没有弹出来. 通过浏览器调试,发现打开子视图时,加载了大量的JS,CSS等.真奇怪啊,这些都是在主视图加载的啊,怎么子视图 ...