Classic BADI总结
這里對sap Classic Badi 做一下總結,雖然已經是過時的技術了.
- Classic BADI的創建
- Classic BADI的實施
- Classic BADI的調用及運行原理
- New BADI
- FCODE增強
- 屏幕增強
事務代碼:SE18
由于Classic Badi 已經是過時的技術了,現在提倡用4代增強NEW BADI.所有三代增強的創建入口被隱藏在實用程序下邊.
入口 SE18--Utilities--Create classic BAdi.
填寫必要字段
注意一下系統自動生成的類 ZCL_EX_TEST_OLD_BADI2.這個類是BADI運行的關鍵.后面會講到.
Multiple Use 如果打勾了,那么這個Badi可以同時存在多個激活的實例.但實例執行的順序是沒有規律的.
如果Multiple Use打勾了,則該BADI定義就不能有按鍵增強和子屏幕增強了.
Filter-Depend如果打勾了,需要填寫一個過濾器類型,過濾器類型有如下限制: 是char類型的數據元素;長度不能超過30位;具有搜索幫助;有一個具有固定值或者值表的域.
如果啟用了過濾器,則所有BADI接口的方法的參數中會自動(也必須)包含一個輸入參數(importing):FLT_VAL.
如果Filter-Depend打勾了,則該BAID就不能有按鍵增強.
在創建BADI時系統會自動根據BADI的名稱建議一個接口名稱,該名稱和自動生成的BADI類只是前綴不同.當然接口名稱可以修改.
雙擊接口名稱就可以創建該接口,在接口創建界面定義方法和屬性值.
如果啟用了過濾器,則所有BADI接口的方法的參數中會自動(也必須)包含一個輸入參數(importing):FLT_VAL.
此處創建的接口將作為BADI實施類的接口.
當激活BAID時,系統將會根據接口生成有一個上邊提到的BADI類ZCL_EX_TEST_OLD_BADI2,自然該類將包含接口中的所有方法及屬性.
關于按鍵增強(狀態欄增強)及子屏幕增強將在后邊講.
? ?? 2. ? ? Classic BADI的實施 ?
? ? ? ? ? ? ?? 事務碼:SE19.
? ? ? ? ? ? ??
? ? ? ? ? ? ? ? 在Create Implementation 框中,選擇Classic BAdI.輸入BADI名稱,點擊Create按鍵創建BADI實施.
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? 指定BADI實施名稱,繼續.
? ? ? ? ? ?? 如果BADI包含過濾器FILTER.則在BADI實施的屬性頁中必須指定過濾值Filter value(可以是多值).只有在在調用BADI的類的接口方法時,傳入給參數FLT_VAL的值等于該實施的 Filter value 時,該實施對應的方法才會被調用.詳情見BADI的調用.
? ? ? ? ? ??
? ? ? ? ??
? ? ? ? ? ? 然后可以在interface頁中重寫所有BADI接口的方法了. 沒有問題后激活,則badi實施就完成了.
? ? ? ? ?? 如果BADI不是多次使用的.則同時只能有一個實施是激活的.
? ? ?? 3. Classic BADI的調用,運行原理及相關數據庫透明表.
? ? ? ? ?? 與三代之前的增強相關的內容都放在包SECE(Enhancement concept)中.
? ? ? ? ?? 其中與三代BADI相關的視圖或者表如下:
? ? ? ? ? 視圖BADI_DATA:包含了BADI名稱,過濾器Filter的數據元素,是否可以重復可以多次使用,BADI接口,BADI類等信息
? ? ? ? ?? 視圖:V_EXT_ACT 包含了BADI對應的活動的實施
? ? ? ? BADI調用時,需要先定義一個類型為BADI接口的參考變量.當然類型為BADI類也可以.
? ? ?? 然后調用類cl_exithandler的靜態方法get_instance.
? ? ? 然后用返回的參考變量調用方法就可以了.
DATA gr_test_odl_badi TYPE REF TO zif_ex_test_old_badi. DATA gv_string TYPE string.PARAMETERS p_bukrs TYPE bukrs.START-OF-SELECTION.CALL METHOD cl_exithandler=>get_instance * EXPORTING * exit_name = * null_instance_accepted = SEEX_FALSE * IMPORTING * act_imp_existing =CHANGINGinstance = gr_test_odl_badi "需要注意的時此時返回的參考變量為BADI類的參考變量,而不是實施類的參考變量. * EXCEPTIONS * no_reference = 1 * no_interface_reference = 2 * no_exit_interface = 3 * class_not_implement_interface = 4 * single_exit_multiply_active = 5 * cast_error = 6 * exit_not_existing = 7 * data_incons_in_exit_managem = 8 * others = 9 .IF sy-subrc <> 0. * Implement suitable error handling hereENDIF.CALL METHOD gr_test_odl_badi->get_butxt EXPORTINGflt_val = p_bukrsCHANGINGbutxt = gv_string.? ? ?前邊我們提到過,在激活BADI時系統會自動生成一個BADI的類(這個類也是參考BADI接口創建的)及其方法.
? ?? 使用cl_exithandler=>get_instance歸回的參考變量就是BADI類的參考變量.
? ? 該方法通過cl_abap_typedescr=>describe_by_data 獲取changing參數gr_test_odl_badi類型對應的接口.
? ? 通過接口在表SXS_INTER中找到BADI名稱.然后通過拼接獲取BADI對應類的名稱.
? ? 之后我們調用的方法gr_test_odl_badi->get_butxt就是激活BADI時,系統自動生成的方法.
? ? 該方法的作用在于檢查該BADI是否有激活的實施.
? ? 如果存在,則依次調用每個實施類的相同的方法.
轉載于:https://www.cnblogs.com/weixiaopeng/p/old_badi.html
總結
以上是生活随笔為你收集整理的Classic BADI总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排队论基础
- 下一篇: java redis hscan_red