1.1 BADIs

1.1.1 Method SET_SCREEN_COND_VBAP
Overview:
Importing Parameters
Changing Parameters
以上一個是BADI的定義, 那麼什麼是BADI呢, 說土點就是現在你定義個接口類,但是這個接口類有一些方法,但是這些方法都是空的,這些方法也有都自己的IMPORTING ,EXPORTING,CHANING參數.但是這些方法沒有被實作, 而你卻還要在自己目前寫的程式中去調用這個沒有被實作的方法, 這裡就出現了一堆問題,
為什麼要調用它?
為什麼這個BADI是空的?
為什麼要做這樣的一個空的東西?
下面将回答這些問題, 因為比較偷懶是以沒找到比較好的例子, 以下是一個SAP的業務場景:
SALES ORDER的ITEM資料行的DETAIL資訊, SAP系統給客戶留了一個BADI, 這個BADI被系統的标準程式調用過, 顯示一個SUBSCREEN, 裡面包含一些資訊, 如下:
如果某個使用者實施了SAP的産品,不希望出現這個SUBSCREEN的話, 客戶想把這個螢幕給隐藏掉, 是以給客戶預留了一個BADI的DEFINITION. 也就是最上面的那個表.使用SE18可以看到這個定義.
這三個方法在标準的程式中是怎麼被調用的.
以下是系統标準程式
<!--
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
其中的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. *******************************************************************