【整理】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。

之後就可以在接口提供的方法內盡情的開花了。

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