Classic BADI总结
這里對(duì)sap Classic Badi 做一下總結(jié),雖然已經(jīng)是過時(shí)的技術(shù)了.
- Classic BADI的創(chuàng)建
- Classic BADI的實(shí)施
- Classic BADI的調(diào)用及運(yùn)行原理
- New BADI
- FCODE增強(qiáng)
- 屏幕增強(qiáng)
事務(wù)代碼:SE18
由于Classic Badi 已經(jīng)是過時(shí)的技術(shù)了,現(xiàn)在提倡用4代增強(qiáng)NEW BADI.所有三代增強(qiáng)的創(chuàng)建入口被隱藏在實(shí)用程序下邊.
入口 SE18--Utilities--Create classic BAdi.
填寫必要字段
注意一下系統(tǒng)自動(dòng)生成的類 ZCL_EX_TEST_OLD_BADI2.這個(gè)類是BADI運(yùn)行的關(guān)鍵.后面會(huì)講到.
Multiple Use 如果打勾了,那么這個(gè)Badi可以同時(shí)存在多個(gè)激活的實(shí)例.但實(shí)例執(zhí)行的順序是沒有規(guī)律的.
如果Multiple Use打勾了,則該BADI定義就不能有按鍵增強(qiáng)和子屏幕增強(qiáng)了.
Filter-Depend如果打勾了,需要填寫一個(gè)過濾器類型,過濾器類型有如下限制: 是char類型的數(shù)據(jù)元素;長度不能超過30位;具有搜索幫助;有一個(gè)具有固定值或者值表的域.
如果啟用了過濾器,則所有BADI接口的方法的參數(shù)中會(huì)自動(dòng)(也必須)包含一個(gè)輸入?yún)?shù)(importing):FLT_VAL.
如果Filter-Depend打勾了,則該BAID就不能有按鍵增強(qiáng).
在創(chuàng)建BADI時(shí)系統(tǒng)會(huì)自動(dòng)根據(jù)BADI的名稱建議一個(gè)接口名稱,該名稱和自動(dòng)生成的BADI類只是前綴不同.當(dāng)然接口名稱可以修改.
雙擊接口名稱就可以創(chuàng)建該接口,在接口創(chuàng)建界面定義方法和屬性值.
如果啟用了過濾器,則所有BADI接口的方法的參數(shù)中會(huì)自動(dòng)(也必須)包含一個(gè)輸入?yún)?shù)(importing):FLT_VAL.
此處創(chuàng)建的接口將作為BADI實(shí)施類的接口.
當(dāng)激活BAID時(shí),系統(tǒng)將會(huì)根據(jù)接口生成有一個(gè)上邊提到的BADI類ZCL_EX_TEST_OLD_BADI2,自然該類將包含接口中的所有方法及屬性.
關(guān)于按鍵增強(qiáng)(狀態(tài)欄增強(qiáng))及子屏幕增強(qiáng)將在后邊講.
? ?? 2. ? ? Classic BADI的實(shí)施 ?
? ? ? ? ? ? ?? 事務(wù)碼:SE19.
? ? ? ? ? ? ??
? ? ? ? ? ? ? ? 在Create Implementation 框中,選擇Classic BAdI.輸入BADI名稱,點(diǎn)擊Create按鍵創(chuàng)建BADI實(shí)施.
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? 指定BADI實(shí)施名稱,繼續(xù).
? ? ? ? ? ?? 如果BADI包含過濾器FILTER.則在BADI實(shí)施的屬性頁中必須指定過濾值Filter value(可以是多值).只有在在調(diào)用BADI的類的接口方法時(shí),傳入給參數(shù)FLT_VAL的值等于該實(shí)施的 Filter value 時(shí),該實(shí)施對(duì)應(yīng)的方法才會(huì)被調(diào)用.詳情見BADI的調(diào)用.
? ? ? ? ? ??
? ? ? ? ??
? ? ? ? ? ? 然后可以在interface頁中重寫所有BADI接口的方法了. 沒有問題后激活,則badi實(shí)施就完成了.
? ? ? ? ?? 如果BADI不是多次使用的.則同時(shí)只能有一個(gè)實(shí)施是激活的.
? ? ?? 3. Classic BADI的調(diào)用,運(yùn)行原理及相關(guān)數(shù)據(jù)庫透明表.
? ? ? ? ?? 與三代之前的增強(qiáng)相關(guān)的內(nèi)容都放在包SECE(Enhancement concept)中.
? ? ? ? ?? 其中與三代BADI相關(guān)的視圖或者表如下:
? ? ? ? ? 視圖BADI_DATA:包含了BADI名稱,過濾器Filter的數(shù)據(jù)元素,是否可以重復(fù)可以多次使用,BADI接口,BADI類等信息
? ? ? ? ?? 視圖:V_EXT_ACT 包含了BADI對(duì)應(yīng)的活動(dòng)的實(shí)施
? ? ? ? BADI調(diào)用時(shí),需要先定義一個(gè)類型為BADI接口的參考變量.當(dāng)然類型為BADI類也可以.
? ? ?? 然后調(diào)用類cl_exithandler的靜態(tài)方法get_instance.
? ? ? 然后用返回的參考變量調(diào)用方法就可以了.
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 "需要注意的時(shí)此時(shí)返回的參考變量為BADI類的參考變量,而不是實(shí)施類的參考變量. * 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時(shí)系統(tǒng)會(huì)自動(dòng)生成一個(gè)BADI的類(這個(gè)類也是參考BADI接口創(chuàng)建的)及其方法.
? ?? 使用cl_exithandler=>get_instance歸回的參考變量就是BADI類的參考變量.
? ? 該方法通過cl_abap_typedescr=>describe_by_data 獲取changing參數(shù)gr_test_odl_badi類型對(duì)應(yīng)的接口.
? ? 通過接口在表SXS_INTER中找到BADI名稱.然后通過拼接獲取BADI對(duì)應(yīng)類的名稱.
? ? 之后我們調(diào)用的方法gr_test_odl_badi->get_butxt就是激活BADI時(shí),系統(tǒng)自動(dòng)生成的方法.
? ? 該方法的作用在于檢查該BADI是否有激活的實(shí)施.
? ? 如果存在,則依次調(diào)用每個(gè)實(shí)施類的相同的方法.
轉(zhuǎn)載于:https://www.cnblogs.com/weixiaopeng/p/old_badi.html
總結(jié)
以上是生活随笔為你收集整理的Classic BADI总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排队论基础
- 下一篇: java redis hscan_red