什么是BADI,如何从SAP中查找BADI? 
 Business Add-Ins are a new SAP enhancement technique based on ABAP Objects. They can be inserted into the SAP System to accommodate user requirements too specific to be included in the standard delivery. Since specific industries often require special functions, SAP allows you to predefine these points in your software.

SAP预定义了一些Interface,客户可以自己定义实现Interface的Class进行客户化,在标准程序中会使用调用客户自定义Class的Instance,在获取Instance的过程使用了工厂模式,因此获取过程对用户是未知的。不过BADI也有一些局限性,就是有哪些Interface是固定死的,有的时候会发现需要Mix客户化代码的时候找不到Interface,什么时候SAP的OO里面直接支持AOP就好了。

如何从SAP中查找BADI

BADI作为SAP的第三代用户出口,他的应用也越来越广泛,但如何找到合适的badi是许多abap程序员的困惑。我这里就介绍一下我个人的应用的经验,供大家参考。

1、badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中(参见SECE包);

2、sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。

3、基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。

4、se18 查找接口,se19 实现接口就可以实现用户增强。
示例:用LE_SHP_DELIVERY_PROC控制跨月Cancel

METHOD if_ex_le_shp_delivery_proc~change_delivery_header .
  DATA : thismonth(2) TYPE c.
  DATA : wa_likp TYPE LINE OF shp_likp_t.
  DATA : wa_log TYPE LINE OF shp_badi_error_log_t.
  CLEAR ct_log[],thismonth.
  thismonth = sy-datum+4(2). "----->這一個月的月份
  LOOP AT it_xlikp INTO wa_likp.
    CHECK is_v50agl-warenausg_storno ='X'."--->代表作GI cancel
    IF wa_likp-wadat_ist+4(2) < thismonth.
      wa_log-vbeln = cs_likp-vbeln.
      wa_log-msgty = 'E'. "錯誤訊息
      wa_log-msgid = 'ZDN_ERROR'. "這一個class要自己建
      wa_log-msgno = '001'.
      APPEND wa_log TO ct_log. "Error log寫入
    ENDIF.
  ENDLOOP.
ENDMETHOD. "IF_EX_LE_SHP_DELIVERY_PROC~CHANGE_DELIVERY_HEADER

TCODE:

SE18
SE19

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.激活实现。

1.定义BADI
         1) T-Code:  SE18     Business Add-In Define.

2) 输入要创建的BADI的名字,点击"Create"。

3) 输入BADI的描述性文本,在"Interface"选项卡上输入接口的名字,也可以采用SAP建议的接口的名字。同时,BADI类也        会被创建。

例如:对于BADI "ZTEST",SAP会建议"ZIF_EX_TEST"作为接口的名字,"ZCL_EX_TEST"作为类的名字。

4) 保存BADI。

5) 双击接口的名字,会跳转到Class Builder界面,在这里你可以定义接口的方法。

6) 保存并激活接口。

2.实现BADI
         1) T-Code:  SE19     Business Add-In Implementation
         2) 输入BADI实现的名字,点击"Create"。
         3) 输入BADI定义的名字。
         4) 输入实现的描述性文本,在"Interface"选项卡上输入实现类的名字。可以采用SAP建议的名字。

例如:"ZIMPTEST",SAP会建议"ZCL_IM_IMPTEST"。

5) 保存实现。

6) 双击某一方法名会跳转到Class Builder界面,在这里你可以添加代码来重定义接口方法。

7) 激活实现。

3. 程序中调用BADI

1) 先用类型参照引用出要调用的BADI
      2) 实例化BADI
      3) 实例化后就可以任意调用BADI 中的方法了。

REPORT  ZZW_BAPI_01                                                 .

data exit type ref to ZIF_EX_ZW_BD_TEST.

call method cl_exithandler=>get_instance
     changing
        instance = exit.

call method exit->Z_ZW_01.

==》
badi 小记
BADI作为SAP的第三代用户出口,他的应用也越来越广泛,但如何找到合适的badi是许多abap程序员的困惑。我这里就介绍一下我个人的应用的经验,供大家参考。

1、badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中(参见SECE包);

2、sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。

3、基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。

4、se18 查找接口,se19 实现接口就可以实现用户增强。
示例:用LE_SHP_DELIVERY_PROC控制跨月Cancel

METHOD IF_EX_LE_SHP_DELIVERY_PROC~CHANGE_DELIVERY_HEADER .
data : thismonth(2) type c.
data : wa_likp type line of SHP_LIKP_T.
data : wa_log type line of SHP_BADI_ERROR_LOG_T.
clear ct_log[],thismonth.
thismonth = sy-datum+4(2). "----->这一个月的月份
loop at it_xlikp into wa_likp.
check IS_V50AGL-WARENAUSG_STORNO ='X'."--->代表作GI cancel
if wa_likp-WADAT_IST+4(2) < thismonth.
wa_log-VBELN = cs_likp-vbeln.
wa_log-MSGTY = 'E'. "错误信息
wa_log-MSGID = 'ZDN_ERROR'. "这一个class要自己建
wa_log-MSGNO = '001'.
append wa_log to ct_log. "Error log写入
endif.
endloop.
ENDMETHOD.

什么是BADI,如何从SAP中查找BADI?相关推荐

  1. 从SAP中查找BADI

    通过st05跟踪,badi对应的数据表为 SXS_INTER, SXC_EXIT, SXC_CLASS 和 SXC_ATTR,而这些表都是通过视图V_EXT_IMP 和 V_EXT_ACT来查询的. ...

  2. SAP中寻找增强的实现方法

    SAP中寻找增强的实现方法 SAP 增强已经发展过几代了,可参考 SAP 标准教材 BC425 和 BC427.简单的说SAP的用户出口总共有四代: 1.第一代  基于源代码的增强. SAP提供一个空 ...

  3. SAP 中如何寻找增强

    自开发程序查找增强:ZGET_ZQ;ZFIND 参考链接: http://www.cnblogs.com/huangjianisgood/archive/2012/10/10/2717713.html ...

  4. SAP第三代增强——BADI解读

    BAdI是SAP在标准程序中,为客户自定义逻辑所预留的接口(属于第三代增强),在技术本质上是一个interface,通过实现类的向上继承,完成用户逻辑的调用. 操作BAdI的事务代码: SE18:定义 ...

  5. 外行假装内行,我也来谈谈SAP BAPI和BADI

    外行假装内行,我也来谈谈SAP BAPI和BADI A, 什么是BAPI? BAPI是business application programming interface的缩写,是面向对象程序设计方法 ...

  6. ABAP中查找代码的标准程序

    RPR_ABAP_SOURCE_SCAN 可以用于搜索SAP中的程序代码,一般使用时填写开发类.程序名及需要查找的字符串即可,选择屏幕布局和功能很简单,熟悉ABAP代码的人一看就明白了,不多解释了,使 ...

  7. sap中泰国有预扣税设置吗_泰国餐厅密度细分:带有K-means聚类的python

    sap中泰国有预扣税设置吗 Hi! I am Tung, and this is my first stories for my weekend project. What inspired this ...

  8. SAP中总账科目行项目不显示的处理方法

    如下图,查询总账科目行项目是财务常规操作.某科目在事务FBL3N中提示不可能显示行项目 在SAP社区查找了一下资料,提取一段相关问题的描述如下: A precondition for using th ...

  9. SAP中复制创建采购申请的过程

    如主题,类似采用参照或复制方式创建在办公软件中的是很常用的功能和方法.本身也只是操作上的问题.笔者刚好遇到,所以就记录下来. SAP中有时采购申请者可以会将关键字段填错,而又无法更改.如下图订单,创建 ...

最新文章

  1. 无边框窗体和用户控件以及权限
  2. ASP.NET小知识
  3. 压力测试后,BCH采用增加
  4. mysql增量备份二进制日志,mysql增量备份二进制日志shell脚本
  5. 关于《用C#编写ActiveX控件》的几点说明
  6. Java当中用 javabean和其他容器存入表格数据 或 利用 容器进行存储表格
  7. JavaFX UI控件教程(十四)之Tree View
  8. 求一早间新闻~20170717
  9. linux卸载aprutil,Linux下安装Apr及其Apr-util的基本步骤
  10. node中events实现原理
  11. 使用SQLite3支持中文路径
  12. 【收藏】图片垂直居中的解决办法
  13. 【中级03】class loader subsystem详解
  14. table 谷歌下不出现滚动条
  15. 【防爬虫01】通过headers中的user-agent字段来反爬
  16. Mysql中date和datetime的区别
  17. python操作Jinkins
  18. 【游戏设计】3D坦克大战
  19. Python学习笔记——工欲善其事,必先利其器
  20. 解决git clone提示Permission denied publickey 问题

热门文章

  1. 安卓系统开发编译模块代码
  2. java: 程序包org.apache.hadoop.hive.metastore不存在
  3. WIN10 系统日志错误--权限设置并未向在应用程序容器 不可用 SID
  4. pulp求解简单线性规划问题
  5. Zookeeper节点数据备份与恢复
  6. 海康工业相机参数设置与获取
  7. ubuntu22安装和卸载nvidia驱动
  8. 2015年1月21日
  9. 油卡充值接口源码分享
  10. 开发者和苹果公司打交道需要注意的事情