天天看點

SAP ABAP/4 BADI 入門篇 (轉)

轉自: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 ABAP/4 BADI 入門篇 (轉)

如果某個使用者實施了SAP的産品,不希望出現這個SUBSCREEN的話, 客戶想把這個螢幕給隐

藏掉, 是以給客戶預留了一個BADI的DEFINITION. 也就是最上面的那個表.

使用SE18可以看到這個定義.

SAP ABAP/4 BADI 入門篇 (轉)

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

.

以下是系統标準程式

************************************************************************************

*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

SAP ABAP/4 BADI 入門篇 (轉)
SAP ABAP/4 BADI 入門篇 (轉)

其中的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

繼續閱讀