天天看點

ABAP/4 BADI 入門篇

 1.1 BADIs

ABAP/4 BADI 入門篇

    1.1.1  Method SET_SCREEN_COND_VBAP

    Overview:

ABAP/4 BADI 入門篇

  Importing Parameters

ABAP/4 BADI 入門篇

  Changing Parameters

ABAP/4 BADI 入門篇

    以上一個是BADI的定義, 那麼什麼是BADI呢, 說土點就是現在你定義個接口類,但是這個接口類有一些方法,但是這些方法都是空的,這些方法也有都自己的IMPORTING ,EXPORTING,CHANING參數.但是這些方法沒有被實作, 而你卻還要在自己目前寫的程式中去調用這個沒有被實作的方法, 這裡就出現了一堆問題,

    為什麼要調用它?

    為什麼這個BADI是空的?

    為什麼要做這樣的一個空的東西?

    下面将回答這些問題, 因為比較偷懶是以沒找到比較好的例子, 以下是一個SAP的業務場景:

    SALES ORDER的ITEM資料行的DETAIL資訊, SAP系統給客戶留了一個BADI, 這個BADI被系統的标準程式調用過, 顯示一個SUBSCREEN, 裡面包含一些資訊, 如下:

ABAP/4 BADI 入門篇

    如果某個使用者實施了SAP的産品,不希望出現這個SUBSCREEN的話, 客戶想把這個螢幕給隐藏掉, 是以給客戶預留了一個BADI的DEFINITION. 也就是最上面的那個表.使用SE18可以看到這個定義.

ABAP/4 BADI 入門篇

    這三個方法在标準的程式中是怎麼被調用的.

    以下是系統标準程式   

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

-->      * Define class load

     class cl_exithandler definition load.

     * Define the Sales Order Control Table instance

    data: lds_soctrl type / kjeps / soctrl,

    ldf_screen_visible( 1 ) type C value space,

    ldf_pre_existing type c,

    exit type ref to / KJEPS / IF_EX_BADI2,

    ldf_badi_name type exit_def value ' /KJEPS/BADI2 ' .

     * Chck the BADI whether was implemented.

     * 檢查BADI是否被使用者給實作過了,傳入BADI的定義名字和接口類名

    CALL METHOD CL_EXITHANDLER => GET_INSTANCE

    EXPORTING

    EXIT_NAME = ldf_badi_name

    NULL_INSTANCE_ACCEPTED = space

    IMPORTING

    ACT_IMP_EXISTING = ldf_pre_existing

    CHANGING

    INSTANCE = exit.

     * IF the BADI has implemented, and then call corresponding method.

     * 如果這個BADI被使用者實作了,下面的這個參數會等于’X’

     * 如果實作了,就調用客戶實作的方法.

     if ldf_pre_existing = gcf_on.

    CALL METHOD EXIT -> SET_SCREEN_COND_VBAP

    EXPORTING

    IN_VBAK = vbak

    IN_VBAP = vbap

    IN_TRTYP = t180 - trtyp

    IN_XVBAP = xvbap[]

    IN_XVBEP = xvbep[]

    IN_XVBKD = xvbkd[]

    IN_XVBPA = xvbpa[]

    CHANGING

    EX_SCREEN_VISIBLE = ldf_screen_visible.

    endif.

     if ldf_screen_visible = space.

    loop at screen.

    screen - active = ' 0 ' .

    modify screen.

    endloop.

    endif.

    那麼這裡客戶如何是實作這個BADI的DEFINITION呢,使用SE19

ABAP/4 BADI 入門篇
ABAP/4 BADI 入門篇

    其中的SET_SCREEN_COND_VBAP被實作了,把SUBSCREEN的顯示的一個變量清除了.

    這就表示,使用者不想看見那個顯示資料的SUBSCREEN, 然後看上面的系統中的程式. 執行到這裡的時候會判斷這個變量是否被使用者的程式給修改了,如果修改了就不顯示SUBSCREEN了.  

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

--> ******************************************************************* if ldf_screen_visible = space.

    loop at screen.

    screen - active = ' 0 ' .

    modify screen.

    endloop.

    endif. *******************************************************************