【ABAP增强】基于BADI的增强
? ? ? ? BADI的全稱是Business Add-in,它的主要技術是基于ABAP的對象來實現增強。SAP中BADI的維護事務代碼是SE18和SE19,SE18主要是創建及維護BADI對象,而SE19用于維護BADI的實例,即如何來實現BADI對象的功能。
? ? ? ? SAP的BADI因系統版本的差別可能會有不同,R/3中的BADI被稱為Classic BADI,而到了SAP Netweaver中ABAP被升級到了7.0版本,新增了BADI Enhancement Spot對象,Classic BADI 的功能被保留,但是Classic BADI所維護的對象也可以移植到新的BADI中進行操作。SAP的BADI不但可以實現對標準功能系統的增強,也可以直接在自定義程序中進行調用。
1、自定義BADI對象的創建及維護實例
下面就開始介紹如何自定義一個BADI對象,并實現在ABAP程序中對該對象的調用,通過實例可以初步的了解BADI維護工具的具體操作及相關屬性。
<1>輸入事務代碼SE18,進入到BADI Builder的維護界面,選擇“增強點”(Enhancement Spot)的單選按鈕,在輸入欄中輸入自定義的對象名稱,這里我們以“ZBADI_TEST001”為例,如下圖所示:
<2>單據工具欄中的“創建”按鈕,系統將會彈出“Create Enhancement Spot”對話框,需要維護對象名稱及描述,具體如下圖所示:
<3>單擊“確認”按鈕,保存Enhancement Spot對象,進入到Enhancement Spot對象屬性維護頁面,選擇第四個頁簽“增強點元素定義”,如下圖所示:
<4>單擊“創建”的空白按鈕,系統將會彈出“創建BADI定義”對話框,要求維護自定義BADI的名稱及描述,這里我們輸入“ZBADI_TEST001”,如下圖:
<5>單擊“確定”按鈕,可以看到操作頁面的列表中增加了BADI定義的對象,如下圖所示:
<6>單擊菜單中的“接口”節點,在屏幕的右邊將會出現接口定義的維護字段,在接口字段輸入自定義接口名稱“ZBADI_TEST_F01”,如下圖所示:
<7>將光標定位在接口字段并按下回車鍵,系統提示“類/接口不存在,是否要創建對象?”,如下圖所示:
<8>單擊“是”按鈕將保存該接口對象,接下來將會進入類別制作器維護頁面。在該頁面的“方法”字段中維護自定義方法,這里定義名稱為“PRINT”,如下圖所示:
<9>單擊“類別制作器”工具欄中的“參數”按鈕,進入所選方法的參數維護頁面。為“PRINT”方法分別定義一個輸入和一個輸出參數,參數名稱分別為INPUT和OUTPUT,具體如下圖所示:
<10>保存并激活上述操作,返回BADI定義的頁面,在BADI對象列表中選擇第二個節點“實施”,在節點處單擊鼠標右鍵,將會出現“創建BADI實施”的菜單選項,如下圖所示:
<11>將會彈出“Create Enhancement Implementation”對話框,這里新建Enhancement實例名稱為“ZBADI_TEST001_IMP”,具體如下圖所示:
這里所創建的“Enhancement Implementation”也可以在SE19中查看及維護。
<12>“Create Enhancement Implementation”輸入完畢點“確認”之后,系統會彈出“創建BADI實施”的對話框,這里維護BADI的實施名稱為“ZBADI_TEST001”,實施類的名稱為“ZBADI_TEST001_CLASS”,如下圖所示:
<13>確認后進入“Enhancement Implementation”維護界面,如圖所示:
<14>雙擊實施類所對應的方法“ZBADI_TEST_F01~PRINT”,系統將會提示是否創建該實例,單擊“確認”按鈕后會創建一個新的實例,該方法所對應的實例維護界面如下圖所示:
本例在創建接口時,為該方法建立了INPUT和OUTPUT兩個參數,在程序中可以直接調用這兩個參數,相關的代碼如下:
METHOD ZBADI_TEST_F01~PRINT.CONCATENATE '輸入:' INPUT INTO OUTPUT.ENDMETHOD.<15>所創建的BADI還可以在ABAP程序中直接調用,如下面所示:
REPORT ZTEST_BADI_001.DATA : BADI1 TYPE REF TO ZBADI_TEST_F01, "參照接口對象BADI2 TYPE REF TO ZBADI_TEST001_CLASS."參照實施類DATA : INSTR TYPE STRING,OUTSTR TYPE STRING.START-OF-SELECTION.CREATE OBJECT BADI2. "創建一個類的實例BADI1 = BADI2. "對實例賦值INSTR = 'Test'.CALL METHOD BADI1->PRINT "調用BADI所生成的類方法EXPORTINGINPUT = INSTRIMPORTINGOUTPUT = OUTSTR.WRITE : OUTSTR.?
2、如何查找系統中的BADI
SAP中的源碼,相關BADI增強都是通過方法“CL_EXITHANDLER=>GET INSTANCE”來調用的,以客戶維護事務代碼VD02為例,作相關步驟的講解:
<1>在VD02的操作頁面中執行主菜單中的“系統”-“狀態”命令來查看該事務代碼的源碼程序,可以發現VD02的程序名稱為“SAPMF02D”。
<2>進入到程序“SAPMF02D”的代碼查看頁面,單擊工具欄中的“查找”按鈕,輸入系統調用BADI的方法的前幾個字母“CL_EXIT”,如圖所示:
<3>單擊“確定”按鈕后,顯示查找的結果:
以上述結果中的某段為例,比如BADI對象為EXIT_NAME的參數“CUSTOMER_ADD_DATA”。
* Instanz setzenCALL METHOD CL_EXITHANDLER=>GET_INSTANCEexporting " \TP 563352exit_name = 'CUSTOMER_ADD_DATA' " \TP 563352null_instance_accepted = 'X' " \TP 563352CHANGINGINSTANCE = G_ADDITIONAL_DATA.還有些代碼是直接調用BADI中的類,該類在方法取用時為一個參數的形式,如下圖所示:
遇到這類代碼,可以直接雙擊查找的訂單,查看源碼所在的位置,然后雙擊類關聯的參數,將可以看到參數的定義代碼,所查找的類名稱通常是以“CL_EX_”作為開頭的,BADI名則截取后面的部分。以本例在銷售訂單中創建事務代碼VA01的關聯程序中找到了BADI類:if_ex_oij_el_tsw_details,則其關聯的BADI對象名稱為“oij_el_tsw_details”。
STATICS: l_exit TYPE REF TO if_ex_oij_el_tsw_details.IF l_exit IS INITIAL.CALL METHOD cl_exithandler=>get_instanceCHANGINGinstance = l_exit.ENDIF.所找到的BADI對象可以通過事務代碼SE18來查看,以BADI:CUSTOMER_ADD_DATA為例,可以看到其對應的接口類為IF_EX_CUSTOMER_ADD_DATA,如下圖所示:
除了通過上面的方法外,也可以通過SE80來查看增強對象,SAP的所有程序都被分配到了一個開發類,例如XD02對應的開發類就是VS,在SE80查看該開發類調用的增強,如下圖所示:
3、通過BADI實現客戶主數據控制功能的建立
以上面找到的增強對象“CUSTOMER_ADD_DATA”為例,該BADI是在XD02中找到的,關聯的業務肯定是與客戶主數據的創建和維護有關系,增強實現具體如下。
<1>輸入事務代碼SE19,輸入BADI對象名稱“CUSTOMER_ADD_DATA”,如下圖所示:
<2>點擊“創建實施”按鈕,彈出對話框,維護BADI定義的Enhancement Implementation的名稱和描述,這里定義為“ZCUSTOMER_ADD_DATA”。
<3>單擊“確認”之后需要進一步維護新建BADI對象的實施對象名稱及實施類,本例中定義BADI的實施對象名稱為“ZCUSTOMER_ADD_DATA”,實施類名稱為“ZCL_IM_ZCUSTOMER_ADD_DATA”,然后在下拉菜單中選擇該BADI的實施類為“CUSTOMER_ADD_DATA”。
<4>單擊“確定”按鈕,進入BADI實施對象的維護頁面,新建的實施類繼承了原有BADI對象所對應的實施類的所有方法,如下圖所示:
<5>新建的BADI實施類繼承了所有的方法,雙擊列表中某一個方法,將進入其ABAP編輯頁面,可以由用戶編寫自定義的代碼。雙擊實施類或者通過事務代碼SE24可以查看該類所有方法的接口參數信息。
以方法“CHECK_ALL_DATA”為例,從名稱上看可以獲悉該方法應該適用于對客戶數據的檢查,查看接口參數,幾乎包括了客戶主數據維護的所有信息,如下圖所示:
下面舉例說明,在客戶保存的時候,檢查該客戶的地址信息是否已經維護,當地址信息為空時,提示不允許保存。客戶對應的地址信息數據存儲在物理表KNA1-STRAS字段中,可以推斷其對應的接口參數為S_KNA1-STRAS,雙擊“CHECK_ALL_DATA”方法,進入到ABAP維護界面,如下圖所示:
維護代碼:
METHOD IF_EX_CUSTOMER_ADD_DATA~CHECK_ALL_DATA.IF S_KNA1-STRAS IS INITIAL.MESSAGE E001(00) WITH '客戶的地址信息不可以為空!'.ENDIF.ENDMETHOD.保存并激活增強代碼即可。
?
總結
以上是生活随笔為你收集整理的【ABAP增强】基于BADI的增强的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ABAP增强】基于函数的出口CMOD
- 下一篇: 【ABAP】通过SE30来测试程序的执行