SAP 增強


SAP 中如何尋找增強

方法一、利用TCODE尋找增強(第二代的增強)

執行一個程序(源代碼后附),在選擇屏幕處輸入你所需要增強的程序TCODE,執行後,就會出現一個列表,那里就有關於如何增強這個的絕大部分SMOD增強。

點擊進去,自己手動尋找需要的增強。

這是第二代增強

方法二、利用系統函數尋找

 

MODX_FUNCTION_ACTIVE_CHECK

在這個FUNCTION的代碼最后添加一個斷點。執行需要增強的TCODE,如果有增強,就會自動跳入DEBUG界面。在DEBUG界面,查看f_tab字段,這里面所顯示的Smod就是關於這個TCODE所有的增強項目的列表。這些增強都是屬於EXIT_XXXXXX_XXX這種形式。

至於如何查看這個增強是屬於哪個SMOD,可以自己查閱 MODSAP這個表(SAP Enhancements.

這是第二代增強。

還有一些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(屏幕增強)

這些的使用方法和上述的一樣,可以針對各種情況尋找增強。

方法三、從程序代碼中找

在需要增強的事務里面,打開SYSTEM——》status,雙擊進入PROGRAM,查看所有的subroutines 重點觀察所有形似 userexit_******* 這種,由描述來確定合適的需要增強的FORM。這里是第一代的增強。

方法四、針對BADI的增強

轉摘自網上

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

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

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

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

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

首先來講解一下什么是出口,顧名思義,就是一段程序執行到最后必經的一段程序。

為什么會有出口呢?因為正常的業務系統不能滿足實際需求,這時可以在出口中增加一些功能,來達到要求,這也就是為什么它還叫增強。我感覺它跟給操作系統打補丁差不多。

Sap中出口就是標准程序最后要調用的一個函數或者功能模塊,這個函數或功能模塊的輸入已經由Sap定義好。

自己寫的SAP出口程序在系統升級的時候會被保留,而如果更改標准程序在SAP系統升級的時候會被覆蓋。

下面介紹一下什么時候需要使用出口以及出口的種類:

1:在業務檢查時,比如在某個工廠發貨,可以設定在某個庫位的出貨只能使用某種移動類型。

2:在需要界面增強時,比如用戶對某個字段要求大寫,但是最終用戶不按規范操作,這也可以在出口中自動轉換,有些模塊甚至能自定義數據庫字段,並且可以在出口中增加字段輸入。還有的模塊能對輸入數據檢查,甚至實現自動替代等功能。

3:有不規則業務時,比如按某種條件定價,可以設定從自己定義的表中按某種條件取值

4:搜索幫助的出口,可以對Sap標准的搜索幫助做權限控制。

等等。

SAP有四種基本用戶出口的類型:

1.菜單出口-Menu Exits

定義自己的菜單

2.屏幕出口-Screen Exits

定義自己的屏幕

3.功能模塊出口-Function Module Exits

SAP應用程序中添加功能

4.關鍵字出口-Keyword Exits

ABAP/4字典中的關鍵字數據元素添加文檔。結果是你在使用這些數據元素的字段處按F1后會出現你自定義的說明文檔

因為出口都是被Sap預先定義好的,那么怎么尋找自己需要的出口呢?

1:可以通過配置文檔的幫助和SAP library 尋找業務系統的出口,sap library 在‘implementation guide’中尋找出口,在配置功能執行按鈕左邊一般都有一個說明文檔,描述相關的出口。

2:為了方便我們把所有的出口名稱及其描述列在文章的后面。

下面具體介紹怎樣寫出口程序:

為了對出口程序的修改進行管理,sap提供了專門用來管理出口程序的事務,事務代碼是CMOD

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

sap的用戶出口總共有三代:

1、第一代

sap提供一個空代碼的子過程,在這個子過程中用戶可以添加自己的代碼,控制自己的需求。這類增強都需要修改sap的標准代碼。

示例:USEREXIT.. in SAPMV45A

2、第二代

sap提供的是CUSTOMER-FUNCTION,它是通過SMODCMOD完成實現。

3、第三代

sap提供的第三代的用戶出口就是BADI,他的調用方式是CALL METHOD (instance),(相關的TCODESE18SE19),可以通過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:MODSAPenhancement輸入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,用程序也可.

 

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

1.1 SMOD包含具體的增強,而CMOD是包含一組SMOD編寫的增強.

1.2 User exits (Function module exits)sap提供出口,它的命名規則如下:

EXIT_<program name><3 digit suffix>

示例:

sdVA01事務,對應的程序是SAPMV45A ,你會在程序里查到(用CALL CUSTOMER-FUNCTION字符串)如下代碼:

CALL CUSTOMER-FUNCTION '003'

exporting

xvbak = vbak

xvbuk = vbuk

xkomk = tkomk

importing

lvf_subrc = lvf_subrc

tables

xvbfa = xvbfa

xvbap = xvbap

xvbup = xvbup.

exit calls function module的名稱就是: EXIT_SAPMV45A_003

 

2、先試用SMOD建立一個SAP增強

2.1、選擇一個增強,如:SDVFX001 ,點擊修改,進入sap增強維護屏幕;

2.2、點擊“組件”按鈕,進入組件維護屏;

2.3、將光標移到“功能模塊名”,輸入模塊名,如:EXIT_SAPLV60B_001

2.4、選擇“代碼修改”按鈕進入函數模塊;

2.5、雙擊函數模塊的包含單元,進入包含單元加入自定義代碼並激活保存;

3、使用CMOD建立增強項目

3.1、輸入自定義的項目名,點擊“創建”;

3.2、進入增強項目,選擇“配置增強”,進入增強配置屏幕;

3.3、輸入增強名如:SDVFX001

3.4、保存,並退出;

4、使用CMOD將增強項目激活,便大工告成。

如何查找

*判斷是否存在相應增強的定義(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'.

*判斷該增強是否移植到BADI實現

*Enhancement & has already been migrated in Business Add-In definition

select single migrated badi_def into (migrated, exit_name)

from modsapa where name = modname.

if sy-subrc = 0 and migrated = seex_true.

message s621 with modname exit_name.

check mode ne 'CHAM'.

endif.

MODTYP 類型:

E : 功能退出

S : 屏幕

T :

C : GUI代碼

sap增強存在MODSAP表內

*獲取增強組件的參見函數MOD_SAP_MEMBER_TEXT

*獲得退出功能模塊的信息

select single * from tftit

where "SPRAS" = '1' AND "FUNCNAME" = 'EXIT_SAPLCORE_001'

if sy-subrc = 0.

endif.

*值得學習的函數

MOD_KUN_ACTIVATE(會操作相關報表)

 

SAP 中如何尋找增強

方法一、利用TCODE尋找增強(第二代的增強)

執行一個程序(源代碼后附),在選擇屏幕處輸入你所需要增強的程序TCODE,執行後,就會出現一個列表,那里就有關於如何增強這個的絕大部分SMOD增強。

點擊進去,自己手動尋找需要的增強。

這是第二代增強

方法二、利用系統函數尋找

MODX_FUNCTION_ACTIVE_CHECK

在這個FUNCTION的代碼最后添加一個斷點。執行需要增強的TCODE,如果有增強,就會自動跳入DEBUG界面。在DEBUG界面,查看f_tab字段,這里面所顯示的Smod就是關於這個TCODE所有的增強項目的列表。這些增強都是屬於EXIT_XXXXXX_XXX這種形式。

至於如何查看這個增強是屬於哪個SMOD,可以自己查閱 MODSAP這個表(SAP Enhancements.

這是第二代增強。

還有一些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(屏幕增強)

這些的使用方法和上述的一樣,可以針對各種情況尋找增強。

方法三、從程序代碼中找

在需要增強的事務里面,打開SYSTEM——status,雙擊進入PROGRAM,查看所有的subroutines重點觀察所有形似 userexit_******* 這種,由描述來確定合適的需要增強的FORM。這里是第一代的增強。

方法四、針對BADI的增強

轉摘自網上

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

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

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

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

************************************************************************************************************************************
首先來講解一下什么是出口,顧名思義,就是一段程序執行到最后必經的一段程序。

為什么會有出口呢?因為正常的業務系統不能滿足實際需求,這時可以在出口中增加一些功能,來達到要求,這也就是為什么它還叫增強。我感覺它跟給操作系統打補丁差不多。

Sap中出口就是標准程序最后要調用的一個函數或者功能模塊,這個函數或功能模塊的輸入已經由Sap定義好。

自己寫的SAP出口程序在系統升級的時候會被保留,而如果更改標准程序在SAP系統升級的時候會被覆蓋。

下面介紹一下什么時候需要使用出口以及出口的種類:

1:在業務檢查時,比如在某個工廠發貨,可以設定在某個庫位的出貨只能使用某種移動類型。

2:在需要界面增強時,比如用戶對某個字段要求大寫,但是最終用戶不按規范操作,這也可以在出口中自動轉換,有些模塊甚至能自定義數據庫字段,並且可以在出口中增加字段輸入。還有的模塊能對輸入數據檢查,甚至實現自動替代等功能。

3:有不規則業務時,比如按某種條件定價,可以設定從自己定義的表中按某種條件取值

4:搜索幫助的出口,可以對Sap標准的搜索幫助做權限控制。

等等。

SAP有四種基本用戶出口的類型:

1.菜單出口-Menu Exits

定義自己的菜單

2.屏幕出口-Screen Exits

定義自己的屏幕

3.功能模塊出口-Function Module Exits

SAP應用程序中添加功能

4.關鍵字出口-Keyword Exits

ABAP/4字典中的關鍵字數據元素添加文檔。結果是你在使用這些數據元素的字段處按F1后會出現你自定義的說明文檔

因為出口都是被Sap預先定義好的,那么怎么尋找自己需要的出口呢?

1:可以通過配置文檔的幫助和SAP library 尋找業務系統的出口,sap library ‘implementation guide’中尋找出口,在配置功能執行按鈕左邊一般都有一個說明文檔,描述相關的出口。

2:為了方便我們把所有的出口名稱及其描述列在文章的后面。

下面具體介紹怎樣寫出口程序:

為了對出口程序的修改進行管理,sap提供了專門用來管理出口程序的事務,事務代碼是CMOD

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

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

3、第三代
sap
提供的第三代的用戶出口就是BADI,他的調用方式是CALL METHOD (instance),(相關的TCODESE18SE19),可以通過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:MODSAPenhancement輸入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’,用程序也可.


*************************************************************************************************************
1.1 SMOD
包含具體的增強,而CMOD是包含一組SMOD編寫的增強.
1.2 User exits (Function module exits)
sap提供出口,它的命名規則如下:
EXIT_<program name><3 digit suffix>
示例:
sd
VA01事務,對應的程序是SAPMV45A ,你會在程序里查到(用CALL CUSTOMER-FUNCTION字符串)如下代碼:
CALL CUSTOMER-FUNCTION '003'
exporting
xvbak = vbak
xvbuk = vbuk
xkomk = tkomk
importing
lvf_subrc = lvf_subrc
tables
xvbfa = xvbfa
xvbap = xvbap
xvbup = xvbup.
exit calls function module的名稱就是: EXIT_SAPMV45A_003


2
、先試用SMOD建立一個SAP增強
2.1
、選擇一個增強,如:SDVFX001 ,點擊修改,進入sap增強維護屏幕;
2.2
、點擊組件按鈕,進入組件維護屏;
2.3
、將光標移到功能模塊名,輸入模塊名,如:EXIT_SAPLV60B_001
2.4
、選擇代碼修改按鈕進入函數模塊;
2.5
、雙擊函數模塊的包含單元,進入包含單元加入自定義代碼並激活保存;

3、使用CMOD建立增強項目
3.1
、輸入自定義的項目名,點擊創建
3.2
、進入增強項目,選擇配置增強,進入增強配置屏幕;
3.3
、輸入增強名如:SDVFX001
3.4
、保存,並退出;

4、使用CMOD將增強項目激活,便大工告成。

如何查找
*
判斷是否存在相應增強的定義(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'.

*判斷該增強是否移植到BADI實現
*Enhancement & has already been migrated in Business Add-In definition
select single migrated badi_def into (migrated, exit_name)
from modsapa where name = modname.
if sy-subrc = 0 and migrated = seex_true.
message s621 with modname exit_name.
check mode ne 'CHAM'.
endif.

MODTYP 類型:
E :
功能退出
S :
屏幕
T :

C : GUI
代碼
sap
增強存在MODSAP表內

*獲取增強組件的參見函數MOD_SAP_MEMBER_TEXT
*
獲得退出功能模塊的信息
select single * from tftit
where "SPRAS" = '1' AND "FUNCNAME" = 'EXIT_SAPLCORE_001'
if sy-subrc = 0.
endif.

*值得學習的函數
MOD_KUN_ACTIVATE(
會操作相關報表)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM