SAP ENHANCEMENT

sap的用戶出口總共有三代:
1、第一代
sap提供一個空代碼的子過程,在這個子過程中用戶可以添加自己的代碼,控制自己的需求。這類增強都需要修改sap的標準代碼。
示例:USEREXIT.. in SAPMV45A

2、第二代
sap提供的是CUSTOMER-FUNCTION,它是通過SMOD和CMOD完成實現。

3、第三代
sap提供的第三代的用戶出口就是BADI,他的調用方式是CALL METHOD (instance),(相關的TCODE是SE18和SE19),可以通過EXIT_HANDLER這個單詞查找BADI。

對於第一代增強,可以用以下方法查找增強:
打開欲增強的程序,點擊工具欄上的“Display Object List”按鈕,選擇Subroutines,查找以“UserExit”開頭的子程序,根據子程序前面的註釋文檔來查找用戶出口

對於第二代增強,可以用以下方法查找增強

用戶增強通常包括下面3類,顧名思義,就是增強SAP的可能沒有提供的功能(通過後臺配置也不能實現).
1.E Enhancement exits :就是常說User_exit (用戶出口)
使用SE37搜索EXIT*的函數大都是做exit用的,通常裏面預包含了一個Z開頭
的程序. SE16查詢TFDIR(函數表)輸入EXIT*也可.
2.C GUI codes( GUI接口增強)
3. S Subscreens (屏幕增強)
Enhancement在表MODSAP可看到,而TFDIR字段 MAND(值爲C表示此出口函數被激活).使用SMOD(CMOD)當然可激活exit function,有時候一時難以查詢到相關Enhancement時可使用下面程序將出口函數激活.

REPORT Zactexitfun .
data ztfdir like tfdir .
* select single * from tfdir into ztfdir
* where FUNCNAME =
* 'EXIT_SAPMM06E_013'.
* ztfdir-MAND = 'C' .
* update tfdir from ztfdir.
* 將EXIT_SAPMM06E_013換成實際所需exit函數名
update tfdir set MAND = 'C'.
where FUNcname = 'EXIT_SAPMM06E_013'.

***當然也可SE16:MODSAP表enhancement輸入EXIT_SAPMM06E_013然後得到enhancement name MM06E005後使用SMOD測試激活exit函數.
增強相關函數和表格
Function:
[1].DYNP_VALUES_READ
[2]. MODX_ALL_ACTIVE_MENUENTRIES(菜單增強)
[3].MODX_FUNCTION_ACTIVE_CHECK(出口函數增強)
由於讀者可能接觸user exit最多,除了附錄光盤有個查找ZFINDEXIT的程序外(有些exit使用它並不能找到),另一個直接有效的方法就是使用這個函數,SE37設好斷點後執行tcode如其有exit就會調用此函數.
[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 菜單文本增強)

***注意,爲了確保一個出口被真正應用,必須同時激活相關程序(SE38)和出口函數(SMOD|CMOD,反正就是要保證tfdir-mandt=’C’,用程序也可.


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lqq417/archive/2009/02/05/3863520.aspx

************同仁查找EXIT的方法****************

***方法一****************************************

通過SE30,運行TCODE後,點Evaluate後,查看運行時間分析評估:命中清單。

找以“exit”開頭的SAP程序,如:EXIT_SAPLIE01_007,

這個FUNCTION就是TCODE提供的一個出口。

至於如何查看這個增強是屬於哪個SMOD,能夠查閱 MODSAP這個表(SAP Enhancements). 


以上的增強是第二代增強。 

***方法二****************************************

通過SE37中的:MODX_FUNCTION_ACTIVE_CHECK 函數來找,

在函數的最後一行打個斷點,再運行TCODE的,如果有增強則會跳入DEBUG界面,在DEBUG界面中,查看L_FUNCNAME字段對應的值,此值就是就是要找的出口,

再去SE11中通過MODSAP來查看出口對就的是那個SMOD,

接下來就可以在CMOD中創建增強組了,把找到的增強填入,

最後根據實際的業務進行處理。


***方法三****************************************

找BADI的方法。

先運行SE24,查看類對象CL_EXITHANDLER, 在其方法:GET_INSTANCE的14行( CALL METHOD CL_EXITHANDLER=>GET_CLASS_NAME_BY_INTERFACE)打上一個斷點。

接下來運行事務代碼,當有BADI是將會被執行,這時在DEBUG模式下,會進入類CL_EXITHANDLER 的GET_INSTANCE 方法,按F6執行這個方法之後,點參數EXIT_NAME查看其對應的值,所有的方法實現都在此類對象中,此時就是我們所要找的BADI。

實現BADI的方法

進入SE19,選擇Create Implementation中的Classic BADi

另一種方法(跟上面的差不多)

查找源程序,在程序中查找代碼段 CL_EXITHANDLER => GET_INSTANCE

就可以找到該程序所用到的BADI。


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

針對BADI的增強

1、badi對象的信息存儲在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 這四個表中。

2、sap程序都會調用cl_exithandler=>get_instance來判斷對象是否存在,並返回實例;其實get_instance就是對上述幾個表和他們的視圖(V_EXT_IMP 和 V_EXT_ACT)進行查詢和搜索。

3、基於這個機理,我查用ST05來監控一個TCODE來跟蹤,然後選擇查找有關上述幾個表和視圖的操作,就可獲得相關BADI。

4、se18 查找接口,se19 實現接口就可以實現用戶增強。

現在很多朋友使用 BAPI 都處於一種 google 的狀態,就是說只能在網上搜索到相關的函數和調用方法,卻難以跟實際業務對應起來,這對應付眼前開發是足夠了,但是換個需求換個業務,又得抓瞎。

大家都有一個疑問,我知道的這個 BAPI 函數究竟屬於哪個業務對象呢?今天我們就來揭密。

BAPI 函數跟業務對象的關係存儲在表 SWOTLV 中,對於一個業務對象,除了函數外,還存儲了一些其它信息,我們這裏先不管它。這個表的 ABAPNAME 字段存儲的就是函數名稱,而 LOBJTYPE 字段則存儲

發佈了28 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章