SAP ABAP(增强技术) BADI自己的一些了解,以及用法
?????????????????????????????????????? 除了BADI,在實(shí)際的項(xiàng)目開(kāi)發(fā)中還可能用到其它的增強(qiáng)技術(shù),如出口技術(shù)——User exit(用戶出口)、Customer exit(客戶出口)等,而BADI技術(shù),即業(yè)務(wù)附加(Business Add-ins)相當(dāng)于面向?qū)ο蟮某隹诩夹g(shù),所能完成的功能也類(lèi)似。
BADI是英文Business Add-ins的縮寫(xiě),我們可以簡(jiǎn)單地將其翻譯成業(yè)務(wù)附加,是SAP提供的相對(duì)于出口技術(shù)來(lái)講新一代的增強(qiáng)技術(shù)。BADI可以和出口一樣,完成對(duì)SAP標(biāo)準(zhǔn)功能的增強(qiáng),包括程序增強(qiáng)、屏幕增強(qiáng)和菜單增強(qiáng),與出口不同的是,BADI是面向?qū)ο蟮?#xff0c;因此BADI相對(duì)于出口技術(shù)最大的不同是可重用性,出口技術(shù)的增強(qiáng)只能被實(shí)現(xiàn)一次,同一出口是不能被包涵在兩個(gè)增強(qiáng)項(xiàng)目(CMOD創(chuàng)建)中的,但大多數(shù)BADI都允許存在多個(gè)實(shí)例,且可同時(shí)生效。
BADI增強(qiáng)技術(shù)和其它增強(qiáng)技術(shù)不同的是,它只能被實(shí)施一次并且可以被任何數(shù)量的用戶同時(shí)調(diào)用.此外,BADI可以被按照過(guò)濾值定義, 這就允許你控制BADI的實(shí)施以及使它基于特殊的條件(比如,在某個(gè)特殊的國(guó)家)
如果第一次看BADI,不是很能理解的話,可以跟著下面的例子做一遍,邊做邊理解。
1.查找的方法
? 1.1 通過(guò)查找關(guān)鍵字“CL_EXITHANDLER”
???? 執(zhí)行任意你想找的程序的T-code,然后點(diǎn) 系統(tǒng)->狀態(tài),得到如下圖:
然后雙擊“程式(畫(huà)面)”進(jìn)入編譯畫(huà)面,然后直接搜索。如下圖:
找到對(duì)應(yīng)的 call method cl_exithandler=>get_instance 在此處打斷點(diǎn),然后在重新運(yùn)行T-code,進(jìn)入調(diào)試狀態(tài),exit_name中的就是badi名稱(chēng)。
1.2 通過(guò)表SXS_ATTRT直接查找
2.創(chuàng)建BADI.
運(yùn)行Tcode se18 創(chuàng)建。
本例子,創(chuàng)建了一個(gè)名為“Z_BADIDEF_BADITEST2” BADI.
???
如果這個(gè)增強(qiáng)將要多次使用或者你想要它的實(shí)施基于一個(gè)特殊過(guò)濾值,就在type欄中選擇相關(guān)的復(fù)選框.更多關(guān)于過(guò)濾支持和多重調(diào)用的信息稍后會(huì)介紹.
本示例只針對(duì)基本的增強(qiáng),因此兩個(gè)復(fù)選框都不必選中.
"Multiple use" :
1.不勾選。(只能用一個(gè)Implementation)
*有返回值
*可以使用importing、changin、returning參數(shù)
*即使BADI本身不支持Mulitiple Use也可以同時(shí)存在多個(gè)Implementations,只不過(guò)只能有一個(gè)激活的Implementation
2.勾選
*無(wú)返回值
*可以使用importing,changing參數(shù)
*同時(shí)實(shí)施多個(gè)Implementation時(shí),由于在BADI定義時(shí),不知道哪些Implementation被激活,所有Implementation的執(zhí)行順序不能被確定
*應(yīng)用程序可以調(diào)用所有被激活的Implementations?
然后雙擊‘介面’
然后雙擊 Interface name "ZIF_EX__BADIDEF_BADITEST2" 進(jìn)入類(lèi)的定義。
注:看到這里的時(shí)候,感覺(jué)對(duì)BADI以及有點(diǎn)了解了,因?yàn)锽ADI是面向?qū)ο蟮?#xff0c;所以有類(lèi),所以使用BADI的關(guān)鍵字是“CALL? METHOD cl_exithandler=>get_instance"。
如上圖,維護(hù)方法,然后點(diǎn)擊“參數(shù)”按鈕,維護(hù)參數(shù)如下圖。
保存激活(注意!一定要確保激活成功,不然在后面的調(diào)用中是看不到效果的)。這樣,BADI的類(lèi)就定義好了。就如面向?qū)ο笠话?#xff0c;類(lèi)有定義(definition)和實(shí)現(xiàn)(inplementation),那么,接下來(lái)就是對(duì)類(lèi)的實(shí)現(xiàn)。
運(yùn)行TCODE? “se19”,創(chuàng)建一個(gè)在BADI? “Z_BADIDEF_BADITEST2” 下的實(shí)現(xiàn),這里取名為“Z_BADIDEF_BADITEST2I”,如下圖
雙擊上圖圈紅位置,進(jìn)行類(lèi)的實(shí)現(xiàn)。
雙擊方法名字,進(jìn)入代碼編輯,在這里我準(zhǔn)備做一個(gè)大小寫(xiě)轉(zhuǎn)換的BADI,相當(dāng)于寫(xiě)一個(gè)類(lèi)。
然后再寫(xiě)一個(gè)程序,來(lái)調(diào)用這個(gè)BADI,代碼如下:
REPORT z_businessaddin .CLASS cl_exithandler DEFINITION LOAD. "聲明DATA exit TYPE REF TO zif_ex__badidef_baditest2. DATA word(15) TYPE c VALUE 'Business Add-in'.START-OF-SELECTION.CALL METHOD cl_exithandler=>get_instanceCHANGING instance = exit.WRITE :/'Please click here'.AT LINE-SELECTION.NEW-PAGE.WRITE: / 'Original word: ',word.CALL METHOD exit->methodCHANGINGparameter = word.WRITE: / 'Changing word: ',word.效果如下:
3.過(guò)濾支持
BADI可以基于一個(gè)特殊過(guò)濾值來(lái)實(shí)施.如果標(biāo)準(zhǔn)的允許一個(gè)增強(qiáng),比如,某國(guó)家版,這就象各個(gè)合作伙伴想實(shí)施這個(gè)按照不同的國(guó)家創(chuàng)建和激活的截然不同的增強(qiáng)一樣.
在定義你的增強(qiáng)時(shí)輸入一個(gè)樣過(guò)濾類(lèi)型(比如,一個(gè)國(guó)家或行業(yè)區(qū)域) .所有在增強(qiáng)的接口類(lèi)里創(chuàng)建的方法都含右一個(gè)輸入?yún)?shù)"FLT_VAL"作為過(guò)濾值.應(yīng)用程序?yàn)樵撛鰪?qiáng)方法提供過(guò)濾值.方法然后為此值選擇激活的實(shí)施.
下面的描述是一個(gè)過(guò)濾支持的BADI如何在字符串轉(zhuǎn)換的上下文例子里執(zhí)行.在下面的例子中,不同的實(shí)施將被不同的過(guò)濾值調(diào)用.
3.1定義一個(gè)過(guò)濾支持的BADI
如下圖:
勾選Filter dependent,然后編輯過(guò)濾的類(lèi)型(Filter type) ,這個(gè)值是需要自己維護(hù)的,當(dāng)然也可以使用系統(tǒng)中所存在的資料元素。上圖的“Z_BADITEST”是在se11里創(chuàng)建的資料元素。具體維護(hù)的欄位看下圖:
輸入你想作為過(guò)濾類(lèi)型的數(shù)據(jù)元素(data element)或從幫助列表中選擇一個(gè)過(guò)濾類(lèi)型.
一個(gè)過(guò)濾類(lèi)型可以是一個(gè)數(shù)據(jù)元素或一個(gè)結(jié)構(gòu)( structure). 一個(gè)數(shù)據(jù)元素必須滿足一下條件:
- 數(shù)據(jù)元素的域最多包含30個(gè)字符并且必須是字符型(Character.).
- 數(shù)據(jù)元素必須
要么
1).有一個(gè)含有和數(shù)據(jù)元素類(lèi)型一致的幫助參數(shù)的搜索幫助(search help)并且這個(gè)參數(shù)同時(shí)是輸入和輸出參數(shù).
或者
2). 元素的域必須有固定的域值或者有一個(gè)包含與該數(shù)據(jù)元素類(lèi)型一致的列的值表.我這里進(jìn)行篩選的值是 A01-大寫(xiě)?? A02-小寫(xiě)
然后通過(guò)SE19打開(kāi)類(lèi)的實(shí)現(xiàn) Z_BADIDEF_BADITEST2I,就會(huì)看到下圖:
然后再點(diǎn)擊介面, 雙擊ZCL_IM__BADIDEF_BADITEST2I進(jìn)入代碼編譯:
再修改調(diào)用程序(代碼如下):
REPORT z_businessaddin .CLASS cl_exithandler DEFINITION LOAD.DATA exit TYPE REF TO zif_ex__badidef_baditest2. DATA word(15) TYPE c VALUE 'Business Add-in'. DATA flt TYPE z_baditest. * START-OF-SELECTION.PERFORM formatlist.CALL METHOD cl_exithandler=>get_instanceCHANGING instance = exit.WRITE :/'Please click here'.AT LINE-SELECTION.NEW-PAGE.WRITE: / 'Original word: ',word.CALL METHOD exit->methodEXPORTINGflt_val = fltCHANGINGparameter = word.WRITE: / 'Changing word: ',word.*&---------------------------------------------------------------------* *& Form formatlist *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM formatlist.WRITE:/'A01->Conversion to upper case'.flt = 'A01'.HIDE flt.WRITE:/'A02->Conversion to lower case'.flt = 'A02'.HIDE flt.ENDFORM. " formatlist效果如下:
??????????????????????????????????????????
4.多重調(diào)用(Mutiple use)
1.不勾選。
*有返回值
*可以使用importing、changin、returning參數(shù)
*即使BADI本身不支持Mulitiple Use也可以同時(shí)存在多個(gè)Implementations,只不過(guò)只能有一個(gè)激活的Implementation
2.勾選
*無(wú)返回值
*可以使用importing,changing參數(shù)
*同時(shí)實(shí)施多個(gè)Implementation時(shí),由于在BADI定義時(shí),不知道哪些Implementation被激活,所有Implementation的執(zhí)行順序不能被確定
*應(yīng)用程序可以調(diào)用所有被激活的Implementations?
5.菜單增強(qiáng)
SAP允許你用功能代碼(function code)在用戶界面上增強(qiáng)菜單.這些功能代碼必須符合格式/namespace/+<...>,,就象在SMOD/CMOD 增強(qiáng).它們指定到一個(gè)特殊的增強(qiáng)并且一旦這個(gè)增強(qiáng)的實(shí)施被激活就在它們相應(yīng)的菜單中顯示.
開(kāi)發(fā)者在定義一個(gè)BADI的時(shí)候保留一些特殊的功能代碼給客戶.他們用菜單制作器把這些代碼包納到合適的菜單列表中.開(kāi)發(fā)者必須保證這些菜單選項(xiàng)在程序中調(diào)用,而且相應(yīng)插件的方法也能找到. 客戶可以創(chuàng)建一個(gè)新的實(shí)施來(lái)使用菜單增強(qiáng),從菜單選項(xiàng)里選擇一個(gè)文本,然后編寫(xiě)當(dāng)菜單增強(qiáng)被調(diào)用時(shí)決定執(zhí)行何種操作的方法.
菜單增強(qiáng)只允許無(wú)過(guò)濾支持的唯一調(diào)用(而非多重調(diào)用).目前,菜單增強(qiáng)只能與程序增強(qiáng)結(jié)合創(chuàng)建.
創(chuàng)建一個(gè)菜單增強(qiáng),按以下步驟操作:
這里的功能代碼要和調(diào)用該程序的status中的功能代碼一致,如下圖:
然后定義類(lèi),實(shí)現(xiàn)類(lèi),如下圖:
定義類(lèi)
實(shí)現(xiàn)類(lèi):
看到這里可以知道,我想實(shí)現(xiàn)胡這個(gè)BADI的功能是,點(diǎn)擊程序菜單,實(shí)現(xiàn)num的加2功能,調(diào)用程序代碼如下:
REPORT z_businessaddin .CLASS cl_exithandler DEFINITION LOAD.DATA flt TYPE z_baditest. DATA ok_code TYPE sy-ucomm. DATA num TYPE i VALUE 0. DATA exit TYPE REF TO zif_ex__badi_menu. START-OF-SELECTION.CALL METHOD cl_exithandler=>get_instanceCHANGING instance = exit.CALL SCREEN 0001.*&---------------------------------------------------------------------* *& Module STATUS_0001 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE status_0001 OUTPUT.SET PF-STATUS 'STATUS'. * SET TITLEBAR 'xxx'.ENDMODULE. " STATUS_0001 OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0001 INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE user_command_0001 INPUT.CASE sy-ucomm.WHEN 'BACK'.LEAVE TO SCREEN 0.WHEN '+CUS'.CALL METHOD exit->methodCHANGING num = num.WRITE num.ENDCASE.ENDMODULE. " USER_COMMAND_0001 INPUT畫(huà)面就定義了一個(gè)input,操作如下
點(diǎn)擊菜單中的"badi test" 會(huì)實(shí)現(xiàn)對(duì)你輸入在input里的值加2。
待續(xù)......
????
總結(jié)
以上是生活随笔為你收集整理的SAP ABAP(增强技术) BADI自己的一些了解,以及用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ff14最新服务器人数,FF14第一波转
- 下一篇: 企业局域网管理软件_WorkWin局域网