轉自:http://jjwenhuo.itpub.net/post/16092/115296
jjwenhuo的部落格
SAP ABAP/4 BADI 入門篇 =========================================================== 作者: jjwenhuo(http://jjwenhuo.itpub.net)
發表于:2006.06.16 15:48
分類: 他山之石
出處:http://jjwenhuo.itpub.net/post/16092/115296
---------------------------------------------------------------
以前不知道有BADI這個東西,昨天突然被上司喊過去,讓調查一下BADI,說有個項目要用到。剛開始的想法和上司一樣,以為是客戶把BAPI誤為BADI了。結果上網一查,還真有BADI。但查到的結果也不是很多,就先用一下apparts的這個 SAP ABAP/4 BADI 入門篇 吧。
SAP ABAP/4 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'.
*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了.
******************************************************************* if ldf_screen_visible = space.
loop at screen.
screen-active = '0'.
modify screen.
endloop.
endif.*******************************************************************
~完~
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=456467