【整理】BADI的查找和使用

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。

之后就可以在接口提供的方法内尽情的开花了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章