SAP ABAP(增强技术) BADI自己的一些了解,以及用法
?????????????????????????????????????? 除了BADI,在實際的項目開發中還可能用到其它的增強技術,如出口技術——User exit(用戶出口)、Customer exit(客戶出口)等,而BADI技術,即業務附加(Business Add-ins)相當于面向對象的出口技術,所能完成的功能也類似。
BADI是英文Business Add-ins的縮寫,我們可以簡單地將其翻譯成業務附加,是SAP提供的相對于出口技術來講新一代的增強技術。BADI可以和出口一樣,完成對SAP標準功能的增強,包括程序增強、屏幕增強和菜單增強,與出口不同的是,BADI是面向對象的,因此BADI相對于出口技術最大的不同是可重用性,出口技術的增強只能被實現一次,同一出口是不能被包涵在兩個增強項目(CMOD創建)中的,但大多數BADI都允許存在多個實例,且可同時生效。
BADI增強技術和其它增強技術不同的是,它只能被實施一次并且可以被任何數量的用戶同時調用.此外,BADI可以被按照過濾值定義, 這就允許你控制BADI的實施以及使它基于特殊的條件(比如,在某個特殊的國家)
如果第一次看BADI,不是很能理解的話,可以跟著下面的例子做一遍,邊做邊理解。
1.查找的方法
? 1.1 通過查找關鍵字“CL_EXITHANDLER”
???? 執行任意你想找的程序的T-code,然后點 系統->狀態,得到如下圖:
然后雙擊“程式(畫面)”進入編譯畫面,然后直接搜索。如下圖:
找到對應的 call method cl_exithandler=>get_instance 在此處打斷點,然后在重新運行T-code,進入調試狀態,exit_name中的就是badi名稱。
1.2 通過表SXS_ATTRT直接查找
2.創建BADI.
運行Tcode se18 創建。
本例子,創建了一個名為“Z_BADIDEF_BADITEST2” BADI.
???
如果這個增強將要多次使用或者你想要它的實施基于一個特殊過濾值,就在type欄中選擇相關的復選框.更多關于過濾支持和多重調用的信息稍后會介紹.
本示例只針對基本的增強,因此兩個復選框都不必選中.
"Multiple use" :
1.不勾選。(只能用一個Implementation)
*有返回值
*可以使用importing、changin、returning參數
*即使BADI本身不支持Mulitiple Use也可以同時存在多個Implementations,只不過只能有一個激活的Implementation
2.勾選
*無返回值
*可以使用importing,changing參數
*同時實施多個Implementation時,由于在BADI定義時,不知道哪些Implementation被激活,所有Implementation的執行順序不能被確定
*應用程序可以調用所有被激活的Implementations?
然后雙擊‘介面’
然后雙擊 Interface name "ZIF_EX__BADIDEF_BADITEST2" 進入類的定義。
注:看到這里的時候,感覺對BADI以及有點了解了,因為BADI是面向對象的,所以有類,所以使用BADI的關鍵字是“CALL? METHOD cl_exithandler=>get_instance"。
如上圖,維護方法,然后點擊“參數”按鈕,維護參數如下圖。
保存激活(注意!一定要確保激活成功,不然在后面的調用中是看不到效果的)。這樣,BADI的類就定義好了。就如面向對象一般,類有定義(definition)和實現(inplementation),那么,接下來就是對類的實現。
運行TCODE? “se19”,創建一個在BADI? “Z_BADIDEF_BADITEST2” 下的實現,這里取名為“Z_BADIDEF_BADITEST2I”,如下圖
雙擊上圖圈紅位置,進行類的實現。
雙擊方法名字,進入代碼編輯,在這里我準備做一個大小寫轉換的BADI,相當于寫一個類。
然后再寫一個程序,來調用這個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.過濾支持
BADI可以基于一個特殊過濾值來實施.如果標準的允許一個增強,比如,某國家版,這就象各個合作伙伴想實施這個按照不同的國家創建和激活的截然不同的增強一樣.
在定義你的增強時輸入一個樣過濾類型(比如,一個國家或行業區域) .所有在增強的接口類里創建的方法都含右一個輸入參數"FLT_VAL"作為過濾值.應用程序為該增強方法提供過濾值.方法然后為此值選擇激活的實施.
下面的描述是一個過濾支持的BADI如何在字符串轉換的上下文例子里執行.在下面的例子中,不同的實施將被不同的過濾值調用.
3.1定義一個過濾支持的BADI
如下圖:
勾選Filter dependent,然后編輯過濾的類型(Filter type) ,這個值是需要自己維護的,當然也可以使用系統中所存在的資料元素。上圖的“Z_BADITEST”是在se11里創建的資料元素。具體維護的欄位看下圖:
輸入你想作為過濾類型的數據元素(data element)或從幫助列表中選擇一個過濾類型.
一個過濾類型可以是一個數據元素或一個結構( structure). 一個數據元素必須滿足一下條件:
- 數據元素的域最多包含30個字符并且必須是字符型(Character.).
- 數據元素必須
要么
1).有一個含有和數據元素類型一致的幫助參數的搜索幫助(search help)并且這個參數同時是輸入和輸出參數.
或者
2). 元素的域必須有固定的域值或者有一個包含與該數據元素類型一致的列的值表.我這里進行篩選的值是 A01-大寫?? A02-小寫
然后通過SE19打開類的實現 Z_BADIDEF_BADITEST2I,就會看到下圖:
然后再點擊介面, 雙擊ZCL_IM__BADIDEF_BADITEST2I進入代碼編譯:
再修改調用程序(代碼如下):
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.多重調用(Mutiple use)
1.不勾選。
*有返回值
*可以使用importing、changin、returning參數
*即使BADI本身不支持Mulitiple Use也可以同時存在多個Implementations,只不過只能有一個激活的Implementation
2.勾選
*無返回值
*可以使用importing,changing參數
*同時實施多個Implementation時,由于在BADI定義時,不知道哪些Implementation被激活,所有Implementation的執行順序不能被確定
*應用程序可以調用所有被激活的Implementations?
5.菜單增強
SAP允許你用功能代碼(function code)在用戶界面上增強菜單.這些功能代碼必須符合格式/namespace/+<...>,,就象在SMOD/CMOD 增強.它們指定到一個特殊的增強并且一旦這個增強的實施被激活就在它們相應的菜單中顯示.
開發者在定義一個BADI的時候保留一些特殊的功能代碼給客戶.他們用菜單制作器把這些代碼包納到合適的菜單列表中.開發者必須保證這些菜單選項在程序中調用,而且相應插件的方法也能找到. 客戶可以創建一個新的實施來使用菜單增強,從菜單選項里選擇一個文本,然后編寫當菜單增強被調用時決定執行何種操作的方法.
菜單增強只允許無過濾支持的唯一調用(而非多重調用).目前,菜單增強只能與程序增強結合創建.
創建一個菜單增強,按以下步驟操作:
這里的功能代碼要和調用該程序的status中的功能代碼一致,如下圖:
然后定義類,實現類,如下圖:
定義類
實現類:
看到這里可以知道,我想實現胡這個BADI的功能是,點擊程序菜單,實現num的加2功能,調用程序代碼如下:
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畫面就定義了一個input,操作如下
點擊菜單中的"badi test" 會實現對你輸入在input里的值加2。
待續......
????
總結
以上是生活随笔為你收集整理的SAP ABAP(增强技术) BADI自己的一些了解,以及用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ff14最新服务器人数,FF14第一波转
- 下一篇: 企业局域网管理软件_WorkWin局域网