SAP幾種增強方式
一,USER EXIT (基於源碼的增強)
二,CUSTOMER EXIT(基於函數模塊的增強)
三,BADI(基於類的增強)
四,Enhancement Framework(隱式增強)
五,BTE
六,校驗和替代(FI模塊)
一、USER EXIT
第一代增強基於源代碼,是SAP提供的一個空代碼的子過程。在這個子過程中用戶可以添加自己的代碼,控制自己的需求。一般是以UserExit_打頭的子過程,所以一般也稱用戶出口。
用戶出口Include在SAP標准程序的源碼里,更改用戶出口就相當於更改SAP標准程序,S4以前版本要在SAP Service MarketPlace里申請對象鍵(Access Key)才能更改,S4版本可以點擊編輯使用修改助手直接更改。
示例:例如在子程序MV45AFZZ 的
FORM USEREXIT_SAVE_DOCUMENT_PREPARE.
中增強:
方便之處是標准程序的全局變量都可以使用,但是不能支持系統升級,如果升級需要手工遷移代碼,就是要重新創建增強。
用戶出口的說明可以從后台配置SPRO的相關模塊的路徑找到,大部分SD的出口都是此類增強。
查找此類出口的方法:
1、在程序中查找文件名倒數第二個字符為Z的Include包含程序。
2、在后台查找對應的模塊增強:在程序中搜索USEREXIT_打頭的子過程;在SAP中以PERFORM的形式被調用。
3、單擊”Display Object List”按鈕,在子程序列表查找“UserExit_”打頭的子過程。
二、CUSTOMER EXIT
用事務:SAP增強管理(SMOD)和增強編輯器(CMOD)維護。
在SAP發布的版本中,使用Call Customer-Function 'xxx'調用函數模塊,所以可以通過在程序中搜索 Customer-Function來查找第二代增強....
詳細可參考 :增強篇6 CMOD增強
三、BADI
BADI(Business Add-in)是一種面向對象的增強技術。
源代碼的發布是通過接口的方法調用來實現使用的。此類增強實際上是實現一個或多個接口的實現類,因此對同一個增強會出現不同的源代碼,這些不同的源代碼是通過過濾器(Adapter)來區別用於不同的業務場景的。
這種增強使用事務碼 SE18 定義、SE19 實現。 SE18用於創建及維護BADI對象;SE19用於維護BADI的實例。
SAP預定義了一些接口(Interface),客戶可以自行定義實現Interface的類(Class),在標准程序中會調用客戶自定義類的實例。
BADI的查找方法:
1、主程序都會調用cl_exitHandler=>get_instance(這只是經典BADI是這樣來調用的,如果是新式的BADI,則調用為GET BADI handle-BADI定義名、CALL BADI handle->method)來判斷對象是否存在,並返回實例。我們可以在se24中對類cl_exitHandler=>get_instance方法進行調試,運行一個tcode,看一下exit_name的值,這就是要找的BADI
2、在主程序中搜索cl_exitHandler,查看它所引用(TYPE REF TO)的接口名,根據接口命名規則 IF_EX_<badi>,得到<badi>命稱
3、通過程序查找
BADI 的主要信息存在這4張表:
SXS_INTER text:Exit: Definition side: Interfaces
SXC_EXIT Exit: Implementation side: Assignment: Exit - Implementation
SXC_CLASS Exit, implementation side: Class assignment (multiple)
SXC_ATTR Exit: Implementation side: Attributes
BADI實施 可參考:增強篇1 PO保存增強
還有個有意思的問題:Classic BAdi and New BAdi
四、Enhancement Framework
Enhancement Framework的基本概念:
-
Ehancement Spot: 用來組織隱式增強選項,它是隱式增強選項的容器。
-
Enhancement Implementation:用來組織隱式增強選項的實現代碼。
隱式增強就是系統內置的Enhancement options,是系統本身就預留的,如在:執行程序,包含程序,函數組,對話模塊的結尾;Form例程,函數模塊,方法等的開始和結尾;結構的結尾這些地方都會有。
對應隱式增強,還有個顯示增強 顯式增強就是手工加入到程序中的Enhancement options,有兩種顯式增強:
ENHANCEMENT-POINT: 只有一個預留點, 沒有代碼,用來在程序中直接插入新的功能代碼,其概念與BADI的USER_EXIT類似,標准程序預留了部分已定義好的增強點可以讓ABAP做插入代碼來實現這個增強(也可以自定義增強點,但不能自定義增強選項,增強選項一定是系統預留下來的,如果沒有增強選項則該處不可做增強),但是不能做屏幕和菜單增強。
示例:
其最大的優勢在於方便,可以使用程序中已定義的變量,不像BTE和Customer EXIT中只能使用函數接口傳過來的參數。
一般增強步驟:
1、DEBUG標准程序找到需要增強的位置,點EDIT->SHOW IMPLICIT ENHANCEMENT OPTIONS查看是否有預留增強選項(標准程序不能自己創建enhancement option ,只能使用系統預留的)。
2、創建增強點實現
五、BTE
業務交易事件(BTE,Business Transaction Events),
技術上講是介於第二代增強(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),選擇環境。
BTE實現:后續會單獨寫一遍文章介紹。增強篇9 BTE
六、校驗和替代
替代就是在會計憑證生產時(包括手工和自動過帳)允許用戶根據需求對憑證抬頭和憑證行項目進行一定的內容修改,這種靈活的功能可以滿足一些非常變態的需求,要不怎么說SAP什么東西都能輕易配置出來呢?
比如國內很多企業都要求會計憑證有個文本摘要可對某些自動憑證根據規則寫入一些文本摘要,或修改憑證的利潤中心,功能范圍等,同樣,理論上講,SAP系統幾乎允許你修改會計憑證的任何內容,甚至包括會計科目,SAP一直強調科目沒有級別,對自動科目設置非常嚴謹,所以修改會計科目通常發生在自動過帳時人工無法干預科目的情況,典型的是MIRO時科目只能對應供應商主數據科目,如果一個供應商發票校驗需要對應應付或其他應付,系統就無法自動實行,就可采用科目替代。
替代Tcode:
OBBH:AP/AR/GL Doc.
OACS:AM Create Assets
OA02:Mass change Assets
GCVY:Global Substitution(In SPL,Company Level)
GCVX:Local Substitution(In SPL,Company code Level).
GGB1:各模塊全部替代
替代如何工作?
相關表格:
GB01|T001Q|T80D|GB03|GB03T|GB31|GB31T||GB907|GB90|GB92|GB922|GB901
|OXT_GENOBJDTL|。
相關函數和程序:
FI_SUBSTITUTION_ACTIVE
FI_SUBSTITUTION_DOC
FI_SUBSTITUTION_HEADER
FI_SUBSTITUTION_ITEM
GBTDMFI0|
GBTDMFIJ|
RGUGBR00|
RGUGBR00|
GBTDMFIJ|GBTDMFIG|
MF05AIENJ
檢驗和替代實例:后續會單獨寫一遍文章介紹。 增強篇10 財務校驗和替代
補充
標准程序SNIF,
通過這個程序可以直接查找出系統已經實施的BAdi、BTE、客戶出口、字段出口甚至是調用的BAPI。
具體操作方法:打開【系統】|【狀態】菜單,雙擊進入程序,點擊【對象列表】按鈕,然后雙擊程序名,找到程序所在PACKAGE。
SE38運行程序SNIF,輸入包名,如果勾上【也選擇SAP實施業務加載項】就會把SAP標准的增強實現也顯示出。運行后,可以點擊各Tab頁查看已經實現的自定義增強。
以CO這個PACKAGE為例: