SAP 最全的BADI的查找方法总结

文章介绍了SAP中的BADI(BusinessAdd-In)作为主要增强手段的两种类型——ClassicBADI和NewBADI,详细对比了它们的区别,包括创建方式、过滤值传递和调用方法。通过MB31收货举例展示了如何查找BADI,并提供了一个小程序用于快速定位。此外,文章还提到了使用SE18查看BADI接口和SE19进行BADI的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BADI的查找和使用
 

一、BADI简介
BADI是SAP主要的增强的方式之一,目前BADI有两种:CLassic BADI 和 New BADI。两种BADI的基本原理差不多,但是具体的实现方式不同,具体的不同主要表现在以下三个方面。

Classic and new BAdIs differ in a number of features that are important for migration:

1. BAdI object

a. With classic BAdIs, a BAdI object is created by calling a factory method, and referenced via a reference variable of the type of the BAdI interface.

b. With new BAdIs, a BAdI object is created via the ABAP statement GET BADIas a handle for the calls of BAdI methods, and referenced via a reference variable of the type of the BAdI. A BAdI object is an instance of an internal BAdI class, which otherwise is invisible to the outside.

2. Passing comparison values for the filter

a. With the classical BAdIs, the filter values are stored in a structure and passed with the call of the BAdI methods.

b. With the new BAdIs, the comparison values for the filters used to search for implementations are passed when the BAdI object is created with the GET BADIstatement.

There is no way of migrating the call of the factory method one-to-one into the ABAP statement, because GET BADI can also return an existing BAdI object, which is not possible with the factory method.

3. Calling BAdI methods

Passing comparison values for the filter

a. A classic BAdI can be called only once and the call positions are registered centrally.

b. With new BAdIs, multiple calls are possible and the call positions are not registered centrally.

 
二、BADI查找
这里以MB31收货为例,说明如何快速查找BADI。

最快捷方便的当然是可以根据事务代码快速的找到,这里推荐这样一个小程序,供大家参考。
 

REPORT  Z_FIND_EXIT_BADI NO STANDARD PAGE HEADING.
TABLES:TSTC,TADIR,MODSAPT,MODACT,TRDIR,TFDIR,ENLFDIR,SXS_ATTRT,TSTCT.
DATA : JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE.
DATA : FIELD1(30).
DATA : V_DEVCLASS LIKE TADIR-DEVCLASS.
PARAMETERS : P_TCODE LIKE TSTC-TCODE,
             P_PGMNA LIKE TSTC-PGMNA.
 
DATA WA_TADIR TYPE TADIR.
 
START-OF-SELECTION.
  IF NOT P_TCODE IS INITIAL.
 
    SELECT SINGLE * FROM TSTC WHERE TCODE EQ P_TCODE.
 
  ELSEIF NOT P_PGMNA IS INITIAL.
 
    TSTC-PGMNA = P_PGMNA.
 
  ENDIF.
  IF SY-SUBRC EQ 0.
 
    SELECT SINGLE * FROM TADIR
    WHERE PGMID = 'R3TR'
     AND OBJECT = 'PROG'
     AND OBJ_NAME = TSTC-PGMNA.
 
    MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
 
    IF SY-SUBRC NE 0.
 
      SELECT SINGLE * FROM TRDIR
       WHERE NAME = TSTC-PGMNA.
 
      IF TRDIR-SUBC EQ 'F'.
 
        SELECT SINGLE * FROM TFDIR
         WHERE PNAME = TSTC-PGMNA.
 
        SELECT SINGLE * FROM ENLFDIR
         WHERE FUNCNAME = TFDIR-FUNCNAME.
 
        SELECT SINGLE * FROM TADIR
         WHERE PGMID = 'R3TR'
         AND OBJECT = 'FUGR'
         AND OBJ_NAME EQ ENLFDIR-AREA.
 
        MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
 
      ENDIF.
 
    ENDIF.
 
    SELECT * FROM TADIR INTO TABLE JTAB WHERE PGMID = 'R3TR' AND
     OBJECT IN ('SMOD', 'SXSD') AND
     DEVCLASS = V_DEVCLASS.
 
    SELECT SINGLE * FROM TSTCT WHERE SPRSL EQ SY-LANGU AND
     TCODE EQ P_TCODE.
 
    FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
 
    WRITE:/(19) 'Transaction Code - ',
    20(20) P_TCODE,
    45(50) TSTCT-TTEXT.
 
    SKIP.
 
    IF NOT JTAB[] IS INITIAL.
      WRITE:/(105) SY-ULINE.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
      SORT JTAB BY OBJECT.
 
      DATA : WF_TXT(60)     TYPE C,
             WF_SMOD        TYPE I,
             WF_BADI        TYPE I,
             WF_OBJECT2(30) TYPE C.
 
      CLEAR : WF_SMOD, WF_BADI , WF_OBJECT2.
 
      LOOP AT JTAB INTO WA_TADIR.
 
        AT FIRST.
          FORMAT COLOR COL_HEADING INTENSIFIED ON.
          WRITE:/1 SY-VLINE,
            2 'Enhancement/ Business Add-in',
            41 SY-VLINE ,
            42 'Description',
            105 SY-VLINE.
          WRITE:/(105) SY-ULINE.
        ENDAT.
 
        CLEAR WF_TXT.
 
        AT NEW OBJECT.
          IF WA_TADIR-OBJECT = 'SMOD'.
            WF_OBJECT2 = 'Enhancement' .
          ELSEIF WA_TADIR-OBJECT = 'SXSD'.
            WF_OBJECT2 = ' Business Add-in'.
          ENDIF.
 
          FORMAT COLOR COL_GROUP INTENSIFIED ON.
          WRITE:/1 SY-VLINE,
             2 WF_OBJECT2,
             105 SY-VLINE.
        ENDAT.
 
        CASE WA_TADIR-OBJECT.
          WHEN 'SMOD'.
            WF_SMOD = WF_SMOD + 1.
            SELECT SINGLE MODTEXT INTO WF_TXT
             FROM MODSAPT
             WHERE SPRSL = SY-LANGU
              AND NAME = WA_TADIR-OBJ_NAME.
            FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
          WHEN 'SXSD'.
            " FOR BADIS
            WF_BADI = WF_BADI + 1 .
            SELECT SINGLE TEXT INTO WF_TXT
             FROM SXS_ATTRT
             WHERE SPRSL = SY-LANGU
              AND EXIT_NAME = WA_TADIR-OBJ_NAME.
            FORMAT COLOR COL_NORMAL INTENSIFIED ON.
        ENDCASE.
        WRITE:/1 SY-VLINE,
           2 WA_TADIR-OBJ_NAME HOTSPOT ON,
           41 SY-VLINE ,
           42 WF_TXT,
           105 SY-VLINE.
        AT END OF OBJECT.
          WRITE : /(105) SY-ULINE.
        ENDAT.
      ENDLOOP.
      WRITE:/(105) SY-ULINE.
      SKIP.
      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      WRITE:/ 'No.of Exits:' , WF_SMOD.
      WRITE:/ 'No.of BADis:' , WF_BADI.
    ELSE.
      FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
      WRITE:/(105) 'No userexits or BADis exist'.
    ENDIF.
  ELSE.
    FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
    WRITE:/(105) 'Transaction does not exist'.
  ENDIF.
AT LINE-SELECTION.
  DATA : WF_OBJECT TYPE TADIR-OBJECT.
  CLEAR WF_OBJECT.
  GET CURSOR FIELD FIELD1.
  CHECK FIELD1(8) EQ 'WA_TADIR'.
  READ TABLE JTAB WITH KEY OBJ_NAME = SY-LISEL+1(20).
  MOVE JTAB-OBJECT TO WF_OBJECT.
  CASE WF_OBJECT.
    WHEN 'SMOD'.
      SET PARAMETER ID 'MON' FIELD SY-LISEL+1(10).
      CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.
    WHEN 'SXSD'.
      SET PARAMETER ID 'EXN' FIELD SY-LISEL+1(20).
      CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
  ENDCASE.

 

另外就是去程序代码里面找,搜索关键字“CL_EXITHANDLER”。

 

假设我们已经找到了想要的BADI:“MB_DOCUMENT_BADI ”,就可以使用事务代码SE18进去查看,在这里我们可以看到这个BADI对应的接口,接口中定义的相关方法及参数的传递等。

 

 

在菜单“实施”→“显示”中我们还可以查看SAP提供的BADI实现的例子。

 

三、BADI实施

至于如何实现,我们需要用到事务代码SE19。

 

 

 

之后就可以在接口提供的方法里加工代码了。

 

 

### 查看和定位BADI实现及定义 #### 使用事务码查找BADI 为了在SAP中查看业务对象访问接口(Business Add-In, BADI)的定义及其现有实现,可以利用事务码`SE18`来浏览BAPI或BADI的定义。通过此事务码,能够找到具体的增强点并了解其结构。 对于已经实现了的具体BADI实例,则可以通过事务码`SE24`进行查询[^1]。这使得开发人员不仅可以看到抽象级别的描述,还可以深入到实际应用层面观察哪些地方使用了该接口以及它们是如何被定制化的。 #### 利用ABAP Development Tools (ADT) 当涉及到更现代化的工作环境如连接至S/4HANA云平台时,推荐采用ABAP Development Tools工具来进行操作。在这个集成开发环境中,支持多种方式去探索和管理BADIs: - **项目资源浏览器**:可以在项目的包视图里直接展开相应的节点来发现与之关联的所有组件,包括任何已注册在此处的事件处理器或是其他形式的服务提供者。 - **搜索功能**:借助全局搜索栏快速定位感兴趣的类或接口名称;也可以专门针对某个特定类型的元数据执行高级检索命令,比如只显示所有可用的BADIs列表。 #### 显示具体实现细节 一旦找到了目标BADI,在它的属性页面会有一个链接指向其实现清单。点击这个链接之后将会展示出每一个单独的应用案例——即不同的客户化需求下所对应的处理逻辑版本。这里不仅可以读取源代码片段,还能进一步分析调用上下文以便更好地理解整个流程是怎样运作起来的[^2]。 ```abap CALL METHOD cl_exithandler=>get_exit_definition EXPORTING interface_name = 'ZIF_MY_BADI' IMPORTING exit_definition = lt_exit_def. ``` 上述示例展示了如何编程获取指定BADI的信息,这对于自动化脚本编写非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值