透視SAP增強

來源:互聯網
上載者:User
轉自:http://hi.baidu.com/%B7%EF%CE%E8%C3%F4%D0%C4/blog/item/aa4d73f2c04ae158342acc40.html 小技巧 透視ERP 增強 (一)什麼是增強(Enhancement)?簡單地說,增強就是ERP系統中標準程式的出口,在該出口中由使用者根據企業實際需求編寫客戶化邏輯代碼。增強是ERP系統設計時考慮到企業實際的流程有可能和系統預設標準流程不同,在標準流程架構下專門留的介面,每個介面對應一個客戶化函數,這些出口函數有標準處理常式傳入的參數和輸出參數,使用者可根據系統輸入參數做條件編寫適合本企業流程的邏輯,然後通過輸出參數傳輸回。 (二)使用者增強分類SAP的使用者增強通常包括下面3類。 1. E :Enhancement exits,即通常所謂的使用者出口(User_exit )使用者出口也叫功能出口(Function Exit)。使用Tcode:SE37搜尋EXIT*,找到的函數大都是做系統預留的出口函數,前面說過,使用者出口是標準程式留給使用者的介面,標準程式通常不允許使用者任意修改,如果修改需要申請Access Key,而且修改標準程式可能導致的錯誤erp公司通常是不負責的。在SAP中,自訂的程式通常以保留字Y或Z開頭,因此,出口函數中都預包含了一個Z開頭的程式。 2.C :GUI介面(GUI codes) 3.S :螢幕增強(Screen Exit)比如,在建立採購訂單,工單和固定資產主要資料時,系統都預留螢幕增強,也就是說允許使用者自訂使用者輸入介面並編寫相應的輸入輸出處理常式。在各類增強中,可能還使用者自己定義結構或表格,系統對應類型 T 。比如增強MM06E005允許使用者建立兩個結構CI_EKKODB和CI_EKPODB。接下來將重點介紹功能出口的應用。 (三)組織使用者增強 相關增強表格: MODSAP:增強表格 TFDIR:包括出口函數在內的所有函數表(E類) CUATEXTS:修改 GVI 介面,介面: 菜單文本被客戶(C類)
TSDIR:動態程式區 CALL CUSTOMER SUBSCREEN(S類) * 對於以EXIT 開頭的出口函數,TFDIR-MAND 值為C 表示此出口函數被啟用。 相關增強檢查函數:MODX_FUNCTION_ACTIVE_CHECK:檢查E類使用者出口是否被啟用。MODX_MENUENTRY_ACTIVE_CHECK:檢查C類增強啟用狀況MODX_SUBSCREEN_ACTIVE_CHECK: 檢查S類增強啟用狀況你可能會發現,SAP的各模組的任何一個事務碼(Tcode)對應的標準程式都留下了大量的使用者出口,正是SAP靈活的配置功能和強大的使用者出口才使其產品輕鬆應對各種複雜需求成為可能,系統還為能快速找到和啟用這些增強進行了有效組織,各類增強被記錄在table中並且提供了相關檢查函數,從而更方便企業使用者。熟悉ABAP開發的朋友通常都收集了一個可以輸入事務碼快速找到系統留下的所有出口的程式,下表就是一個檢測系統增強被啟用的簡單參考程式。

* 該程式可以檢測出系統所有被啟用的使用者增強.* 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 .data : field1(30)._select a~funcname a~mand b~nameinto table itab_exitfrom tfdir as a     inner join modsap as b     on a~funcname = b~memberwhere a~mand = 'C'and a~funcname = b~member .format color col_heading intensified on.write:/1 sy-vline,2 'Enhancement Name',21 sy-vline ,22 'Activated 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' 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’,表示該使用者出口被啟用,處理邏輯將從標準程式轉入出口函數,在該語句設定斷點然後運行任一個事務碼,都會調用該函數判斷是否存在使用者出口。 ( 四)增強應用執行個體 業務背景:如果採購訂單已經做了發票校正後,則不再允許使用者修改價格。 相關程式:MM06EFPO_POT_FUELLEN| MM06EF0C_CUSTSCR1_ITEM_SET_DAT 相關Tcode:SMOD|CMOD如果沒有啟動採購審批功能,SAP標準功能是允許使用者隨時修改採購價格的,不同的企業有對採購價格控制有不同的策略,甲企業規模較小為了省事可能為以後數月的採購開了一個大採購單,如果中途材料價格變動則直接修改價格就行,乙集團則嚴格控制採購價格,採購價格由總部集中維護,各企業採購員只需要維護採購數量等資訊等,真因如此,ERP系統顯然不會去禁止使用者修改價格,如果企業確實需要如此,則可通過增強實現。前面已經介紹過如何通過在函數MODX_FUNCTION_ACTIVE_CHECK設定斷點跟蹤系統每個事務預留的使用者出口,你很快將發現增強 MM06E005EXIT_SAPMM06E_017 使用者出口非常適合此業務背景。首先來看看增強 EXIT_SAPMM06E_017 使用者出口( 以下稱017 出口)處理流程,Include程式MM06EFPO_POT_FUELLEN被專門用來處理增強出口,調用了子程式CUSTSCR1_ITEM_SET_DATA_PAI( 對應下一級Include 程式MM06EF0C_CUSTSCR1_ITEM_SET_DAT),分析Include程式MM06EF0C_CUSTSCR1_ITEM_SET_DAT的代碼,如下表,這個程式是從系統原本Copy出來的,注意本人所加的附註 粗體部分:

*-----------------------------------------------------------------------* User-Exit für Positionsfelder versorgen (PAI)FORM custscr1_item_set_data_pai USING im_no_screen LIKE fc_call.                                                            "770427DATA: l_ucomm LIKE sy-ucomm,        l_enj_call TYPE c.STATICS: first_call(1) TYPE c VALUE 'X',           active        LIKE sy-calld.ENHANCEMENT-POINT CUSTSCR1_ITEM_SET_DATA_PAI_02 SPOTS ES_MM06EF0C_CUSTSCR1_I_SET_DAT INCLUDE BOUND .*$*$-Start: CUSTSCR1_ITEM_SET_DATA_PAI_02-------------------------------------------------------$*$*ENHANCEMENT 1 OI0_COMMON_MM06EF0C_ITEM_S_DAT.    "active version* C5030897 I.Twardowski Implementation of BADI for OGSDPERFORM 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出口是否被啟用,如果啟用則執行之.    CALL FUNCTION 'MODX_FUNCTION_ACTIVE_CHECK'      EXPORTING        cprogname = 'SAPMM06E'        funcnumber = '017'      IMPORTING        active     = active      EXCEPTIONS        not_found = 1        OTHERS     = 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 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),多為內表或工作區,再將參數賦予這些內表(Copy Tables),相當於*建立了原始參數的一個鏡象.*-User Exit:*如果017出口增強被啟用則執行它.CALL FUNCTION 'EXIT_SAPMM06E_017'    EXPORTING      i_ekpo      = ekpo      i_ekpo_old = *ekpo      i_ekko      = ekko      i_aktyp     = aktyp      i_bstyp     = ekko-bstyp      i_no_screen = im_no_screen                            "770427      i_lfa1      = lfa1      i_lfm1      = lfm1      i_rekpo     = rekpo      i_kekpo     = kekpo      i_aekpo     = aekpo      i_reban     = reban      i_mt06e     = mt06e      i_eina      = *eina      i_eine      = *eine      i_komp      = komp      i_ucomm     = l_ucomm      i_enj_call = l_enj_call    TABLES      tekpo       = lt_usr_tekpo      teket       = lt_usr_teket      tekkn       = lt_usr_tekkn      tkomv       = lt_usr_tkomv    EXCEPTIONS      OTHERS      = 0.ENDFORM.                    "CUSTSCR1_ITEM_SET_DATA_PAI
上面的程式碼非常簡單,相信聰明的讀者看了對ERP增強設計思路會開始有一定瞭解。現在你可以通俗理解, 增強就是 ERP 設計者在合適的地點設定了一些合適的遊戲規則並提供了一些有意義的遊戲給使用者自己玩耍!獨樂樂,與人樂樂,孰樂?好玩的東西應該留點給使用者自己樂呵樂呵。接下來開始編寫增強程式,可以使用Tcode:SMOD直接啟用增強或CMOD建立一個項目包含一個或多個增強,如 2,輸入增強 MM06E005並啟用它,然後在 EXIT_SAPMM06E_017出口函數中編寫代碼。在 2中,我們發現增強 MM06E005包括使用者出口和螢幕增強(Screen Exit),螢幕增強允許使用者在採購訂單自訂使用者介面,從而使採購訂單包含更多企業客戶化的資訊,這種螢幕增強在固定資產模組中更始發揮到極致。 EXIT_SAPMM06E_017包含程式 ZXM06U42,程式 ZXM06U42範例程式碼如下表,這段客戶化代碼邏輯十分簡單,為了方便說明,本人注釋出該出口函數的輸入參數,該出口沒有輸出參數,也就是說,你只能根據輸入參數進行判斷而不能更改任何資料:

*增強 ZXM06U42的範例程式碼*By Stone.Fu   2007/01/02*"*"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*"     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 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_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 OPTIONAL*"----------------------------------------------------------------------*判斷程式碼如下:DATA ZWATEKPO like BEKPO.     TABLES EKBE .* 輸入的內表參數TEKPO記錄該採購單所有的原始舊資料 .* 輸入的I_EKPO 參數表示當前處理的PO行項目,其包含的是採購行項目的最新更新資料 .READ TABLE TEKPO INTO ZWATEKPO   WITH KEY EBELP = I_EKPO-EBELP .***只對ME21N/22/23才生效.check SY-TCODE = 'ME22N ' or   SY-TCODE = 'ME22N' or   SY-TCODE = 'ME23N' .***EKBE是PO history 表,如有Q,R表示有發票校正曆史,不允許更改價##SELECT SINGLE_ * FROM EKBE   WHERE EBELN = I_EKPO-EBELN         AND EBELP = I_EKPO-EBELP         AND ( BEWTP = 'Q' OR BEWTP = 'R' ) .*如果SY-SUBRC =0表示發票已經校正,不允許更改價格。CHECK SY-SUBRC = 0 .*判斷資料更改後新採購行項目的單價是否和從資料庫讀出的原始行項目單價一致IF I_EKPO-NETPR <> ZWATEKPO-NETPR .   MESSAGE E001(00) with '採購訂單行項目已經進行發票校正,不再允許修改價格ENDIF.
如果你熟悉增強,你會發現一些使用者出口都會傳入舊資料和更新後的新資料以方便兩者比較,和財務模組的替代( Substitution)不同,ERP系統一般對增強保留嚴謹態度,通常只允許在出口中做 檢查工作,這一點類似財務模組的檢查( Validation)。 ( 五)再次淺析增強企業實施ERP的目的之一就是實現各部門資訊共用,避免資料孤島,以一個簡單的採購收貨為執行個體,倉庫人員只要在收貨時輸入採購訂號,收貨日期,物料收貨數量和倉位,系統將自動產生各模組資料,對財務資料,系統根據輸入的採購訂單號找到採購訂單主要資料中的工廠,通過在組織圖中設定的工廠和公司代碼的對應關係找到相應公司代碼;通過收貨物料的Valuation class和收貨的移動類型找到對應科目,通過收貨數量*採購單價得到本次該料庫存金額,通過物料主要資料獲得業務範圍和利潤中心,這樣財務憑證資料自動收集完畢;如果物料採用標準價格出現採購差異並將差異科目的模認成本對象對應到獲利分析段,則將資料寫入利潤分析模組等等;我要說的是,在這些複雜的邏輯背後,任何一個模組收集過程中存在校正,任何校正失敗ERP系統都將停止業務交易,比如說校正收貨日期不在物料期間或會計週期允許範圍,校正失敗向使用者提示錯誤,比如預算模組找不到對應基金中心提示錯誤中止交易等,當所有的校正完畢,系統將資料Commit到資料庫,這些校正是系統標準的,而增強則是系統預留給使用者的,和系統的校正一樣,在任何模組的增強中只要是出現錯誤都將停止本次業務交易。在 3中出現的檢查/替代/增強/欄位移動/推導等關鍵詞,實際上這些東東都可看成系統增強,即使用客戶化代碼增強標準功能。有趣的是,SAP的各種增強代碼編寫都是極其簡單的,象檢查/替代/欄位移動/推導/派生使用者甚至只要簡單將對應的源欄位和目標欄位拖拖拽拽關聯關聯就行,代碼是自動產生的,即使涉及Coding也是非常簡單的。神奇的是,作為SAP顧問你甚至可以對編程和資料庫毫不瞭解,實際上很都SAP顧問的確如此,你只要專註於業務藍圖實現就行,這一點值得國內管理軟體設計同行學習,在管理軟體設計過程中,同樣是細節決定成敗。 新一代增強BADI (Tcode:SE17|SE18)BADI(Business Add-In)是一種新的功能增強概念,它使用類、介面及方法等物件導向的概念,採用一種使用物件導向的方法來進行SAP 增強

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.