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