BADI 入门篇
1.1 BADIs
BADI Name
/KJEPS/BADI2
Description
BADI for change visibility of EPS fields
Dev. Class
/KJEPS/JD
1.1.1 Method SET_SCREEN_COND_VBAP
Overview:
Method Name
SET_SCREEN_COND_VBAP
Description
Change field visibility for Sales order item screen
Function
Called from PBO module of SAPMV45A 8450 and return EX_SCREEN_VISIBLE
Interface:
Importing Parameters
Field Name
Reference
Description
Mandatory
IN_VBAK
VBAK
Sales Order Header
X
IN_VBAP
VBAP
Processing Sales Order Item
IN_TRTYP
TRTYP
Transaction type
IN_XVBAP
VA_VBAPVB_T
Document Structure for XVBAP/YVBAP (Sales order item)
IN_XVBEP
VA_VBEPVB_T
Structure of Document for XVBEP/YVBEP (schedule line)
IN_XVBKD
VA_VBKDVB_T
Reference structure for XVBKD/YVBKD (business data)
IN_XVBPA
VA_VBPAVB_T
(partner function)
Changing Parameters
Field Name
Reference
Description
Mandatory
EX_SCREEN_VISIBLE
C
‘X’ = EPS screen is visible
Space = EPS screen is not visible
以上一個是BADI的定義, 那么什么是BADI呢, 說土點就是現在你定義個接口類,但是這個接口
類有一些方法,但是這些方法都是空的,這些方法也有都自己的IMPORTING ,EXPORTING,
CHANING參數.但是這些方法沒有被實現, 而你卻還要在自己當前寫的程序中去調用這個
沒有被實現的方法, 這里就出現了一堆問題,
為什么要調用它?
為什么這個BADI是空的?
為什么要做這樣的一個空的東西?
下面將回答這些問題, 因為比較偷懶所以沒找到比較好的例子, 以下是一個SAP的業務場景:
SALES ORDER的ITEM數據行的DETAIL信息, SAP系統給客戶留了一個BADI, 這個
BADI被系統的標準程序調用過, 顯示一個SUBSCREEN, 里面包含一些信息, 如下:
如果某個用戶實施了SAP的產品,不希望出現這個SUBSCREEN的話, 客戶想把這個屏幕給隱
藏掉, 所以給客戶預留了一個BADI的DEFINITION. 也就是最上面的那個表.
使用SE18可以看到這個定義.
這三個方法在標準的程序中是怎么被調用的.
以下是系統標準程序
************************************************************************************
*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'.
*Check 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了.
*******************************************************************
if ldf_screen_visible = space.
loop at screen.
screen-active = '0'.
modify screen.
endloop.
endif.
*******************************************************************
總結
- 上一篇: 关于SMARTFORM的页数问题
- 下一篇: BADI开发示例