第一代:基于源碼增強(子過程subroutine)
第一代增強基于源代碼,是SAP提供的一個空代碼的子過程。在這個子過程中使用者可以添加自己的代碼,控制自己的需求。這類增強集中在一些檔案名倒數第二個字元為Z的包含程式中。 一般是以UserExit_打頭的子過程,是以形象地稱其為使用者出口。
使用者出口Include在SAP标準程式的源代碼裡,可以說是源代碼的一部分,更改使用者出口就相當于更改SAP标準程式,是需要在SAP Service MarketPlace裡申請對象鍵(Access Key)才能更改,不需要建立工程;由于是在标準程式中,是以标準程式的全局資料都可以使用,但同時系統更新時會被新版本覆寫。
使用者出口的說明可以從背景配置SPRO的相關子產品的路徑找到,大部分SD的出口都是此類增強。
查找此類出口的方法:
1、在程式中查找檔案名倒數第二個字元為Z的Include包含程式。
2、在背景查找對應的子產品增強:在程式中搜尋USEREXIT_打頭的子過程;在SAP中以PERFORM的形式被調用。
3、單擊”Display Object List”按鈕,在子程式清單查找“UserExit_”打頭的子過程。

第二代:基于函數子產品增強(Function)
第二代增強基于函數子產品,用事務:SAP增強管理(SMOD)和增強編輯器(CMOD)維護。在SAP釋出的版本中,使用Call Customer-Function 'xxx'調用函數子產品,是以可以通過在程式中搜尋 Customer-Function來查找第二代增強,第二代增強函數名構成為Exit_程式名_'xxx(3 digital number)'。它們在釋出時隻有一句代碼include "ZXxxxxxx",修改時無需像第一代增強一樣申請對象鍵,直接按兩次Enter鍵就可以了。但同時這種增強以及後面幾代的增強都不能像第一代一樣随便使用程式的全局資料,隻能使用接口中傳遞進來的參數。由于帶有關鍵字Customer,故被稱為Customer Exits(客戶出口)。
第二代增強主要有4類:
E.Ehancement exits:這些出口以Exit_打頭,可以在SE37中檢視,也可以在資料字典TFDIR(函數表)中查詢Exit_打頭的函數
C.GUI codes(GUI增強):用于區域菜單和工具菜單欄的增強
S.Subscreens(螢幕增強):用于子螢幕設計增強
T.include structure增強:用于表結構的增強
另外,按用途分類:
功能子產品出口(Function Module Exits):在SAP标準事務中添加業務邏輯,一般用于驗證标準事務中的字段
螢幕出口(Screen Exits):定義自己的子螢幕嵌入應用螢幕,在标準事務中添加子螢幕
菜單出口(Menu Exits):定義自己的菜單項或激活屏蔽标準事務中的菜單項
表出口(Table Exits):與上述T型出口一樣,屬同一類型
資料元素出口(Data Element Exits):在ABAP/4字典的關鍵字資料元素中添加文檔。結果是在使用這些資料元素的字段處按F1鍵後會出現自定義的說明文檔
關鍵字出口(Keyword Exits):在ABAP/4字典中的關鍵字資料元素更改表示文本
字段出口(Field Exits):根據ABAP/4字典中域驗證某些标準事務的某些螢幕字段。
Ehancement 比較重要的表
MODSAP:SAP擴充表,重要字段增強名(Name)、元件類型(TYPE:ECST)、元件子產品名(Member)裡面記錄了所有Enhancement的增強
TFDIR:功能子產品表,重要字段FuncName(函數名)、功能子產品激活狀态MAND(如果是C,代表此函數子產品激活)
TSDIR:動态程式區CALL CUSTOMER SUBSCREEN(螢幕增強)
CUATEXTS:修改GUI界面,菜單文本被客戶改變(GUI菜單文本增強)
MODSAPA:SAP擴充的屬性
MODATTR:SAP增強項目屬性
TADIR:資源庫對象的目錄
TFTIT:函數功能的短文本
查找Ehancement 的方法:
1、查找關鍵字: 在程式中搜尋Customer-Function,找到後面的3位數字字尾,然後出口函數組成就是Exit_程式名_3位數字字尾
2、代碼查找
3、利用系統函數尋找增強
常與出口相關的函數有:
DYNP_VALUES_READ
MODX_ALL_ACTIVE_MENUENTRIES 菜單增強
MODX_FUNCTION_ACTIVE_CHECK 函數增強
MODX_MENUENTRY_ACTIVE_CHECK 菜單增強
MODX_SUBSCREEN_ACTIVE_CHECK 螢幕增強
可以在函數最後設定斷點,然後通過運作對應的增強程式就會調用這樣的函數,這樣就可以在調試模式下找到對應的增強。
第三代:基于類的增強(BADI)
BADI(Business Add-in)是一個新的SAP增強技術,是基于ABAP的面向對象技術。源代碼的釋出是通過接口的方法調用來實作使用的。此類增強實際上是實作一個或多個接口的實作類,是以對同一個增強會出現不同的源代碼,這些不同的源代碼是通過過濾器(Adapter)來差別用于不同的業務場景的。這種增強使用事務碼 SE18 定義、SE19 實作。 SAP預定義了一些接口(Interface),客戶可以自行定義實作Interface的類(Class),在标準程式中會調用客戶自定義類的執行個體,擷取執行個體的過程使用了工廠模式。
業務交易事件(BTE,Business Transaction Events)是SAP的一種增強方式,技術上講是介于第二代增強(Customer Exits)和BAdIs之間的産物。這類增強為會計子產品獨有的增強,用于财務會計子產品(Open FI)、總賬會計(FI-GL)、應收賬款和應付賬款(FI-AR/FI-AP)及銷售和分銷(SD)的元件。有兩種類型,類似于會計憑證和替代:
1、Publish and Subscribe Interface:隻提供SAP資料源,可以供外部程式使用或達到資料檢查的目的。
用于告訴外部軟體在SAP标準應用中觸發了某些事件,并且把産生的資料提供給他們。外部軟體不能給R/3系統傳回任何資料,可以用在以下地方:主資料被建立、修改或鎖定; 憑證被輸入、預制、修改或沖銷;項目被清除或重置也可以在附加的開發中基于此事件和資料産生附加的處理:啟動工作流; 産生或修改附加資料;請求通信
2、Process Interface:可以達到資料修改的目的,用來增強标準的業務流程。
用于控制與标準R/3系統處理方法不同的業務流程,也就是用Process Interface替換标準處理。它們幹預标準流程,并傳回資料給SAP應用。
BTE查找方法,兩種方法:
1、運作事務碼(例如XK02),選擇Sytem-Status,輕按兩下Program(screen),選中In main Program,查找OPEN_FI_PERFORM字元串
2、IMG-财務會計全局設定(新)-工具-客戶增強-業務事務事件(FIBF),選擇環境。
BADI查找方法:
BAdI對象的資訊存儲在SXS_INTER, SXC_EXIT, SXC_CLASS 和 SXC_ATTR這4張表中(參見SECE包)。SAP BAdI程式都會調用cl_exithandler=>get_instance來判斷對象是否存在,并傳回執行個體。這個方法實際就是對上述4張表及視圖V_EXT_IMP 和 V_EXT_ACT進行查詢和搜尋。基于以上機理有以下方法:
(1)使用SE24進入Class Builder,查找CL_EXITHANDLER,進入get_instance方法,在get_class_name_by_interface調用處設定斷點。Debug需要增強的事務,在斷點處檢視exit_name即可找到對應的BAdI。
(2)使用性能分析器(事務碼ST05)跟蹤。
1、運作事務碼ST05,選擇“table buffer trace”,而不是常用的“SQL trace”
2、activate trace(開始跟蹤)
3、運作事務碼:me21n
4、建立一個采購訂單,儲存
5、deactivate trace(結束跟蹤)
6、點選display trace,在出來的選擇條件中: objects中輸入:V_EXT_IMP和V_EXT_ACT;operations中輸入“OPEN”
7、查詢,通過查詢的結果可以看出,視圖V_EXT_IMP的BADI的接口類名字都是以IF_EX_開頭的,其中IF_EX_之後的就是對應BADI接口的定義。
(3)SE18查找接口,SE19實作接口就可以實作使用者增強。
第四代:Enhancement Framework
在不改變(或盡量少改變)SAP标準程式的情況下滿足客戶的定制開發需求。Keep less Modification.
Enhancement Framework的基本概念:
Ehancement Spot: 用來組織Enhancement options,it's a container of Enhancement options.
Enhancement Implementation:用來組織Enhancement options的實作代碼。
隐式增強
隐式增強就是系統内置的Enhancement options,是系統本身就預留的,如在:執行程式,包含程式,函數組,對話子產品的結尾;Form例程,函數子產品,方法等的開始和結尾;結構的結尾這些地方都會有。Implicit enhancements comprise class enhancements, function group enhancements and predefined enhancement points at particular predefined positions such as the end of a report, a function module, an include or a structure and the beginning and the end of a method.
顯示增強
顯式增強就是手工加入到程式中的Enhancement options,有兩種顯式增強:
ENHANCEMENT-POINT: 隻有一個預留點, 沒有代碼,用來在程式中直接插入新的功能代碼,其概念與BADI的USER_EXIT類似,标準程式預留了部分已定義好的增強點可以讓ABAP做插入代碼來實作這個增強(也可以自定義增強點,但不能自定義增強選項,增強選項一定是系統預留下來的,如果沒有增強選項則該處不可做增強),但是不能做螢幕和菜單增強。
其最大的優勢在于友善,可以使用程式中已定義的變量,不像BTE和Customer EXIT中隻能使用函數接口傳過來的參數。
一般增強步驟:
1、DEBUG标準程式找到需要增強的位置,點EDIT->SHOW IMPLICIT ENHANCEMENT OPTIONS檢視是否有預留增強選項(标準程式不能自己建立enhancement option ,隻能使用系統預留的)。
2、建立增強點實作
為自己程式建立顯示增強選項Explicit Enhancement options
單擊[建立選項]菜單進入建立增強選項界面,輸入增強點名及增強容器名(以Z開頭),确認回車。
注:Enhancement Spot 就是SE18中的Enhancement Spot。
随後Editor上會多出一條語句,然後單擊按鈕切換增強模式。
光标定位到增強語句上,單擊[建立實作]菜單項建立增強點實作。
注:Enhancement Spot相當于一個容器,建立一個增強點的必要條件是要有一個容器。每個增強點都可以建立到這個容器當中,也可以再建立一個容器。删除這個容器的方法:在本地對象或它的包中删除或在SE18中删除,激活程式,退出後再打開程式。
ENHANCEMENT-SECTION: 用來替換原有的功能代碼,ENHANCEMENT-SECTION 和 END-ENHANCEMENT-SECTION之間有代碼, implementation 之後, 替換舊代碼,隻執行新代碼,原來的代碼不再執行。
兩者的差別是:enhancement-point沒有代碼,隻有一個預留點,允許在這個位置插入新代碼(implementation),類似于AOP。而enhancement-section和end-enhancement-section之間有代碼,implementation之後,替換舊代碼,隻執行新代碼,原來的代碼不再執行,類似于OO中的方法重寫/覆寫。
注:SAP提供了一個标準程式SNIF,通過這個程式可以直接查找出系統已經實施的BAdi、BTE、客戶出口、字段出口甚至是調用的BAPI。具體操作方法:打開【系統】|【狀态】菜單,輕按兩下進入程式,點選【對象清單】按鈕,然後通過點選【上級對象清單】按鈕,找到程式所在的包。SE38運作程式SNIF,輸入包名,如果勾上【也選擇SAP實施業務附加元件】就會把SAP标準的增強實作也顯示出。運作後,可以點選各Tab頁檢視已經實作的自定義增強。