標籤:enhancement user-exit badi
增強(enhancement)的概念其實很廣,SAP標準系統之上的所有二次開發,我們都可以理解為增強,做增強目的就是標準的sap正常的業務系統 不能滿足實際需求,所以我們在標準的系統基礎進行增加不同的功能來達到不同企業的要求,換句話說我們今天開發過程中所有的ADD-ON都可以說是增強開發。
但作為開發人員所說的增強主要是標準系統事先預留好的介面,根據不同業務需求,進行開發,我們稱為增強,又叫出口。
比如:1:在業務檢查時,比如在某個工廠發貨,可以設定在某個庫位的出貨只能使用某種移動類型。2:在需要介面增強時,比如使用者對某個欄位要求大寫,但是 終端使用者不按規範操作,這也可以在出口中自動轉換,有些模組甚至能自訂資料庫欄位,並且可以在出口中增加欄位輸入。還有的模組能對輸入資料檢查,甚至實 現自動替代等功能。3:有不規則業務時,比如按某種條件定價,可以設定從自己定義的表中按某種條件取值 4:搜尋協助的出口,可以對Sap標準的搜尋協助做許可權控制。等等。
Sap的使用者出口發展至今有四代:
一、第一代(基於原始碼的增強)是sap提供一個空代碼的子過程,在這個子過程中使用者可以添加自己的代碼,控制自己的需求。這類增強都需要修改sap的標 准代碼,它們在發布的時候都是空的,集中在一些檔案名稱倒數第二個字元為Z的包含程式中,由於在標準程式中,所以所有程式的全域資料都可以使用,但同時系統 升級時會被新版本覆蓋;這種原始碼增強和螢幕增強說明可以從事務碼 spro 後台配置中相關模組的路徑裡面找到;一般是以UserExit_打頭的子模組。
找到所要增強的程式,尋找UserExit關鍵字。
這類增強事先要到 service marketplace 申請對象鍵(ACCESS KEY),然後才能修改這些子程式。
尋找此類出口的方法:
1、 在增強程式中找第二個字元為Z的包含程式;
2、 在後台找對應模組增強;
3、 在程式中搜尋USEREXIT_打頭的關鍵字子程式;
4、 位元組列出對象列表“Display Object List”按鈕,在Subroutines列表下找“userexit”打頭的子程式;
二、 第二代增強(基於函數模組的增強),用SMOD和CMOD維護;在SAP發布的版本中,使用Call customer-function ‘xxx’調用函數模組的,所以你可以通過在程式中收cusomer-function來尋找第二代增強,第二代增強函數名構成:Exit_程式名_’xxx(3 digital number)’,這樣你就可以找到對應的增強函數模組了,它們在發布的時候只有一句代碼include ‘xxxxxxx’,修改時無需像第一代增強一樣需要ACCESS key,直接雙擊斷行符號就可以了,但同時這種增強以及後面幾代的增強都不能像第一代一樣隨便使用程式的全域資料,只能使用介面中傳遞進來的參數。
第二代增強中主要有3類:1)E . Ehancement exits: 這些出口 Exit_打頭,你可以到SE37中查看,也可以在資料字典中TFDIR(函數表)中查詢Exit_打頭的函數。2)C .GUI codes, (GUI增強) 3)S . Subscreens(螢幕增強)。4)T. include structure增強
Enhancement比較重要的表MODSAP,這個表裡重要的欄位增強名(Name),組件類型(TYP: E C S T),組件功能模組名(Member):裡面記錄了所有enhancement的增強.TFDIR所有的函數表,重要欄位FUNCName(函數名),MAND(功能模組啟用狀態 如果是C代表此函數模組啟用)。
尋找Enhancement的方法:
1、在程式中搜尋Customer-function找到後面的3為digit suffix,然後出口函數組成就是Exit_程式名_3 digit suffix.
2、代碼找增強 利用如下代碼找enhancement(有些exit使用它並不能找到)
REPORT ZLC_FIND_EXIT no standard page heading.
tables : tstc, tadir, modsapt, modact, trdir, tfdir, enlfdir.
tables : tstct.
data : jtab like tadir occurs 0 with header line.
data : field1(30).
data : v_devclass like tadir-devclass.
parameters : p_tcode like tstc-tcode obligatory.
select single * from tstc where tcode eq p_tcode.
if sy-subrc eq 0.
select single * from tadir where pgmid = ‘R3TR‘
and object = ‘PROG‘
and obj_name = tstc-pgmna.
move : tadir-devclass to v_devclass.
if sy-subrc ne 0.
select single * from trdir where name = tstc-pgmna.
if trdir-subc eq ‘F‘.
select single * from tfdir where pname = tstc-pgmna.
select single * from enlfdir where funcname =
tfdir-funcname.
select single * from tadir where pgmid = ‘R3TR‘
and object = ‘FUGR‘
and obj_name eq enlfdir-area.
move : tadir-devclass to v_devclass.
endif.
endif.
select * from tadir into table jtab
where pgmid = ‘R3TR‘
and object = ‘SMOD‘
and devclass = v_devclass.
select single * from tstct where sprsl eq sy-langu and
tcode eq p_tcode.
format color col_positive intensified off.
write:/(19) ‘Transaction Code - ‘,
20(20) p_tcode,
45(50) tstct-ttext.
skip.
if not jtab[] is initial.
write:/(95) sy-uline.
format color col_heading intensified on.
write:/1 sy-vline,
2 ‘Exit Name‘,
21 sy-vline ,
22 ‘Description‘,
95 sy-vline.
write:/(95) sy-uline.
loop at jtab.
select single * from modsapt
where sprsl = sy-langu and
name = jtab-obj_name.
format color col_normal intensified off.
write:/1 sy-vline,
2 jtab-obj_name hotspot on,
21 sy-vline ,
22 modsapt-modtext,
95 sy-vline.
endloop.
write:/(95) sy-uline.
describe table jtab.
skip.
format color col_total intensified on.
write:/ ‘No of Exits:‘ , sy-tfill.
else.
format color col_negative intensified on.
write:/(95) ‘No User Exit exists‘.
endif.
else.
format color col_negative intensified on.
write:/(95) ‘Transaction Code Does Not Exist‘.
endif.
at line-selection.
get cursor field field1.
check field1(4) eq ‘JTAB‘.
set parameter id ‘MON‘ field sy-lisel+1(10).
call transaction ‘SMOD‘ and skip first screen.
3、利用系統函數尋找增強
Function:
[1].DYNP_VALUES_READ
[2]. MODX_ALL_ACTIVE_MENUENTRIES(菜單增強)
[3].MODX_FUNCTION_ACTIVE_CHECK(出口函數增強)
[4].MODX_MENUENTRY_ACTIVE_CHECK(菜單增強)
[5].MODX_SUBSCREEN_ACTIVE_CHECK(螢幕增強)
我們可以在函數最後設定斷點,然後通過跑對應的增強程式就會去調用這樣的函數,這樣你就可以在偵錯模式下找到對應的增強。
下面附加出幾個重要的表:
Table:
[1]. TFDIR->function module table
[2]. MODSAP->sap enhancement table
[3]. TSDIR->Dynpro Areas CALL CUSTOMER SUBSCREEN(螢幕增強)
[4]. CUATEXTS-> GUI Interface: Menu Texts Changed(GUI 菜單文本增強)
[5].MODSAPA àsap 增強屬性
[6] MODATTRàsap增強項目屬性
[7] TADIR à資產庫對象的目錄
[8] TFTITà函數功能的短文本
注意:出口真正應用是要在啟用的狀態下,也就是在TFIDR下的MAND欄位為C.啟用的時候要同時啟用程式(se38)和出口函數(smod, cmod,出口程式都可)
當然一般情況,我們知道出口模組到modsap中找到對應的增強。可以通過下面的程式將其啟用。
REPORT Zactexitfun .
update tfdir set MAND = ‘C‘.
where FUNcname = ‘EXIT_SAPMM06E_013‘.
*判斷是否存在相應增強定義(SMOD)
select single name
from modsapa
into mod0-name
where name = ‘PPCO0002‘.
if sy-subrc = 0.
endif.
select single *
from tadir
into ps_tadir_db
where pgmid = ‘R3TR‘
and object = ‘SMOD‘
and obj_name = ‘PPCO0002‘.
*判斷是否存在相應增強項目的定義(CMOD)
SELECT SINGLE name FROM MODATTR into mod0-name
WHERE NAME = ‘PPCO0002‘.
*提取增強定義的組件 (可以用此反查增強定義)
select * from modsap
where name = ‘PPCO0002‘.
當然我們可以用下面的函數來找增強組件。MOD_SAP_MEMBER_TEXT
*獲得出口功能模組的資訊
select single * from tftit
where "SPRAS" = ‘1‘ AND "FUNCNAME" = ‘EXIT_SAPLCORE_001‘
if sy-subrc = 0.
endif.
*判斷該增強是否移植到BADI實現
select single migrated into migrated
from modsapa where name = modname.
if sy-subrc = 0 and migrated = ‘x’.
說明此增強已經移植到BADI實現了
endif.
三、第三代增強(基於物件導向概念的增強BADI(business add-in)),原始碼發布以介面的方式,通過介面的方法調用來實現使用的。使用者增強實際上是實現一個或多個基於這個介面的實作類別,因為介面類實際上是 一個抽象類別,所以對同一個增強會出現不同的原始碼,這些不同的原始碼是通過過濾器(adapter)來區別用於不同的業務情境的。這種增強是用SE18 SE19來實現的。
BADI的尋找方法:
1、BADI對象的資訊儲存在SXS_INTER,SXC_EXIT,SXC_CLASS和SXC_ATTR這四個表中。
2、SAP BADI程式都會調用cl_exithandler=>get_instance來判斷對象是否存在,並返回執行個體,這個方法實際就是對上面4個表和視圖V_EXT_IMP和V_EXT_ACT進行查詢和搜尋的。我們可以在這個方法處設定斷點,擷取執行個體。
3、它的調用方式是call method(instance), 可以通過exit_handler關鍵詞來尋找。
4、ST05選擇“table buffer trace”而不是常用的"SQL trace",然後尋找上面的幾個表和視圖找到對應的BADI.
5、se18 尋找介面,se19 實現介面就可以實現使用者增強
四、第四代其實是第三代的加強switch Framework
當sap進入newweaver 7.0以後推出的新增強體系,將BADI進行了改進,叫新BADI了。還新增 Enhancement Spot 和 Enhancement Section 以及隱式增強點的概念,基本可以在物件導向的程式裡實現處處皆可增強最高境界。
Sap Enhancement種類