版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、ABAP開發(fā)中的增強日期:2008-10-12開始整理版權聲明:大部分資料來源于網絡,部分文字、格式及排版出自本人,部分截圖由本人親自完成,如 有侵權,請告知本人,歡迎來信討論 SAP或ERP相關的話題。免責聲明:本資料僅供研究、學習、學術討論之用,不得用于生產環(huán)境。對于使用本文檔產生的損失, 本人不承擔任何責任! 一般說明使用SAP的增強建議系統(tǒng)學習一下SAP標準教材 BC425和BC427。ABAP開發(fā)中的增強至少經歷了 4代,下面詳細說明。第一代:基于源代碼的增強源代碼增強以子程序形式發(fā)布,在SAP的發(fā)行版本中,使用PERFORM調用這些子程序,它們在發(fā)布時都是空的,sap提供一個空代碼
2、的子過程,在這個子過程中用戶可以添加自己的代碼,控制自己的需求。這類增強需要修改sap的標準代碼。示例:USEREXIT . in SAPMV45A。主要集中在一些文件名倒數第二個字符為Z的包含程序中。用戶增強時,應首先到service marketplace申請對象鍵,然后才能修改這些子程序,這些子程序可以使用程序中所有的全局數據。對于第一代增強,可以用以下方法查找增強:打開欲增強的程序,點擊工具欄上的"Display Object List ”按鈕,選擇Subroutines,查找以"UserExit”開頭的子程序,根據子程序前面的注釋文檔來查找用戶出口,如下圖,事務碼
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 團禺畫1西tnigF面這些以US
4、EEXIT_開頭的都是空的子程序,可以添加自己的代碼。Mod. Pool二lElllg區(qū)固HI西U囤囹SAPMV45AMod. Pool| ProgramObject Name矽|會器| 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屏幕增強以客戶屏幕形式發(fā)布,它們包含在標準程序中,沒有什么特別規(guī)律。這種源代碼增強和屏幕增強的說明可以從事務碼spro后臺配置中相關模塊的路徑里
9、面找到。同時使用的針對數據表的增強是appe nd structure,可以在事務碼 sell中打開透明表,點擊應用工具欄最右邊的那個appe nd structure按鈕就能為數據表追加新的字段。這種更改標準程序的方法現在很少使用,因為系統(tǒng)升級有可能不能工作。如果在代碼中改變了全局變量,還可能會破 壞系統(tǒng)原有的邏輯。第二代:基于函數模塊的增強源代碼增強以函數模塊形式發(fā)布,在SAP的發(fā)行版本中,使用CALL CUSTOMER-FUNCTION調用這些函數模塊,它們在發(fā)布時只有一句代碼INCLUDE xxxxxxx。用戶增強時,無需申請對象鍵,直接雙擊這個包含,然后回車,就可以創(chuàng)建相關的包含文件
10、,編寫相應的代碼了。這些函數模塊中只能使用接口中傳遞的參數,不能使用調用程序的全局 變量。Sap中出口就是標準程序最后首先來講解一下什么是出口,顧名思義,就是一段程序執(zhí)行到最后必經的一段程序。在 要調用的一個函數或者功能模塊,這個函數或功能模塊的輸入已經由Sap定義好。為什么會有出口呢?因為正常的業(yè)務系統(tǒng)不能滿足實際需求,這時可以在出口中增加一些功能,來達到要求,這也就 是為什么它還叫增強。SAP系統(tǒng)升級的時候會被覆蓋。自己寫的SAP出口程序在系統(tǒng)升級的時候會被保留,而如果更改標準程序在F面介紹一下什么時候需要使用出口以及出口的種類:1、在業(yè)務檢查時,比如在某個工廠發(fā)貨,可以設定在某個庫位的出
11、貨只能使用某種移動類型。2、在需要界面增強時,比如用戶對某個字段要求大寫,但是最終用戶不按規(guī)范操作,這也可以在出口中自動轉換,有 些模塊甚至能自定義數據庫字段, 并且可以在出口中增加字段輸入。 還有的模塊能對輸入數據檢查, 甚至實現自動 替代等功能。3、有不規(guī)則業(yè)務時,比如按某種條件定價,可以設定從自己定義的表中按某種條件取值。4、搜索幫助的出口,可以對 Sap 標準的搜索幫助做權限控制,等等。SAP 有四種基本用戶出口的類型:1、菜單出口 -Menu Exits ,定義自己的菜單;2、屏幕出口 -Screen Exits ,定義自己的屏幕;3、功能模塊出口 -Function Module
12、Exits,在SAP應用程序中添加功能;4、關鍵字出口 -Keyword Exits,在ABAP/4字典中的關鍵字數據元素添加文檔。結果是你在使用這些數據元素的字段 處按 F1 后會出現你自定義的說明文檔。因為出口都是被 Sap預先定義好的,那么怎么尋找自己需要的出口呢?1可以通過配置文檔的幫助和SAP library尋找業(yè)務系統(tǒng)的出口,sap library在implementation guide '中尋找出口,在配置功能執(zhí)行按鈕左邊一般都有一個說明文檔,描述相關的出口。2:為了方便我們把所有的出口名稱及其描述列在文章的后面。下面具體介紹怎樣寫出口程序:為了對出口程序的修改進行管理
13、,sap提供了專門用來管理出口程序的事務,事務代碼是CMOD。這些出口函數有標準處理程序傳入的參數和輸出參數,用戶可根據系統(tǒng)輸入參數作為條件編寫適合本企業(yè)流程的邏輯,然后通過輸出參數傳回給 SAP 。屏幕增強也包含在函數模塊所屬的函數組中。針對數據表的增強是 CI_ 結構,這些結構以 .INCLUDE 結構的形式包含在 SAP 發(fā)布的數據表中,用戶可以通過向 這些結構中添加字段而對數據表進行增強。上述這類增強通過事務碼 SMOD 進行維護, CMOD 進行實現。 SMOD 中的一個增強可以包含上述的源代碼、 屏幕和 表結構增強,按照較容易理解的邏輯結構來管理這些增強,使用相對更加便利。對于第二
14、代增強,可以用以下方法查找增強用戶增強通常包括下面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
15、(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 tfdi
16、r set MAND = 'C'.where FUNcname = 'EXIT_SAPMM06E_013'.* 當然也可 SE16:M0DSAP 表 enhancement輸入 EXIT_SAPMM06E_013 然后得到 enhancement name MM06E005 后使 用 SMOD 測試激活 exit 函數 .增強相關函數和表格Function:1 .DYNP_V ALUES_READ2 . M0DX_ALL_ACTIVE_MENUENTRIES(菜單增強 )3 .M0DX_FUNCTI0N_ACTIVE_CHECK(出口函數增強 )由于讀者可能接觸
17、 user exit 最多 ,除了附錄光盤有個查找ZFINDEXIT 的程序外 (有些 exit 使用它并不能找到 ),另一個直接有效的方法就是使用這個函數 ,SE37 設好斷點后執(zhí)行 tcode 如其有 exit 就會調用此函數 .4 .M0DX_MENUENTRY_ACTIVE_CHECK(菜單增強 )5 .M0DX_SUBSCREEN_ACTIVE_CHECK(屏幕增強 )Table:1 . TFDIR->function module table2 . M0DSAP->sap enhancement table3 . TSDIR->Dynpro Areas CALL
18、CUST0MER SUBSCREEN(屏幕增強 )4 . CUA TEXTS-> GUI Interface: Menu Texts Changed(GUI 菜單文本增強 )* 注意 ,為了確保一個出口被真正應用,必須同時激活相關程序(SE38) 和出口函數 (SM0D|CM0D, 反正就是要保證tfdir-mandt= ' C',用程序也可.)the third generation enhancement will be discussed in the next post.1 、關于增強的簡單介紹1.1 SM0D 包含具體的增強,而 CM0D 是包含一組 SM0D
19、編寫的增強 .1.2 User exits (Function module exits) 是 sap 提供出口,它的命名規(guī)則如下:EXIT_<program name><3 digit suffix>示例:sd 的 VA01 事務,對應的程序是 SAPMV45A ,你會在程序里查到(用 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 建立一個 SAP 增強2.1、選擇一個增強,如:SDVFX001 ,點擊修改,進入 sap增強維護屏幕;2.2、點擊 "組件 "按鈕,進入組件維護屏;2.3、將光標移到 " 功能模塊名 " ,輸入模塊名,如: EXIT_SAPLV60B_001 ;2.4、選擇 "代碼修改 "按鈕進入函數模塊;2.5、雙擊函數模塊的包含
21、單元,進入包含單元加入自定義代碼并激活保存;3、使用 CMOD 建立增強項目3.1、輸入自定義的項目名,點擊 "創(chuàng)建 ";3.2、進入增強項目,選擇 "配置增強 " ,進入增強配置屏幕;3.3、輸入增強名如: SDVFX0013.4、保存,并退出;4、使用 CMOD 將增強項目激活,便大工告成。如何查找* 判斷是否存在相應增強的定義 (SMOD) select single name from modsapa into mod0-name where name = 'PPCO0002'.if sy-subrc = 0.endif.sele
22、ct single 獲取增強組件的參見函數 MOD_SAP_MEMBER_TEXT from tadir into ps_tadir_dbwhere pgmid= 'R3TR'and object = 'SMOD' and obj_name = 'PPCO0002'.* 判斷是否存在相應增強項目的定義 (CMOD)SELECT SINGLE name FROM MODA TTR into mod0-name WHERE NAME= 'PPCO0002'.* 提取增強的定義的組件 (可以用此反查增強定義 )select * from
23、 modsapwhere 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_
24、name. check mode ne 'CHAM'.endif.MODTYP 類型 :E : 功能退出S : 屏幕T : 表C : GUI 代碼sap 增強存在 MODSAP 表內*獲得退出功能模塊的信息 select single * from tftitwhere "SPRAS" = '1' AND "FUNCNAME" = 'EXIT_SAPLCORE_001' if sy-subrc = 0.endif.*值得學習的函數 MOD_KUN_ACTIVA TE( 會操作相關報表 )小技巧 透視 ERP
25、 增強(一) 什么是增強 (Enhancement)?簡單地說,增強就是 ERP 系統(tǒng)中標準程序的出口,在該出口中由用戶根據企業(yè)實際需求編寫客戶化邏輯代碼。增強是 ERP 系統(tǒng)設計時考慮到企業(yè)實際的流程有可能和系統(tǒng)默認標準流程不同,在標準流程框架下專門留的接口,每個接口 對應一個客戶化函數 ,這些出口函數有標準處理程序傳入的參數和輸出參數,用戶可根據系統(tǒng)輸入參數做條件編寫適合 本企業(yè)流程的邏輯,然后通過輸出參數傳輸回。(二) 用戶增強分類SAP 的用戶增強通常包括下面 3 類。1. E類:Enhancement exits,即通常所謂的用戶出口( User_exit )用戶出口也叫功能出口 (
26、Function Exit) 。使用Tcode:SE37搜索EXIT*,找到的函數大都是做系統(tǒng)預留的出口函數,前面說過,用戶出口是標準程序留給用戶的接口標準程序通常不允許用戶任意修改,如果修改需要申請 Access Key,而且修改標準程序可能導致的錯誤erp公司通常是不負責的。在SAP中,自定義的程序通常以保留字Y或Z開頭,因此,出口函數中都預包含了一個Z開頭的程序。2. C 類: GUI 接口 (GUI codes)3.S 類:屏幕增強(Screen Exit) 比如,在建立采購訂單,工單和固定資產主數據時,系統(tǒng)都預留屏幕增強,也就是說允許用戶自定義用戶輸入界面并 編寫相應的輸入輸出處理程
27、序。在各類增強中,可能還用戶自己定義結構或表格,系統(tǒng)對應類型T類。比如增強 MM06E005允許用戶建立兩個結構 CI_EKKODB 和 CI_EKPODB 。接下來將重點介紹功能出口的應用。(三) 組織用戶增強相關增強表格:MODSAP: 增強表格TFDIR :包括出口函數在內的所有函數表(E類)CUATEXTS: 修改 GVI 界面,界面 : 菜單文本被客戶 (C 類)TSDIR:動態(tài)程序區(qū) CALL CUSTOMER SUBSCREEN(S 類)*對于以EXIT開頭的出口函數,TFDIR-MAND 值為C表示此出口函數被激活。 相關增強檢查函數:MODX_FUNCTION_ACTIVE_
28、CHECK:檢查 E 類用戶出口是否被激活。MODX_MENUENTRY_ACTIVE_CHECK:檢查 C 類增強激活狀況MODX_SUBSCREEN_ACTIVE_CHECK:檢查 S 類增強激活狀況你可能會發(fā)現,SAP的各模塊的任何一個事務碼(Tcode)對應的標準程序都留下了大量的用戶出口,正是SAP靈活的配置功能和強大的用戶出口才使其產品輕松應對各種復雜需求成為可能,系統(tǒng)還為能快速找到和激活這些增強進行了有效組織,各類增強被記錄在 table 中并且提供了相關檢查函數,從而更方便企業(yè)用戶。,下表就是一個檢測系統(tǒng)熟悉 ABAP 開發(fā)的朋友通常都收集了一個可以輸入事務碼快速找到系統(tǒng)留下的
29、所有出口的程序 增強被激活的簡單參考程序。* 該程序可以檢測出系統(tǒ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.有一種直接有效的查找用戶出口增強的方法,就是使用函數 MODX_FUNCTION_ACTIVE_CHECK ,如圖 1。圖1中的判斷語句If tfdir-mand = aktiv_flag(常數C)則出口函數active標志='X',表示該用戶出口被激活,處理邏輯將 從標準程序轉入出口函數,在該語句設置斷點然后運行任一個事務碼,都會調用該函數判斷是否存在用戶出口。(四)增強應用實例業(yè)務背景 :如果采購訂單已經做了發(fā)票校驗
33、后,則不再允許用戶修改價格。相關程序: MM06EFPO_POT_FUELLEN| MM06EF0C_CUSTSCR1_ITEM_SET_DAT相關 Tcode:SMOD|CMOD如果沒有啟動采購審批功能, SAP 標準功能是允許用戶隨時修改采購價格的,不同的企業(yè)有對采購價格控制有不同的 策略,甲企業(yè)規(guī)模較小為了省事可能為以后數月的采購開了一個大采購單,如果中途材料價格變動則直接修改價格就 行,乙集團則嚴格控制采購價格,采購價格由總部集中維護,各企業(yè)采購員只需要維護采購數量等信息等,真因如此,ERP 系統(tǒng)顯然不會去禁止用戶修改價格,如果企業(yè)確實需要如此,則可通過增強實現。 前面已經介紹過如何通
34、過在函數 MODX_FUNCTION_ACTIVE_CHECK 設置斷點跟蹤系統(tǒng)每個事務預留的用戶出口, 你很快將發(fā)現增強 MM06E005 的 EXIT_SAPMM06E_017 用戶出口非常適合此業(yè)務背景。首先 來看 看增 強 的 EXIT_SAPMM06E_017 用 戶出 口 (以下 稱 017 出口 )處理 流程 ,Include 程序 MM06EFPO_POT_FUELLEN 被專門用來處理增強出口 ,調用了子程序 CUSTSCR1_ITEM_SET_DATA_PAI( 對 應 下 一 級 Include 程 序 MM06EF0C_CUSTSCR1_ITEM_SET_DAT), 分
35、 析 Include 程 序 MM06EF0C_CUSTSCR1_ITEM_SET_DAT 的代碼 ,如下表 ,這個程序是從系統(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.*注釋:調用出口的一般步驟是先定義數據 (Define Data), 多為內表或工作區(qū) ,再將參數賦予這些內表 (Copy Tables), 相當于建立了原始參數的一個鏡象 .*-User Exi
40、t:*如果 017 出口增強被激活則執(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 上面的程序代碼非常簡單,相信聰明的讀者看了對 ERP 增強的設計思路會開始有一定了解?,F在你可以通俗理解,增強就是 ERP 設計者在合適的地點設置了一些合適的游戲規(guī)則并提供了一些有意義的游戲給用 戶自己
42、玩耍!獨樂樂,與人樂樂,孰樂?好玩的東西應該留點給用戶自己樂呵樂呵。接下來開始編寫增強程序 ,可以使用 Tcode:SMOD 直接激活增強或 CMOD 建立一個項目包含一個或多個增強 ,如圖 2,輸 入增強 MM06E005 并激活它 ,然后在 EXIT_SAPMM06E_017 出口函數中編寫代碼。在圖2中,我們發(fā)現增強 MM06E005包括用戶出口和屏幕增強(Screen Exit),屏幕增強允許用戶在采購訂單自定義用 戶界面,從而使采購訂單包含更多企業(yè)客戶化的信息,這種屏幕增強在固定資產模塊中更始發(fā)揮到極致。EXIT_SAPMM06E_017 包含程序 ZXM06U42 ,程序 ZXM0
43、6U42 示例代碼如下表,這段客戶化代碼邏輯十分簡單,為 了方便說明,本人注釋出該出口函數的輸入參數,該出口沒有輸出參數,也就是說,你只能根據輸入參數進行判斷而 不能更改任何數據:* 增強 ZXM06U42 的示例代碼*By Stone.Fu 2007/01/02*"判斷程序代碼如下:DATA ZWATEKPO like BEKPO.TABLES EKBE .* 輸入的內表參數 TEKPO 記錄該采購單所有的原始舊數據 .* 輸入的 I_EKPO 參數表示當前處理的 PO 行項目,其包含的是采購行項目的最新更新數據. READ TABLE TEKPO INTO ZWA TEKPO W
44、ITH KEY EBELP = I_EKPO-EBELP . 只對 ME21N/22/23 才生效 .check SY-TCODE = 'ME22N ' or SY-TCODE = 'ME22N' orSY-TCODE = 'ME23N' .*EKBE 是PO history表,如有Q,R表示有發(fā)票校驗歷史,不允許更改價#SELECT SINGLE_ * FROM EKBEWHERE EBELN = I_EKPO-EBELNAND EBELP = I_EKPO-EBELPAND ( BEWTP = 'Q' OR BEWTP = &
45、#39;R' ) .*如果 SY-SUBRC =0 表示發(fā)票已經校驗,不允許更改價格。"Lokale Schnittstelle:*IMPORTING/TABLES 是輸入的單個參數和輸入的內表參數*" 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 .*判斷數據更改后新采購行項目的單價是否和從數據庫讀出的原始行項目單價一致IF I_EKPO-NETPR <
49、> ZW ATEKPO-NETPR .MESSAGE E001(00) with ' 采購訂單行項目已經進行發(fā)票校驗,不再允許修改價格ENDIF. 如果你熟悉增強,你會發(fā)現一些用戶出口都會傳入舊數據和更新后的新數據以方便兩者比較,和財務模塊的替代 (Substitution )不同, ERP 系統(tǒng)一般對增強保留嚴謹態(tài)度,通常只允許在出口中做檢查工作,這一點類似財務模塊的 檢查( Validation )。(五) 再次淺析增強企業(yè)實施 ERP 的目的之一就是實現各部門信息共享 ,避免數據孤島 ,以一個簡單的采購收貨為實例 ,倉庫人員只要在收貨 時輸入采購訂號 ,收貨日期 ,物料收貨
50、數量和倉位 ,系統(tǒng)將自動產生各模塊數據 ,對財務數據 ,系統(tǒng)根據輸入的采購訂單號找 到采購訂單主數據中的工廠 ,通過在組織結構中設置的工廠和公司代碼的對應關系找到相應公司代碼;通過收貨物料的Valuation class 和收貨的移動類型找到對應科目 ,通過收貨數量 *采購單價得到本次該料庫存金額 ,通過物料主數據獲得業(yè) 務范圍和利潤中心 ,這樣財務憑證數據自動收集完畢; 如果物料采用標準價格出現采購差異并將差異科目的模認成本對象對應到獲利分析段 ,則將數據寫入利潤分析模塊等等 ; 我要說的是 ,在這些復雜的邏輯背后 ,任何一個模塊收集過程中存 在校驗 ,任何校驗失敗 ERP 系統(tǒng)都將停止業(yè)務
51、交易 ,比如說校驗收貨日期不在物料期間或會計期間允許范圍,校驗失敗向用戶提示錯誤 ,比如預算模塊找不到對應基金中心提示錯誤中止交易等,當所有的校驗完畢 ,系統(tǒng)將數據 Commit 到數據庫 ,這些校驗是系統(tǒng)標準的 ,而增強則是系統(tǒng)預留給用戶的 ,和系統(tǒng)的校驗一樣, 在任何模塊的增強中只要是出現錯誤都將停 止本次業(yè)務交易。在圖 3中出現的檢查 /替代/增強/字段移動 /推導等關鍵詞,實際上這些東東都可看成系統(tǒng)增強,即使 用客戶化代碼增強標準功能。有趣的是, SAP 的各種增強的代碼編寫都是極其簡單的,象檢查/替代/字段移動 /推導 /派生用戶甚至只要簡單將對應的源字段和目標字段拖拖拽拽關聯(lián)關聯(lián)就
52、行, 代碼是自動生成的, 即使涉及 Coding 也是非常簡單的。 神奇的是, 作為 SAP 顧問你甚至可以對編程和數據庫毫不了解,實際上很都 SAP 顧問的確如此,你只要專注于業(yè)務藍圖實現就行,這一點 值得國內管理軟件設計同行學習,在管理軟件設計過程中,同樣是細節(jié)決定成敗。新一代增強 BADI (Tcode:SE17|SE18)BADI(Business Add-In) 是一種新的功能增強概念,它使用類、接口及方法等面向對象的概念,采用一種使用面向對象的方法來進行 SAP 增強。如何查找事務代碼所在程序的用戶出口(user-exit):1。執(zhí)行 tcode -> system ->
53、; status , 找出程序名稱。2。 SE80;輸入第一步中找到的程序名稱。用菜單:GOTO -> Attributes ,找出Package名稱。(注:也可以用SE93,查 這個程式所在的 Package)3。SE80 -> Repository Information System -> Enhancements -> Customer Exits -> Enhancements -> 將第二步中找到的 Package 名稱輸入,執(zhí)行, 就可以找到 tcode 的所有用戶出口。*TABLES : tstc, "SAP Transaction
54、 Codes(SAP 事務代碼 )tadir, "Directory of Repository Objects( 資源庫對象的目錄 )modsapt, "SAP Enhancements - Short Texts(SAP 增強 -短文件 )modact, "Modifications( 修正 )trdir, "System table TRDIR( 系統(tǒng)表 TRDIR)tfdir, "Function Module( 功能模塊 )enlfdir, "Additional Attributes for Function Module
55、s( 功能模塊的附加屬性 ) tstct. "Transaction Code Texts( 事務代碼文本 )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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 道路工程機械加盟合同
- 服裝行業(yè)合伙協(xié)議范本
- 政府專項貸款合同模板
- 共同經營電子產品商店協(xié)議書范本
- 賬戶監(jiān)管協(xié)議書范例
- 標準范本:2024年購銷合同協(xié)議書
- 2024年商品買賣合同范例
- 現代室內裝潢設計合同范本
- 個人住房裝修合同2024年
- 陜西省漢中市普通高中十校聯(lián)盟2024年秋季學期高一年級期中考試語文試題
- 道路運輸安全事故報告、統(tǒng)計與調查處理制度
- 道亨送電線路三維設計平臺使用培訓ppt模板
- 民族式摔跤競賽規(guī)則
- 不合理處方登記表
- 國內外利用活性炭處理硫化氫的原理
- 07版監(jiān)理收費標準插入法計算器
- 重慶市七年級數學上學期期中試題新人教版
- 08S305-小型潛水泵選用及安裝圖集
- 吉林省長春市東北師大附中2019-2020上學期——九年級數學大練習題試卷
- 新能源汽車充電樁運營平臺建設商業(yè)計劃書
- 圖形創(chuàng)意-表現手法(課堂PPT)課件
評論
0/150
提交評論