增強(qiáng)(enhancement)的概念其實很廣,SAP標(biāo)準(zhǔn)系統(tǒng)之上的所有二次開發(fā),我們都可以理解為增強(qiáng),做增強(qiáng)的目的就是標(biāo)準(zhǔn)的sap正常的業(yè)務(wù)系統(tǒng)不能滿足實際需求,所以我們在標(biāo)準(zhǔn)的系統(tǒng)基礎(chǔ)進(jìn)行增加不同的功能來達(dá)到不同企業(yè)的要求,換句話說我們今天開發(fā)過程中所有的ADD-ON都可以說是增強(qiáng)開發(fā)。 但作為開發(fā)人員所說的增強(qiáng)主要是標(biāo)準(zhǔn)系統(tǒng)事先預(yù)留好的接口,根據(jù)不同業(yè)務(wù)需求,進(jìn)行開發(fā),我們稱為增強(qiáng),又叫出口。 比如:1:在業(yè)務(wù)檢查時,比如在某個工廠發(fā)貨,可以設(shè)定在某個庫位的出貨只能使用某種移動類型。2:在需要界面增強(qiáng)時,比如用戶對某個字段要求大寫,但是最終用戶不按規(guī)范操作,這也可以在出口中自動轉(zhuǎn)換,有些模塊甚至能自定義數(shù)據(jù)庫字段,并且可以在出口中增加字段輸入。還有的模塊能對輸入數(shù)據(jù)檢查,甚至實現(xiàn)自動替代等功能。3:有不規(guī)則業(yè)務(wù)時,比如按某種條件定價,可以設(shè)定從自己定義的表中按某種條件取值 4:搜索幫助的出口,可以對Sap標(biāo)準(zhǔn)的搜索幫助做權(quán)限控制。等等。 Sap的用戶出口發(fā)展至今有四代: 一、 第一代(基于源代碼的增強(qiáng))是sap提供一個空代碼的子過程,在這個子過程中用戶可以添加自己的代碼,控制自己的需求。這類增強(qiáng)都需要修改sap的標(biāo)準(zhǔn)代碼,它們在發(fā)布的時候都是空的,集中在一些文件名倒數(shù)第二個字符為Z的包含程序中,由于在標(biāo)準(zhǔn)程序中,所以所有程序的全局?jǐn)?shù)據(jù)都可以使用,但同時系統(tǒng)升級時會被新版本覆蓋;這種源代碼增強(qiáng)和屏幕增強(qiáng)的說明可以從事務(wù)碼 spro 后臺配置中相關(guān)模塊的路徑里面找到;一般是以UserExit_打頭的子模塊。 找到所要增強(qiáng)的的程序,查找UserExit關(guān)鍵字。 這類增強(qiáng)事先要到 service marketplace 申請對象鍵(ACCESS KEY),然后才能修改這些子程序。 查找此類出口的方法: 1、 在增強(qiáng)程序中找第二個字符為Z的包含程序; 2、 在后臺找對應(yīng)模塊增強(qiáng); 3、 在程序中搜索USEREXIT_打頭的關(guān)鍵字子程序; 4、 字節(jié)列出對象列表“Display Object List”按鈕,在Subroutines列表下找“userexit”打頭的子程序; 二、 第二代增強(qiáng)(基于函數(shù)模塊的增強(qiáng)),用SMOD和CMOD維護(hù);在SAP發(fā)布的版本中,使用Call customer-function ‘xxx’調(diào)用函數(shù)模塊的,所以你可以通過在程序中收cusomer-function來查找第二代增強(qiáng),第二代增強(qiáng)函數(shù)名構(gòu)成:Exit_程序名_’xxx(3 digital number)’,這樣你就可以找到對應(yīng)的增強(qiáng)函數(shù)模塊了,它們在發(fā)布的時候只有一句代碼include ‘xxxxxxx’,修改時無需像第一代增強(qiáng)一樣需要ACCESS key,直接雙擊回車就可以了,但同時這種增強(qiáng)以及后面幾代的增強(qiáng)都不能像第一代一樣隨便使用程序的全局?jǐn)?shù)據(jù),只能使用接口中傳遞進(jìn)來的參數(shù)。 第二代增強(qiáng)中主要有3類:1)E . Ehancement exits: 這些出口 Exit_打頭,你可以到SE37中查看,也可以在數(shù)據(jù)字典中TFDIR(函數(shù)表)中查詢Exit_打頭的函數(shù)。2)C .GUI codes, (GUI增強(qiáng)) 3)S . Subscreens(屏幕增強(qiáng))。4)T. include structure增強(qiáng) Enhancement比較重要的表MODSAP,這個表里重要的字段增強(qiáng)名(Name),組件類型(TYP: E C S T),組件功能模塊名(Member):里面記錄了所有enhancement的增強(qiáng).TFDIR所有的函數(shù)表,重要字段FUNCName(函數(shù)名),MAND(功能模塊激活狀態(tài) 如果是C代表此函數(shù)模塊激活)。 查找Enhancement的方法: 1、 在程序中搜索Customer-function找到后面的3為digit suffix,然后出口函數(shù)組成就是Exit_程序名_3 digit suffix. 2、 代碼找增強(qiáng) 利用如下代碼找enhancement(有些exit使用它并不能找到) REPORT ZLC_FIND_EXIT no standard page heading. 3、 利用系統(tǒng)函數(shù)尋找增強(qiáng) Function: [1].DYNP_VALUES_READ [2]. MODX_ALL_ACTIVE_MENUENTRIES(菜單增強(qiáng)) [3].MODX_FUNCTION_ACTIVE_CHECK(出口函數(shù)增強(qiáng)) [4].MODX_MENUENTRY_ACTIVE_CHECK(菜單增強(qiáng)) [5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增強(qiáng)) 我們可以在函數(shù)最后設(shè)置斷點,然后通過跑對應(yīng)的增強(qiáng)程序就會去調(diào)用這樣的函數(shù),這樣你就可以在調(diào)試模式下找到對應(yīng)的增強(qiáng)。
下面附加出幾個重要的表: Table: [1]. TFDIR->function module table [2]. MODSAP->sap enhancement table [3]. TSDIR->Dynpro Areas CALL CUSTOMER SUBSCREEN(屏幕增強(qiáng)) [4]. CUATEXTS-> GUI Interface: Menu Texts Changed(GUI 菜單文本增強(qiáng)) [5].MODSAPA àsap 增強(qiáng)的屬性 [6] MODATTRàsap增強(qiáng)項目屬性 [7] TADIR à資源庫對象的目錄 [8] TFTITà函數(shù)功能的短文本 注意:出口真正應(yīng)用是要在激活的狀態(tài)下,也就是在TFIDR下的MAND字段為C.激活的時候要同時激活程序(se38)和出口函數(shù)(smod, cmod,出口程序都可) 當(dāng)然一般情況,我們知道出口模塊到modsap中找到對應(yīng)的增強(qiáng)。可以通過下面的程序?qū)⑵浼せ睢?/span> REPORT Zactexitfun . update tfdir set MAND = 'C'. where FUNcname = 'EXIT_SAPMM06E_013'.
*判斷是否存在相應(yīng)增強(qiáng)的定義(SMOD) select single name from modsapa into mod0-name where name = 'PPCO0002'. if sy-subrc = 0. endif. select single * from tadir into ps_tadir_db where pgmid = 'R3TR' and object = 'SMOD' and obj_name = 'PPCO0002'.
*判斷是否存在相應(yīng)增強(qiáng)項目的定義(CMOD) SELECT SINGLE name FROM MODATTR into mod0-name WHERE NAME = 'PPCO0002'.
*提取增強(qiáng)的定義的組件 (可以用此反查增強(qiáng)定義) 當(dāng)然我們可以用下面的函數(shù)來找增強(qiáng)的組件。MOD_SAP_MEMBER_TEXT
*獲得出口功能模塊的信息
*判斷該增強(qiáng)是否移植到BADI實現(xiàn) select single migrated into migrated from modsapa where name = modname. if sy-subrc = 0 and migrated = ‘x’. 說明此增強(qiáng)已經(jīng)移植到BADI實現(xiàn)了 endif.
三、 第三代增強(qiáng)(基于面向?qū)ο蟾拍畹脑鰪?qiáng)BADI(business add-in)),源代碼發(fā)布以接口的方式,通過接口的方法調(diào)用來實現(xiàn)使用的。用戶增強(qiáng)實際上是實現(xiàn)一個或多個基于這個接口的實現(xiàn)類,因為接口類實際上是一個抽象類,所以對同一個增強(qiáng)會出現(xiàn)不同的源代碼,這些不同的源代碼是通過過濾器(adapter)來區(qū)別用于不同的業(yè)務(wù)場景的。這種增強(qiáng)是用SE18 SE19來實現(xiàn)的。 BADI的查找方法: 1、 BADI對象的信息存儲在SXS_INTER,SXC_EXIT,SXC_CLASS和SXC_ATTR這四個表中。 2、 SAP BADI程序都會調(diào)用cl_exithandler=>get_instance來判斷對象是否存在,并返回實例,這個方法實際就是對上面4個表和視圖V_EXT_IMP和V_EXT_ACT進(jìn)行查詢和搜索的。我們可以在這個方法處設(shè)置斷點,獲取實例。 3、 它的調(diào)用方式是call method(instance), 可以通過exit_handler關(guān)鍵詞來查找。 4、 ST05選擇“table buffer trace”而不是常用的"SQL trace",然后查找上面的幾個表和視圖找到對應(yīng)的BADI. 5、 se18 查找接口,se19 實現(xiàn)接口就可以實現(xiàn)用戶增強(qiáng)
四、 第四代其實是第三代的加強(qiáng)switch Framework 當(dāng)sap進(jìn)入newweaver 7.0以后推出的新增強(qiáng)體系,將BADI進(jìn)行了改進(jìn),叫新BADI了。還新增 Enhancement Spot 和 Enhancement Section 以及隱式增強(qiáng)點的概念,基本可以在面向?qū)ο蟮某绦蚶飳崿F(xiàn)處處皆可增強(qiáng)的最高境界。
|
|