用户接口(User exit)
在標準SAP業務應用中常會修改標準程序和增加一些自己的功能代碼來滿足特定化的需求,SAP提供了一些出口對特定的程序、屏幕、MENU以及Docuement進行擴展與修改,他們并不包含任何功能,并被分離存在特定的package里所以他既不會影響標準SAP源代碼也不會妨礙升級。除了通過后臺配置客戶化,我們常用主要有三種用戶出口來進行Enhancement和Modification:????
??????1,User Exit,最早的出口嵌寫在標準程序里,修改起來也最為復雜。如Order處理上使用的SAPMV45A中就包含大量ZZ或YY結尾的user exit程序MV45AFZZ/MV45AIZZ。?
??????2,Customer Exit,主要有三種類型Menu Exit/Screen Exit/FM Exit,首先通過CMOD來創建一個Project然后指定所需要的Enhancement,然后指定Component并激活。最后則需要加些所需代碼在自動創建一個Z程序里。
??????3, BADI,SE18/SE19,正如引入了OO的技術,在定義與實現在與Customer Exit兩層是一樣的,能客戶化用戶想用的標準解決方案的邏輯,對于開發者主要是通過一些方法來找到合適的BADI。
?
用戶接口(user exit)就是SAP提供的一些Form, 這些Form會在特定的時候被標準程序Call到。標準系統里面這些Form是空的,用戶可以根據自己的業務要求添加程序進去,不過這些程序需要用戶自己承擔風險,因為User exit其實也屬于Modification的一種。那么對各個User exit越了解,出錯的可能性就越小,所以在這篇日志中我們來談談SD sales這個流程中用到的User exit的用途,應用以及信息輸出。
?
FORM routine USEREXIT_REFRESH_DOCUMENT (Include MV45AFZA)
用途:FORM routine USEREXIT_REFRESH_DOCUMENT可以在創建或者處理新訂單之前,對用戶自定義的數據進行初始化。
Call:此接口被BELEG_INITIALISIEREN(SAPMV45A) call。通常這個程序會在訂單被保存之后或者是用戶選擇’Back’ 或’Cancel’ 回到初始畫面之前運行。
數據讀取:不建議在這個User exit里面進行訂單數據的讀取,后果不祥。
信息輸出:在這個User exit里面輸出錯誤信息沒有意義。
FORM routine USEREXIT_DELETE_DOCUMENT (Include MV45AFZZ)
用途:當一個銷售訂單被刪除的時候,您可以通過這個接口來刪除您自己定義的一些獨立數據。
Call:此接口實在銷售訂單能夠被完全刪除的時候在BELEG_LOESCHEN (SAPMV45A) 中被call到。它緊接著FORM
routine USEREXIT_DELETE_DOCUMENT。
數據讀取:可以在此接口中讀取到理論上已經被刪除(數據庫還未更新)的銷售訂單數據。構造VBAK中儲存了抬頭信息。
內表XVBAP中儲存了將要被刪除的項目信息,包括刪除前用戶對項目進行的最后修改,每個項目的變更指示(UPDKZ)都是“D”.
內表YVBAP中包含了所有項目的信息。
內表XVBUP,XVBPA中已經不包含任何當前訂單的信息。存在數據庫上的數據可以在YVBUP和YVBPA中查到。
內標XVBUK仍然存在,YVBUK不存在。
在此接口中對內表進行操作會引發數據不一致,因此不推薦。
信息輸出:錯誤信息的輸出在USEREXIT_DELETE_DOCUMENT中應被限制。在此接口中不可以輸出E或者W信息??赡軙lDump DYNPRO_MSG_IN_HELP .
附加信息:當此接口被Call到的時候,刪除銷售訂單的這個操作已經無法被避免,因為理論上數據都已經刪除了。如果必須要求停止刪除的操作,那么可以用信息類型A來強制中止運行。
FORM routine USEREXIT_READ_DOCUMENT (Include MV45AFZZ)
用途:這個接口用來讀取您自己的數據以便于后續進行訂單處理。
Call:此接口會在變更或者顯示訂單的時候被Call到。
數據讀取:在此接口中可以讀取到當前訂單所有已經被讀取的信息。理論上在此接口中也可以對已經讀取的數據進行更改,不過請先閱讀在
?USEREXIT_SAVE_DOCUEMENT_PREPARE描述中介紹的變更訂單的注意事項。
信息輸出:基本無限制。不過需要注意這個接口在Background處理的時候也會被Call到。
FORM routine USEREXIT_MOVE_FIELD_TO_VBAK (Include MV45AFZZ)
用途:這個接口用來給您自己添加在VBAK表中的項目付值。
Call:此接口在新訂單創建的過程中,在VBAK_FUELLEN(SAPMV45A)的結尾被Call到。
數據讀取:在此階段還讀取不到其他數據,因為此訂單還在創建過程中。不過當參照其他訂單創建銷售訂單的時候,在這個接口中通過內表CVBAK, CVBAP, CVBPA, CVBEP可以讀到被參照訂單的數據。讀取這些數據的時候請注意保證這些表的表頭不被更改,可以把數據導到自定義的構造中處理。
如果您想在此接口中對已經存在的VBAK項目值進行更改,請注意,針對這些項目進行過的檢查是需要您重新觸發的。請提前進行獨立性分析,以避免數據不一致。不推薦在此接口中對VBAK以外的數據進行更改,很容易造成數據不一致。
信息輸出:錯誤信息不允許才此接口直接輸出。您可以通過FORM routine MESSAGE_HANDLING (main program SAPMV45A)對信息類型I或者E的信息來創建錯誤日志(如果是在變更模式下,這些信息將不會被直接輸出,而是保存在日志中)。信息類型W的信息是不會被包含在日志中的。
FORM routine USEREXIT_MOVE_FIELD_TO_VBAP(Include MV45AFZZ)
用途:這個接口用來給您自己添加在VBAP表中的項目付值.
Call:這個接口會在創建項目的時候,在VBAP_FUELLEN(參照創建)或者VBAP_FUELLEN_OR(無參照創建)的末尾被Call到。
數據讀取:此接口被Call到的時候,表頭信息(結構VBAK)和合伙伙伴(內表XVBPA)可以讀取到。新項目的狀態(VBUP)還不能讀取。如果之前已經登錄了其他的項目,那么表頭的狀態可以在XVBUK中讀取到。已經存在的項目狀態可以在內表XVBUP中讀取到。如果您想在此接口中對已經存在的標準表項目值進行更改,請注意,針對這些項目進行過的檢查是需要您重新觸發的。請提前進行獨立性分析,以避免數據不一致。不建議在此接口中對其他表的項目值進行修改。請注意不要更改現有的內表的表頭。建議創建您自己的結構來讀取內表中的值以確保標準內表不被更改。
信息輸出:直接的信息輸出是不允許的,會造成數據不一致。您可以通過FORM routine MESSAGE_HANDLING (main program SAPMV45A)對信息類型I或者E的信息來創建錯誤日志(如果是在變更模式下,這些信息將不會被直接輸出,而是保存在日志中)。
?
FORM routine USEREXIT_SAVE_DOCUMENT_PREPARE (Include MV45AFZZ)
用途:此接口是用途最廣泛的接口??梢杂脕韺︿N售定單中的數據進行最后的修改。當此接口被Call到的時候,這張單子的數據已經完整,只有訂單號沒有被決定(僅限于創建訂單的時候)。因此在此接口中所作的修改一般是不會有后續檢查來避免不一致的。
Call:此接口在訂單被保存之前在BELEG_SICHERN (SAPMV45A)中被Call到。
數據讀取:因為是在訂單保存之前被Call到,所有信息都可以在內表中被讀取到。現存的值是存在X表中,更改之前的值存在Y表中。
信息輸出:如果您想輸出信息的話,必須要考慮到這個接口在Background處理的時候也會被Call到。
FORM routine USEREXIT_SAVE_DOCUMENT (Include MV45AFZz)
用途:此接口用來保存您自定義的數據值。標準表中的信息已經不能被更改,因為才此階段,標準表值已經被傳輸到更新。
Call:此接口在訂單保存過程中,緊挨著Commit work之前被BELEG_SICHERN(SAPMV45A) Call到。
數據讀取:跟USEREXIT_SAVE_DOCUMENT_PREPARE 一樣,所有信息都可以在內表中被讀取到。并且如果是登錄訂單的情況,訂單號也可以讀取到。請務必不要在此接口中加入COMMIT WORK 或ROLLBACK WORK 語句。
信息輸出:不允許在此接口輸出對話信息。因為此處已經非常臨近Commit work了。如果業務要求必須中止訂單保存,可以使用message type “A”來強行中止。
?
?
轉自:
?
?
http://mysap.iteye.com/blog/171534
?
http://scnblogs.techweb.com.cn/erpsd/archives/tag/user-exit
總結
以上是生活随笔為你收集整理的用户接口(User exit)的全部內容,希望文章能夠幫你解決所遇到的問題。