SAP ABAP之第一,二,三代出口類型BADI實現 概念解釋

BADI是用戶的第三代出口類型,我們來看看其具體的是如何實現的。
一,用戶出口的類型
1,第一代
sap提供一個空代碼的子過程,在這個子過程中用戶可以添加自己的代碼,控制自己的需求。這類增強都需要修改sap的標準代碼。示例:USEREXIT… in SAPMV45A
2,第二代
sap提供的是CUSTOMER-FUNCTION,它是通過SMOD和CMOD完成實現。
3,第三代
sap提供的第三代的用戶出口就是BADI,他的調用方式是CALL METHOD (instance),(相關的TCODE是SE18和SE19),你可以通過EXIT_HANDLER這個單詞查找BADI。

另外還有一種出口叫BTE,在前一個項目裏我們做的OPENFI就是用的這個BTE
相關TCODE: FIBF
Business Transaction Events (Open FI)

二,用戶出口比較
第一代用戶出口是form出口 如
FORM USEREXIT_FIELD_MODIFICATION.

  • CASE SCREEN-GROUP3.
  • WHEN ‘900’.
  • IF VBAK-VBTYP NE 'A'.
    
  •   SCREEN-ACTIVE = 0.
    
  • ENDIF.
    
  • ENDCASE.
  • CASE SCREEN-NAME.
  • WHEN ‘VBAK-VBELN’.
  • SCREEN-ACTIVE = 0.
    
  • ENDCASE.
    ENDFORM.
    找法省略。 SD的用戶出口和定價的用戶出口等多采用這種方式。

第二代用戶出口多是 call customer-function ‘001’ 這種方式實現的。
後面我們會詳細介紹此方法,此方法是現在SAP系統開發用的最多的一種

第三代用戶出口 BADI
badi對象的信息存儲在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 這四個表中(參見SECE包),sap程序都會調用cl_exithandler=>get_instance來判斷對象是否存在,並返回實例;其實get_instance就是對上述幾個表和他們的視圖(V_EXT_IMP 和 V_EXT_ACT)進行查詢和搜索。基於這個機理,我查用ST05來監控一個TCODE來跟蹤,然後選擇查找有關上述幾個表和視圖的操作,就可獲得相關BADI。

在SAP系統中 BADI 相關類的 類圖 如下:

三,BADI的解釋
BADI實現主要通過SE18和SE19實現的,看看如下:
SE18
ZIF_EX_BADI (Interface)
ZCL_EX_BADI (Class)
Method()
SE19
ZIF_EX_BADI (Interface)
ZCL_IM_BADI (Class)
實裝Method()

下面能過代碼分析 BAdI 機制背後的一些設計問題:

  1. 定義指向BAdI interface的Reference
    DATA: exit_ref TYPE REF TO ZIF_EX_BADI.
  2. 獲得繼承BAdI interface的子類實例
    CALL METHOD cl_exithandler=>get_instance
    CHANGING
    instance = exit_ref.
    這裏的cl_exithandler=>get_instance方法是一個簡化的Abstract Factory.
    a) 爲什麼說它是個簡化的Abstract Factory呢? 因爲CL_EXITHANDLER沒有一個抽象的工廠類, 只有一個產品簇, 只完成單一的創建工作。
    b) 爲什麼cl_exithandler=>get_instance要用工廠模式呢?
    在Client代碼端看來,通過調用get_instance這個方法就可以得到具體實現類實例,然後調用下面的方法:
    CALL METHOD exit_ref->CUSTOM_VALIDATION
    IMPORTING
    param = ‘xxx’
    EXPORTING
    flt_val = ‘xxx’.
    就調用到實現類中的接口方法了。但通過Debug代碼你會發現這個調用返回的是Adapter Class 'ZCL_EX_BADI’而非我們的Impl Class!其實這就是創建型模式的意義 - 隱藏對象的創建細節. 也就是說當我們調用CUSTOM_VALIDATION時,其實是調用了ZCL_EX_BADI->CUSTOM_VALIDATION.

四,BADI的實現
A.BADI定義
1.SE18。
2.輸入要創建的BADI的名字,點擊"Create"。
3.輸入BADI的描述性文本,在"Interface"選項卡上輸入接口的名字,也可以採用SAP建議的接口的名字。同時,BADI類也會被創建。
例如:對於BADI "ZTEST",SAP會建議"ZIF_EX_TEST"作爲接口的名字,"ZCL_EX_TEST"作爲類的名字。
4.保存BADI。
5.雙擊接口的名字,會跳轉到Class Builder界面,在這裏你可以定義接口的方法。
6.保存並激活接口。
B.在應用程序中調用BADI
1.聲明一個BADI接口的參考引用變量。
例如:DATA exit_ref TYPE REF TO zif_ex_test.
2.調用類CL_EXITHANDLER的靜態方法GET_INSTANCE,將返回一個請求對象的實例。
例如:
CALL METHOD CL_EXITHANDLER=>GET_INSTANCE
CHANGING instance = exit_ref。
3.現在你可以調用BADI的所有方法了
C.BADI實現
1.SE19。
2.輸入BADI實現的名字,點擊"Create"。
3.輸入BADI定義的名字。
4.輸入實現的描述性文本,在"Interface"選項卡上輸入實現類的名字。可以採用SAP建議的名字。
例如:"ZIMPTEST",SAP會建議"ZCL_IM_IMPTEST"。
5.保存實現。
6.雙擊某一方法名會跳轉到Class Builder界面,在這裏你可以添加代碼來重定義接口方法。
7.激活實現

五,查找BADI
本帖隱藏的內容BADI是SAP的第三代用戶出口,採用了面向對象的方式,據說在4.6A版本之後才引入的BADI。
使用st05查找BADI
1)ST05,選擇SQL trace、buffer trace,然後activate trace
2)運行TCODE
3)deactivate trace
4)display trace,顯示display trace的對話框,在表的欄位上加上? V_EXT_IMP和 V_EXT_ACT
5)查看以IF_EX_開頭的字符串,這是interface class 的名字,IF_EX_後面的就是BADI。例如IF_EX_EQUI_UPDATE


作者:forever_crazy
來源:CSDN
原文:https://blog.csdn.net/forever_crazy/article/details/27636709
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章