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