




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ABAP開發(fā)中的增強(qiáng)日期:2008-10-12開始整理版權(quán)聲明:大部分資料來源于網(wǎng)絡(luò),部分文字、格式及排版出自本人,部分截圖由本人親自完成,如 有侵權(quán),請(qǐng)告知本人,歡迎來信討論 SAP或ERP相關(guān)的話題。免責(zé)聲明:本資料僅供研究、學(xué)習(xí)、學(xué)術(shù)討論之用,不得用于生產(chǎn)環(huán)境。對(duì)于使用本文檔產(chǎn)生的損失, 本人不承擔(dān)任何責(zé)任! 一般說明使用SAP的增強(qiáng)建議系統(tǒng)學(xué)習(xí)一下SAP標(biāo)準(zhǔn)教材 BC425和BC427。ABAP開發(fā)中的增強(qiáng)至少經(jīng)歷了 4代,下面詳細(xì)說明。第一代:基于源代碼的增強(qiáng)源代碼增強(qiáng)以子程序形式發(fā)布,在SAP的發(fā)行版本中,使用PERFORM調(diào)用這些子程序,它們?cè)诎l(fā)布時(shí)都是空的,sap提供一個(gè)空代碼
2、的子過程,在這個(gè)子過程中用戶可以添加自己的代碼,控制自己的需求。這類增強(qiáng)需要修改sap的標(biāo)準(zhǔn)代碼。示例:USEREXIT . in SAPMV45A。主要集中在一些文件名倒數(shù)第二個(gè)字符為Z的包含程序中。用戶增強(qiáng)時(shí),應(yīng)首先到service marketplace申請(qǐng)對(duì)象鍵,然后才能修改這些子程序,這些子程序可以使用程序中所有的全局?jǐn)?shù)據(jù)。對(duì)于第一代增強(qiáng),可以用以下方法查找增強(qiáng):打開欲增強(qiáng)的程序,點(diǎn)擊工具欄上的"Display Object List ”按鈕,選擇Subroutines,查找以"UserExit”開頭的子程序,根據(jù)子程序前面的注釋文檔來查找用戶出口,如下圖,事務(wù)碼
3、:SE38ABAP Editor: Initial ScreenProgramSAPMV45A)Subobjects® Source Code O VariantsO AttributesO Docu mentationO Text elements血 Display夕 Change口I8E0(JiRepository Bro wserSAPlf日1ZJ23邛121315161718LUABAP Editor: Display Mod Pool SAPMV45AABAP Editor: Display Mod. Pool SAPMV45AActive 團(tuán)禺畫1西tnigF面這些以US
4、EEXIT_開頭的都是空的子程序,可以添加自己的代碼。Mod. Pool二lElllg區(qū)固HI西U囤囹SAPMV45AMod. Pool| ProgramObject Name矽|會(huì)器| EET IS|SAPMV45A 口 SAPMV45A> Dictionary StnicturesI> Classes口 Typesl> Fieldst> 口 Macrosi卜 口 Events/t> PBO Modules / A PAI Modules j/ S Subroutines' P V W V T !r VB PPhL'WPPF kh'WFP
5、Pkh VW V T h FABHOLFErJSTER.PRUEFENADOICPROFSELECTA DOI CP .SELECTA A i tr II I TMlA /iTr m ILLLiMI *$*$-End:r cEMHANCEMEN1 ENHANCEMEN1 include fc INCLUDE DL EMDEMHArJCEbModulpool zur KundenauftragsbearbeijINCLUDE MV45AT0P.EMHAMCEMENT-POINT SAPMV45A 03 SPOTS ES SAPWlii rkid i Ji m/" rtiirikiT*$
6、-Start: SAPMV45A_03ABAP Editor: Display Include MV45AFZFIncludeMV45AFZFActkfeProgram工|SAPMV45A糾iaRepostoiy Browser和"T可百I需畫鬲| E3Object NameU5EREXITUSEREXITUSEREXITUSEREXITUSEREXITUSEF5EXIT,AVAIL_CHECK_CRED1TCHECK_VBAKCHECK_V0APCHECK_V0EPCHECK_VBKD CHECK_VBLB-USR0162!63!64:65|66;67)希7&7172方 F
7、ORM USEREXIT CONFIGURATIO忖 MODE CHANGING CH DISPLAY.* ExampleI申 * user status 91 is set* if vbuk-uvkQl eq chars.* ch_display = charxn -* endif-ENDFORM .*ejctUSEREXITUSEREXIT USEREXITU5EREXIT USEREXIT USEREXn USEREXIT USEftEXlT USEREXIT USEF?EXIT USEREXITUSEREXITCHECK_VBLB-USR02CHECK_VBLB-USR03CHECK_
8、VBLB-USR04CHECK_VBLB-USR05CHECK_VBStJCHECKJCV0AP_FO R_D ELET CHECK_XVBEP_FO R_DELET CHECkZxVBSnZfO R_D ELET COBL_RECEIVE_V6AkCO 肌-RECEIVE_VBAPCOBL SEND HEADERCOBL SEND ITEMUSEREXIT匚OIIFIGUUTIOe mooeUSEFIEXITCONFIG DATE EXPLOSION屏幕增強(qiáng)以客戶屏幕形式發(fā)布,它們包含在標(biāo)準(zhǔn)程序中,沒有什么特別規(guī)律。這種源代碼增強(qiáng)和屏幕增強(qiáng)的說明可以從事務(wù)碼spro后臺(tái)配置中相關(guān)模塊的路徑里
9、面找到。同時(shí)使用的針對(duì)數(shù)據(jù)表的增強(qiáng)是appe nd structure,可以在事務(wù)碼 sell中打開透明表,點(diǎn)擊應(yīng)用工具欄最右邊的那個(gè)appe nd structure按鈕就能為數(shù)據(jù)表追加新的字段。這種更改標(biāo)準(zhǔn)程序的方法現(xiàn)在很少使用,因?yàn)橄到y(tǒng)升級(jí)有可能不能工作。如果在代碼中改變了全局變量,還可能會(huì)破 壞系統(tǒng)原有的邏輯。第二代:基于函數(shù)模塊的增強(qiáng)源代碼增強(qiáng)以函數(shù)模塊形式發(fā)布,在SAP的發(fā)行版本中,使用CALL CUSTOMER-FUNCTION調(diào)用這些函數(shù)模塊,它們?cè)诎l(fā)布時(shí)只有一句代碼INCLUDE xxxxxxx。用戶增強(qiáng)時(shí),無需申請(qǐng)對(duì)象鍵,直接雙擊這個(gè)包含,然后回車,就可以創(chuàng)建相關(guān)的包含文件
10、,編寫相應(yīng)的代碼了。這些函數(shù)模塊中只能使用接口中傳遞的參數(shù),不能使用調(diào)用程序的全局 變量。Sap中出口就是標(biāo)準(zhǔn)程序最后首先來講解一下什么是出口,顧名思義,就是一段程序執(zhí)行到最后必經(jīng)的一段程序。在 要調(diào)用的一個(gè)函數(shù)或者功能模塊,這個(gè)函數(shù)或功能模塊的輸入已經(jīng)由Sap定義好。為什么會(huì)有出口呢?因?yàn)檎5臉I(yè)務(wù)系統(tǒng)不能滿足實(shí)際需求,這時(shí)可以在出口中增加一些功能,來達(dá)到要求,這也就 是為什么它還叫增強(qiáng)。SAP系統(tǒng)升級(jí)的時(shí)候會(huì)被覆蓋。自己寫的SAP出口程序在系統(tǒng)升級(jí)的時(shí)候會(huì)被保留,而如果更改標(biāo)準(zhǔn)程序在F面介紹一下什么時(shí)候需要使用出口以及出口的種類:1、在業(yè)務(wù)檢查時(shí),比如在某個(gè)工廠發(fā)貨,可以設(shè)定在某個(gè)庫位的出
11、貨只能使用某種移動(dòng)類型。2、在需要界面增強(qiáng)時(shí),比如用戶對(duì)某個(gè)字段要求大寫,但是最終用戶不按規(guī)范操作,這也可以在出口中自動(dòng)轉(zhuǎn)換,有 些模塊甚至能自定義數(shù)據(jù)庫字段, 并且可以在出口中增加字段輸入。 還有的模塊能對(duì)輸入數(shù)據(jù)檢查, 甚至實(shí)現(xiàn)自動(dòng) 替代等功能。3、有不規(guī)則業(yè)務(wù)時(shí),比如按某種條件定價(jià),可以設(shè)定從自己定義的表中按某種條件取值。4、搜索幫助的出口,可以對(duì) Sap 標(biāo)準(zhǔn)的搜索幫助做權(quán)限控制,等等。SAP 有四種基本用戶出口的類型:1、菜單出口 -Menu Exits ,定義自己的菜單;2、屏幕出口 -Screen Exits ,定義自己的屏幕;3、功能模塊出口 -Function Module
12、Exits,在SAP應(yīng)用程序中添加功能;4、關(guān)鍵字出口 -Keyword Exits,在ABAP/4字典中的關(guān)鍵字?jǐn)?shù)據(jù)元素添加文檔。結(jié)果是你在使用這些數(shù)據(jù)元素的字段 處按 F1 后會(huì)出現(xiàn)你自定義的說明文檔。因?yàn)槌隹诙际潜?Sap預(yù)先定義好的,那么怎么尋找自己需要的出口呢?1可以通過配置文檔的幫助和SAP library尋找業(yè)務(wù)系統(tǒng)的出口,sap library在implementation guide '中尋找出口,在配置功能執(zhí)行按鈕左邊一般都有一個(gè)說明文檔,描述相關(guān)的出口。2:為了方便我們把所有的出口名稱及其描述列在文章的后面。下面具體介紹怎樣寫出口程序:為了對(duì)出口程序的修改進(jìn)行管理
13、,sap提供了專門用來管理出口程序的事務(wù),事務(wù)代碼是CMOD。這些出口函數(shù)有標(biāo)準(zhǔn)處理程序傳入的參數(shù)和輸出參數(shù),用戶可根據(jù)系統(tǒng)輸入?yún)?shù)作為條件編寫適合本企業(yè)流程的邏輯,然后通過輸出參數(shù)傳回給 SAP 。屏幕增強(qiáng)也包含在函數(shù)模塊所屬的函數(shù)組中。針對(duì)數(shù)據(jù)表的增強(qiáng)是 CI_ 結(jié)構(gòu),這些結(jié)構(gòu)以 .INCLUDE 結(jié)構(gòu)的形式包含在 SAP 發(fā)布的數(shù)據(jù)表中,用戶可以通過向 這些結(jié)構(gòu)中添加字段而對(duì)數(shù)據(jù)表進(jìn)行增強(qiáng)。上述這類增強(qiáng)通過事務(wù)碼 SMOD 進(jìn)行維護(hù), CMOD 進(jìn)行實(shí)現(xiàn)。 SMOD 中的一個(gè)增強(qiáng)可以包含上述的源代碼、 屏幕和 表結(jié)構(gòu)增強(qiáng),按照較容易理解的邏輯結(jié)構(gòu)來管理這些增強(qiáng),使用相對(duì)更加便利。對(duì)于第二
14、代增強(qiáng),可以用以下方法查找增強(qiáng)用戶增強(qiáng)通常包括下面3類,顧名思義,就是增強(qiáng)SAP的可能沒有提供的功能(通過后臺(tái)配置也不能實(shí)現(xiàn)).1. E Enhancement exits :就是常說 User_exit ( 用戶出口 )使用SE37搜索EXIT*的函數(shù)大都是做 exit用的,通常里面預(yù)包含了一個(gè) Z開頭的程序 . SE16 查詢 TFDIR( 函數(shù)表 )輸入 EXIT* 也可 .2. C GUI codes( GUI 接口增強(qiáng) )3. S Subscreens (屏幕增強(qiáng) )Enhancement在表MODSAP可看到,而 TFDIR字段 MAND(值為C表示此出口函數(shù)被激活).使用SMOD
15、(CMOD)當(dāng)然可 激活exit function,有時(shí)候一時(shí)難以查詢到相關(guān)Enhancement時(shí)可使用下面程序?qū)⒊隹诤瘮?shù)激活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 換成實(shí)際所需 exit 函數(shù)名update tfdi
16、r set MAND = 'C'.where FUNcname = 'EXIT_SAPMM06E_013'.* 當(dāng)然也可 SE16:M0DSAP 表 enhancement輸入 EXIT_SAPMM06E_013 然后得到 enhancement name MM06E005 后使 用 SMOD 測(cè)試激活 exit 函數(shù) .增強(qiáng)相關(guān)函數(shù)和表格Function:1 .DYNP_V ALUES_READ2 . M0DX_ALL_ACTIVE_MENUENTRIES(菜單增強(qiáng) )3 .M0DX_FUNCTI0N_ACTIVE_CHECK(出口函數(shù)增強(qiáng) )由于讀者可能接觸
17、 user exit 最多 ,除了附錄光盤有個(gè)查找ZFINDEXIT 的程序外 (有些 exit 使用它并不能找到 ),另一個(gè)直接有效的方法就是使用這個(gè)函數(shù) ,SE37 設(shè)好斷點(diǎn)后執(zhí)行 tcode 如其有 exit 就會(huì)調(diào)用此函數(shù) .4 .M0DX_MENUENTRY_ACTIVE_CHECK(菜單增強(qiáng) )5 .M0DX_SUBSCREEN_ACTIVE_CHECK(屏幕增強(qiáng) )Table:1 . TFDIR->function module table2 . M0DSAP->sap enhancement table3 . TSDIR->Dynpro Areas CALL
18、CUST0MER SUBSCREEN(屏幕增強(qiáng) )4 . CUA TEXTS-> GUI Interface: Menu Texts Changed(GUI 菜單文本增強(qiáng) )* 注意 ,為了確保一個(gè)出口被真正應(yīng)用,必須同時(shí)激活相關(guān)程序(SE38) 和出口函數(shù) (SM0D|CM0D, 反正就是要保證tfdir-mandt= ' C',用程序也可.)the third generation enhancement will be discussed in the next post.1 、關(guān)于增強(qiáng)的簡(jiǎn)單介紹1.1 SM0D 包含具體的增強(qiáng),而 CM0D 是包含一組 SM0D
19、編寫的增強(qiáng) .1.2 User exits (Function module exits) 是 sap 提供出口,它的命名規(guī)則如下:EXIT_<program name><3 digit suffix>示例:sd 的 VA01 事務(wù),對(duì)應(yīng)的程序是 SAPMV45A ,你會(huì)在程序里查到(用 CALL CUST0MER-FUNCTI0N 字符串) 如下代碼:CALL CUST0MER-FUNCTI0N '003'exportingxvbak= vbakxvbuk= vbukxkomk = tkomkimportinglvf_subrc = lvf_subrc
20、tablesxvbfa = xvbfaxvbap = xvbapxvbup = xvbup.則 exit calls function module 的名稱就是: EXIT_SAPMV45A_0032、先試用 SM0D 建立一個(gè) SAP 增強(qiáng)2.1、選擇一個(gè)增強(qiáng),如:SDVFX001 ,點(diǎn)擊修改,進(jìn)入 sap增強(qiáng)維護(hù)屏幕;2.2、點(diǎn)擊 "組件 "按鈕,進(jìn)入組件維護(hù)屏;2.3、將光標(biāo)移到 " 功能模塊名 " ,輸入模塊名,如: EXIT_SAPLV60B_001 ;2.4、選擇 "代碼修改 "按鈕進(jìn)入函數(shù)模塊;2.5、雙擊函數(shù)模塊的包含
21、單元,進(jìn)入包含單元加入自定義代碼并激活保存;3、使用 CMOD 建立增強(qiáng)項(xiàng)目3.1、輸入自定義的項(xiàng)目名,點(diǎn)擊 "創(chuàng)建 ";3.2、進(jìn)入增強(qiáng)項(xiàng)目,選擇 "配置增強(qiáng) " ,進(jìn)入增強(qiáng)配置屏幕;3.3、輸入增強(qiáng)名如: SDVFX0013.4、保存,并退出;4、使用 CMOD 將增強(qiáng)項(xiàng)目激活,便大工告成。如何查找* 判斷是否存在相應(yīng)增強(qiáng)的定義 (SMOD) select single name from modsapa into mod0-name where name = 'PPCO0002'.if sy-subrc = 0.endif.sele
22、ct single 獲取增強(qiáng)組件的參見函數(shù) MOD_SAP_MEMBER_TEXT from tadir into ps_tadir_dbwhere pgmid= 'R3TR'and object = 'SMOD' and obj_name = 'PPCO0002'.* 判斷是否存在相應(yīng)增強(qiáng)項(xiàng)目的定義 (CMOD)SELECT SINGLE name FROM MODA TTR into mod0-name WHERE NAME= 'PPCO0002'.* 提取增強(qiáng)的定義的組件 (可以用此反查增強(qiáng)定義 )select * from
23、 modsapwhere name = 'PPCO0002'.* 判斷該增強(qiáng)是否移植到 BADI 實(shí)現(xiàn)*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_
24、name. check mode ne 'CHAM'.endif.MODTYP 類型 :E : 功能退出S : 屏幕T : 表C : GUI 代碼sap 增強(qiáng)存在 MODSAP 表內(nèi)*獲得退出功能模塊的信息 select single * from tftitwhere "SPRAS" = '1' AND "FUNCNAME" = 'EXIT_SAPLCORE_001' if sy-subrc = 0.endif.*值得學(xué)習(xí)的函數(shù) MOD_KUN_ACTIVA TE( 會(huì)操作相關(guān)報(bào)表 )小技巧 透視 ERP
25、 增強(qiáng)(一) 什么是增強(qiáng) (Enhancement)?簡(jiǎn)單地說,增強(qiáng)就是 ERP 系統(tǒng)中標(biāo)準(zhǔn)程序的出口,在該出口中由用戶根據(jù)企業(yè)實(shí)際需求編寫客戶化邏輯代碼。增強(qiáng)是 ERP 系統(tǒng)設(shè)計(jì)時(shí)考慮到企業(yè)實(shí)際的流程有可能和系統(tǒng)默認(rèn)標(biāo)準(zhǔn)流程不同,在標(biāo)準(zhǔn)流程框架下專門留的接口,每個(gè)接口 對(duì)應(yīng)一個(gè)客戶化函數(shù) ,這些出口函數(shù)有標(biāo)準(zhǔn)處理程序傳入的參數(shù)和輸出參數(shù),用戶可根據(jù)系統(tǒng)輸入?yún)?shù)做條件編寫適合 本企業(yè)流程的邏輯,然后通過輸出參數(shù)傳輸回。(二) 用戶增強(qiáng)分類SAP 的用戶增強(qiáng)通常包括下面 3 類。1. E類:Enhancement exits,即通常所謂的用戶出口( User_exit )用戶出口也叫功能出口 (
26、Function Exit) 。使用Tcode:SE37搜索EXIT*,找到的函數(shù)大都是做系統(tǒng)預(yù)留的出口函數(shù),前面說過,用戶出口是標(biāo)準(zhǔn)程序留給用戶的接口標(biāo)準(zhǔn)程序通常不允許用戶任意修改,如果修改需要申請(qǐng) Access Key,而且修改標(biāo)準(zhǔn)程序可能導(dǎo)致的錯(cuò)誤erp公司通常是不負(fù)責(zé)的。在SAP中,自定義的程序通常以保留字Y或Z開頭,因此,出口函數(shù)中都預(yù)包含了一個(gè)Z開頭的程序。2. C 類: GUI 接口 (GUI codes)3.S 類:屏幕增強(qiáng)(Screen Exit) 比如,在建立采購訂單,工單和固定資產(chǎn)主數(shù)據(jù)時(shí),系統(tǒng)都預(yù)留屏幕增強(qiáng),也就是說允許用戶自定義用戶輸入界面并 編寫相應(yīng)的輸入輸出處理程
27、序。在各類增強(qiáng)中,可能還用戶自己定義結(jié)構(gòu)或表格,系統(tǒng)對(duì)應(yīng)類型T類。比如增強(qiáng) MM06E005允許用戶建立兩個(gè)結(jié)構(gòu) CI_EKKODB 和 CI_EKPODB 。接下來將重點(diǎn)介紹功能出口的應(yīng)用。(三) 組織用戶增強(qiáng)相關(guān)增強(qiáng)表格:MODSAP: 增強(qiáng)表格TFDIR :包括出口函數(shù)在內(nèi)的所有函數(shù)表(E類)CUATEXTS: 修改 GVI 界面,界面 : 菜單文本被客戶 (C 類)TSDIR:動(dòng)態(tài)程序區(qū) CALL CUSTOMER SUBSCREEN(S 類)*對(duì)于以EXIT開頭的出口函數(shù),TFDIR-MAND 值為C表示此出口函數(shù)被激活。 相關(guān)增強(qiáng)檢查函數(shù):MODX_FUNCTION_ACTIVE_
28、CHECK:檢查 E 類用戶出口是否被激活。MODX_MENUENTRY_ACTIVE_CHECK:檢查 C 類增強(qiáng)激活狀況MODX_SUBSCREEN_ACTIVE_CHECK:檢查 S 類增強(qiáng)激活狀況你可能會(huì)發(fā)現(xiàn),SAP的各模塊的任何一個(gè)事務(wù)碼(Tcode)對(duì)應(yīng)的標(biāo)準(zhǔn)程序都留下了大量的用戶出口,正是SAP靈活的配置功能和強(qiáng)大的用戶出口才使其產(chǎn)品輕松應(yīng)對(duì)各種復(fù)雜需求成為可能,系統(tǒng)還為能快速找到和激活這些增強(qiáng)進(jìn)行了有效組織,各類增強(qiáng)被記錄在 table 中并且提供了相關(guān)檢查函數(shù),從而更方便企業(yè)用戶。,下表就是一個(gè)檢測(cè)系統(tǒng)熟悉 ABAP 開發(fā)的朋友通常都收集了一個(gè)可以輸入事務(wù)碼快速找到系統(tǒng)留下的
29、所有出口的程序 增強(qiáng)被激活的簡(jiǎn)單參考程序。* 該程序可以檢測(cè)出系統(tǒng)所有被激活的用戶增強(qiáng) * By Stone Fu. on 2006/11/07 .* Used to find out all the activated user-exit of SAP . report zfindactexit . tables: modsap,tfdir.data : begin of itab_exit occurs 0, funcname like tfdir-funcname, mand like tfdir-mand, name like modsap-name, end of itab_exit
30、 .data : field1(30). _select afuncname amand bname into table itab_exit from tfdir as ainner join modsap as b on afuncname = bmember where amand = 'C' and afuncname = bmember . format color col_heading intensified on. write:/1 sy-vline, 2 'Enhancement Name', 21 sy-vline , 22 'Act
31、ivated Exit Function', 95 sy-vline. write:/(95) sy-uline. loop at itab_exit. format color col_normal intensified off. write:/1 sy-vline, 2 itab_exit-name hotspot on, 21 sy-vline , 22 itab_exit-funcname, 95 sy-vline. endloop. at line-selection. get cursor field field1. set parameter id 'MON
32、39; field sy-lisel+1(10). call transaction 'SMOD' and skip first screen.有一種直接有效的查找用戶出口增強(qiáng)的方法,就是使用函數(shù) MODX_FUNCTION_ACTIVE_CHECK ,如圖 1。圖1中的判斷語句If tfdir-mand = aktiv_flag(常數(shù)C)則出口函數(shù)active標(biāo)志='X',表示該用戶出口被激活,處理邏輯將 從標(biāo)準(zhǔn)程序轉(zhuǎn)入出口函數(shù),在該語句設(shè)置斷點(diǎn)然后運(yùn)行任一個(gè)事務(wù)碼,都會(huì)調(diào)用該函數(shù)判斷是否存在用戶出口。(四)增強(qiáng)應(yīng)用實(shí)例業(yè)務(wù)背景 :如果采購訂單已經(jīng)做了發(fā)票校驗(yàn)
33、后,則不再允許用戶修改價(jià)格。相關(guān)程序: MM06EFPO_POT_FUELLEN| MM06EF0C_CUSTSCR1_ITEM_SET_DAT相關(guān) Tcode:SMOD|CMOD如果沒有啟動(dòng)采購審批功能, SAP 標(biāo)準(zhǔn)功能是允許用戶隨時(shí)修改采購價(jià)格的,不同的企業(yè)有對(duì)采購價(jià)格控制有不同的 策略,甲企業(yè)規(guī)模較小為了省事可能為以后數(shù)月的采購開了一個(gè)大采購單,如果中途材料價(jià)格變動(dòng)則直接修改價(jià)格就 行,乙集團(tuán)則嚴(yán)格控制采購價(jià)格,采購價(jià)格由總部集中維護(hù),各企業(yè)采購員只需要維護(hù)采購數(shù)量等信息等,真因如此,ERP 系統(tǒng)顯然不會(huì)去禁止用戶修改價(jià)格,如果企業(yè)確實(shí)需要如此,則可通過增強(qiáng)實(shí)現(xiàn)。 前面已經(jīng)介紹過如何通
34、過在函數(shù) MODX_FUNCTION_ACTIVE_CHECK 設(shè)置斷點(diǎn)跟蹤系統(tǒng)每個(gè)事務(wù)預(yù)留的用戶出口, 你很快將發(fā)現(xiàn)增強(qiáng) MM06E005 的 EXIT_SAPMM06E_017 用戶出口非常適合此業(yè)務(wù)背景。首先 來看 看增 強(qiáng) 的 EXIT_SAPMM06E_017 用 戶出 口 (以下 稱 017 出口 )處理 流程 ,Include 程序 MM06EFPO_POT_FUELLEN 被專門用來處理增強(qiáng)出口 ,調(diào)用了子程序 CUSTSCR1_ITEM_SET_DATA_PAI( 對(duì) 應(yīng) 下 一 級(jí) Include 程 序 MM06EF0C_CUSTSCR1_ITEM_SET_DAT), 分
35、 析 Include 程 序 MM06EF0C_CUSTSCR1_ITEM_SET_DAT 的代碼 ,如下表 ,這個(gè)程序是從系統(tǒng)原本 Copy 出來的 ,注意本人所加的附注粗 體部分 :* User-Exit f r Positionsfelder versorgen (PAI)FORM custscr1_item_set_data_pai USING im_no_screen LIKE fc_call."770427 DATA: l_ucomm LIKE sy-ucomm,l_enj_call TYPE c.STATICS: first_call(1) TYPE c VALUE &
36、#39;X',activeLIKE sy-calld.ENHANCEMENT-POINT CUSTSCR1_ITEM_SET_DATA_PAI_02 SPOTS ES_MM06EF0C_CUSTSCR1_I_SET_DAT INCLUDE BOUND .*$*$-Start: CUSTSCR1_ITEM_SET_DA TA_PAI_02$*$*ENHANCEMENT 1 OI0_COMMON_MM06EF0C_ITEM_S_DA T. "active version* C5030897 I.Twardowski Implementation of BADI for OGSDP
37、ERFORM OI0_BADISCR1_ITEM_SET_DATA_PAI. ENDENHANCEMENT.*$*$-End:CUSTSCR1_ITEM_SET_DATA_PAI_02$*$*IF NOT first_call IS INITIAL.CLEAR first_call.*注釋: MODX_FUNCTION_ACTIVE_CHECK 用來檢查 017 出口是否被激活 ,如果激活則執(zhí)行之 .CALL FUNCTION 'MODX_FUNCTION_ACTIVE_CHECK' EXPORTINGcprogname = 'SAPMM06E' funcnum
38、ber = '017'IMPORTINGactive = activeEXCEPTIONSnot_found = 1OTHERS = 2.IF NOT sy-subrc IS INITIAL.CLEAR active.ENDIF.ENDIF.CHECK NOT active IS INITIAL.IF fc_vorga EQ cva_en.l_enj_call = 'X'.ELSE.l_enj_call = space.ENDIF.*-Define Data:DATA: lt_usr_tekpo LIKE bekpo OCCURS 0, lt_usr_teket
39、 LIKE beket OCCURS 0, lt_usr_tekkn LIKE ekknu OCCURS 0, lt_usr_tkomv LIKE tkomv OCCURS 0.*-Copy Tables: lt_usr_tekpo = pot. lt_usr_teket = ett. lt_usr_tekkn = knt.lt_usr_tkomv = tkomv.l_ucomm = ok-code.*注釋:調(diào)用出口的一般步驟是先定義數(shù)據(jù) (Define Data), 多為內(nèi)表或工作區(qū) ,再將參數(shù)賦予這些內(nèi)表 (Copy Tables), 相當(dāng)于建立了原始參數(shù)的一個(gè)鏡象 .*-User Exi
40、t:*如果 017 出口增強(qiáng)被激活則執(zhí)行它 .CALL FUNCTION 'EXIT_SAPMM06E_017'EXPORTINGi_ekpo= ekpoi_ekpo_old =*ekpoi_ekko= ekkoi_aktyp= aktypi_bstyp= ekko-bstypi_no_screen= im_no_screen"770427i_lfa1= lfa1i_lfm1= lfm1i_rekpo= rekpoi_kekpo= kekpoi_aekpo= aekpoi_reban= rebani_mt06e= mt06ei_eina= *einai_eine= *
41、einei_komp= kompi_ucomm= l_ucommi_enj_call = l_enj_callTABLEStekpo= lt_usr_tekpoteket= lt_usr_tekettekkn= lt_usr_tekkntkomv= lt_usr_tkomvEXCEPTIONSOTHERS= 0.ENDFORM. "CUSTSCR1_ITEM_SET_DATA_PAI 上面的程序代碼非常簡(jiǎn)單,相信聰明的讀者看了對(duì) ERP 增強(qiáng)的設(shè)計(jì)思路會(huì)開始有一定了解?,F(xiàn)在你可以通俗理解,增強(qiáng)就是 ERP 設(shè)計(jì)者在合適的地點(diǎn)設(shè)置了一些合適的游戲規(guī)則并提供了一些有意義的游戲給用 戶自己
42、玩耍!獨(dú)樂樂,與人樂樂,孰樂?好玩的東西應(yīng)該留點(diǎn)給用戶自己樂呵樂呵。接下來開始編寫增強(qiáng)程序 ,可以使用 Tcode:SMOD 直接激活增強(qiáng)或 CMOD 建立一個(gè)項(xiàng)目包含一個(gè)或多個(gè)增強(qiáng) ,如圖 2,輸 入增強(qiáng) MM06E005 并激活它 ,然后在 EXIT_SAPMM06E_017 出口函數(shù)中編寫代碼。在圖2中,我們發(fā)現(xiàn)增強(qiáng) MM06E005包括用戶出口和屏幕增強(qiáng)(Screen Exit),屏幕增強(qiáng)允許用戶在采購訂單自定義用 戶界面,從而使采購訂單包含更多企業(yè)客戶化的信息,這種屏幕增強(qiáng)在固定資產(chǎn)模塊中更始發(fā)揮到極致。EXIT_SAPMM06E_017 包含程序 ZXM06U42 ,程序 ZXM0
43、6U42 示例代碼如下表,這段客戶化代碼邏輯十分簡(jiǎn)單,為 了方便說明,本人注釋出該出口函數(shù)的輸入?yún)?shù),該出口沒有輸出參數(shù),也就是說,你只能根據(jù)輸入?yún)?shù)進(jìn)行判斷而 不能更改任何數(shù)據(jù):* 增強(qiáng) ZXM06U42 的示例代碼*By Stone.Fu 2007/01/02*"判斷程序代碼如下:DATA ZWATEKPO like BEKPO.TABLES EKBE .* 輸入的內(nèi)表參數(shù) TEKPO 記錄該采購單所有的原始舊數(shù)據(jù) .* 輸入的 I_EKPO 參數(shù)表示當(dāng)前處理的 PO 行項(xiàng)目,其包含的是采購行項(xiàng)目的最新更新數(shù)據(jù). READ TABLE TEKPO INTO ZWA TEKPO W
44、ITH KEY EBELP = I_EKPO-EBELP . 只對(duì) ME21N/22/23 才生效 .check SY-TCODE = 'ME22N ' or SY-TCODE = 'ME22N' orSY-TCODE = 'ME23N' .*EKBE 是PO history表,如有Q,R表示有發(fā)票校驗(yàn)歷史,不允許更改價(jià)#SELECT SINGLE_ * FROM EKBEWHERE EBELN = I_EKPO-EBELNAND EBELP = I_EKPO-EBELPAND ( BEWTP = 'Q' OR BEWTP = &
45、#39;R' ) .*如果 SY-SUBRC =0 表示發(fā)票已經(jīng)校驗(yàn),不允許更改價(jià)格。"Lokale Schnittstelle:*IMPORTING/TABLES 是輸入的單個(gè)參數(shù)和輸入的內(nèi)表參數(shù)*" IMPORTING*"VALUE(I_EKPO) LIKE EKPO STRUCTURE EKPO*"VALUE(I_AKTYP)*"VALUE(I_BSTYP) LIKE EKKO-BSTYP*"VALUE(I_NO_SCREEN)*"VALUE(I_LFA1) LIKE LFA1 STRUCTURE LFA1*&
46、quot;VALUE(I_LFM1) LIKE LFM1 STRUCTURE LFM1*"VALUE(I_EKKO) LIKE EKKO STRUCTURE EKKO*"VALUE(I_REKPO) LIKE EKPO STRUCTURE EKPO OPTIONAL*"VALUE(I_KEKPO) LIKE EKPO STRUCTURE EKPO OPTIONAL*"VALUE(I_AEKPO) LIKE EKPO STRUCTURE EKPO OPTIONAL*"VALUE(I_REBAN) LIKE EBAN STRUCTURE EBAN
47、OPTIONAL*" VALUE(I_MT06E) LIKE MT06E STRUCTURE MT06E OPTIONAL*"VALUE(I_EINA) LIKE EINA STRUCTURE EINA OPTIONAL*"VALUE(I_EINE) LIKE EINE STRUCTURE EINE OPTIONAL*"VALUE(I_EKPO_OLD) LIKE EKPO STRUCTURE EKPO OPTIONAL*"VALUE(I_KOMP) LIKE KOMP STRUCTURE KOMP OPTIONAL*"VALUE(I
48、_UCOMM) LIKE SY-UCOMM OPTIONAL*"VALUE(I_ENJ_CALL) OPTIONAL*" TABLES*"TEKPO STRUCTURE BEKPO OPTIONAL*"TEKET STRUCTURE BEKET OPTIONAL*"TEKKN STRUCTURE EKKNU OPTIONAL*"TKOMV STRUCTURE KOMV OPTIONALCHECK SY-SUBRC = 0 .*判斷數(shù)據(jù)更改后新采購行項(xiàng)目的單價(jià)是否和從數(shù)據(jù)庫讀出的原始行項(xiàng)目單價(jià)一致IF I_EKPO-NETPR <
49、> ZW ATEKPO-NETPR .MESSAGE E001(00) with ' 采購訂單行項(xiàng)目已經(jīng)進(jìn)行發(fā)票校驗(yàn),不再允許修改價(jià)格ENDIF. 如果你熟悉增強(qiáng),你會(huì)發(fā)現(xiàn)一些用戶出口都會(huì)傳入舊數(shù)據(jù)和更新后的新數(shù)據(jù)以方便兩者比較,和財(cái)務(wù)模塊的替代 (Substitution )不同, ERP 系統(tǒng)一般對(duì)增強(qiáng)保留嚴(yán)謹(jǐn)態(tài)度,通常只允許在出口中做檢查工作,這一點(diǎn)類似財(cái)務(wù)模塊的 檢查( Validation )。(五) 再次淺析增強(qiáng)企業(yè)實(shí)施 ERP 的目的之一就是實(shí)現(xiàn)各部門信息共享 ,避免數(shù)據(jù)孤島 ,以一個(gè)簡(jiǎn)單的采購收貨為實(shí)例 ,倉庫人員只要在收貨 時(shí)輸入采購訂號(hào) ,收貨日期 ,物料收貨
50、數(shù)量和倉位 ,系統(tǒng)將自動(dòng)產(chǎn)生各模塊數(shù)據(jù) ,對(duì)財(cái)務(wù)數(shù)據(jù) ,系統(tǒng)根據(jù)輸入的采購訂單號(hào)找 到采購訂單主數(shù)據(jù)中的工廠 ,通過在組織結(jié)構(gòu)中設(shè)置的工廠和公司代碼的對(duì)應(yīng)關(guān)系找到相應(yīng)公司代碼;通過收貨物料的Valuation class 和收貨的移動(dòng)類型找到對(duì)應(yīng)科目 ,通過收貨數(shù)量 *采購單價(jià)得到本次該料庫存金額 ,通過物料主數(shù)據(jù)獲得業(yè) 務(wù)范圍和利潤中心 ,這樣財(cái)務(wù)憑證數(shù)據(jù)自動(dòng)收集完畢; 如果物料采用標(biāo)準(zhǔn)價(jià)格出現(xiàn)采購差異并將差異科目的模認(rèn)成本對(duì)象對(duì)應(yīng)到獲利分析段 ,則將數(shù)據(jù)寫入利潤分析模塊等等 ; 我要說的是 ,在這些復(fù)雜的邏輯背后 ,任何一個(gè)模塊收集過程中存 在校驗(yàn) ,任何校驗(yàn)失敗 ERP 系統(tǒng)都將停止業(yè)務(wù)
51、交易 ,比如說校驗(yàn)收貨日期不在物料期間或會(huì)計(jì)期間允許范圍,校驗(yàn)失敗向用戶提示錯(cuò)誤 ,比如預(yù)算模塊找不到對(duì)應(yīng)基金中心提示錯(cuò)誤中止交易等,當(dāng)所有的校驗(yàn)完畢 ,系統(tǒng)將數(shù)據(jù) Commit 到數(shù)據(jù)庫 ,這些校驗(yàn)是系統(tǒng)標(biāo)準(zhǔn)的 ,而增強(qiáng)則是系統(tǒng)預(yù)留給用戶的 ,和系統(tǒng)的校驗(yàn)一樣, 在任何模塊的增強(qiáng)中只要是出現(xiàn)錯(cuò)誤都將停 止本次業(yè)務(wù)交易。在圖 3中出現(xiàn)的檢查 /替代/增強(qiáng)/字段移動(dòng) /推導(dǎo)等關(guān)鍵詞,實(shí)際上這些東東都可看成系統(tǒng)增強(qiáng),即使 用客戶化代碼增強(qiáng)標(biāo)準(zhǔn)功能。有趣的是, SAP 的各種增強(qiáng)的代碼編寫都是極其簡(jiǎn)單的,象檢查/替代/字段移動(dòng) /推導(dǎo) /派生用戶甚至只要簡(jiǎn)單將對(duì)應(yīng)的源字段和目標(biāo)字段拖拖拽拽關(guān)聯(lián)關(guān)聯(lián)就
52、行, 代碼是自動(dòng)生成的, 即使涉及 Coding 也是非常簡(jiǎn)單的。 神奇的是, 作為 SAP 顧問你甚至可以對(duì)編程和數(shù)據(jù)庫毫不了解,實(shí)際上很都 SAP 顧問的確如此,你只要專注于業(yè)務(wù)藍(lán)圖實(shí)現(xiàn)就行,這一點(diǎn) 值得國內(nèi)管理軟件設(shè)計(jì)同行學(xué)習(xí),在管理軟件設(shè)計(jì)過程中,同樣是細(xì)節(jié)決定成敗。新一代增強(qiáng) BADI (Tcode:SE17|SE18)BADI(Business Add-In) 是一種新的功能增強(qiáng)概念,它使用類、接口及方法等面向?qū)ο蟮母拍?采用一種使用面向?qū)ο蟮姆椒▉磉M(jìn)行 SAP 增強(qiáng)。如何查找事務(wù)代碼所在程序的用戶出口(user-exit):1。執(zhí)行 tcode -> system ->
53、; status , 找出程序名稱。2。 SE80;輸入第一步中找到的程序名稱。用菜單:GOTO -> Attributes ,找出Package名稱。(注:也可以用SE93,查 這個(gè)程式所在的 Package)3。SE80 -> Repository Information System -> Enhancements -> Customer Exits -> Enhancements -> 將第二步中找到的 Package 名稱輸入,執(zhí)行, 就可以找到 tcode 的所有用戶出口。*TABLES : tstc, "SAP Transaction
54、 Codes(SAP 事務(wù)代碼 )tadir, "Directory of Repository Objects( 資源庫對(duì)象的目錄 )modsapt, "SAP Enhancements - Short Texts(SAP 增強(qiáng) -短文件 )modact, "Modifications( 修正 )trdir, "System table TRDIR( 系統(tǒng)表 TRDIR)tfdir, "Function Module( 功能模塊 )enlfdir, "Additional Attributes for Function Module
55、s( 功能模塊的附加屬性 ) tstct. "Transaction Code Texts( 事務(wù)代碼文本 )DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE.DATA : field1(30).DATA : v_devclass LIKE tadir-devclass.SELECTION-SCREEN BEGIN OF BLOCK a01 WITH FRAME TITLE text-001. SELECTION-SCREEN SKIP.PARAMETERS : p_tcode LIKE tstc-tcode OBLIGATORY .S
56、ELECTION-SCREEN SKIP.SELECTION-SCREEN END OF BLOCK a01.START-OF-SELECTION.SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode. IF sy-subrc EQ 0.SELECT SINGLE * FROM tadirWHERE pgmid = 'R3TR'AND object = 'PROG' AND obj_name = tstc-pgmna.MOVE : tadir-devclass TO v_devclass.IF sy-subrc NE
57、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 = enlfdir-area.MOVE : tadir-devclass TO v_devclass.ENDIF.ENDIF.SELECT * FROM tadirINTO 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_tcod
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年太陽能電池生產(chǎn)專用設(shè)備項(xiàng)目建議書
- 2025年汽車車速傳感器項(xiàng)目合作計(jì)劃書
- 2025年應(yīng)急救生系統(tǒng)項(xiàng)目建議書
- 貴州省黔東南苗族侗族自治州2024-2025學(xué)年高一上學(xué)期1月期末考試 語文 含解析
- 2025年新型分子篩系列產(chǎn)品項(xiàng)目建議書
- 客戶服務(wù)層次化響應(yīng)體系構(gòu)建
- 娛樂行業(yè)演出安全協(xié)議書
- Rebaudioside-E-Standard-生命科學(xué)試劑-MCE
- 伊索寓言小動(dòng)物的故事解讀
- 監(jiān)控采購安裝合同
- 硫酸分公司30萬噸硫磺制酸試車方案
- 高壓氧科工作總結(jié)高壓氧科個(gè)人年終總結(jié).doc
- 電子電路基礎(chǔ)習(xí)題解答
- 《政治學(xué)概論》教學(xué)大綱
- 食品生物化學(xué)習(xí)題謝達(dá)平(動(dòng)態(tài))
- 保安員工入職登記表
- 斷路器控制回路超詳細(xì)講解
- 簽證戶口本完整翻譯模板
- 睿達(dá)RDCAM激光雕刻切割軟件V5.0操作說明書
- 變電設(shè)備運(yùn)行與維護(hù)培訓(xùn)課件(共102頁).ppt
- 機(jī)械設(shè)計(jì)基礎(chǔ)平面連桿機(jī)構(gòu)課件
評(píng)論
0/150
提交評(píng)論