BADI的层次分析以及BADI里面的每个块的理解 看完你就懂!
在講本文之前有一個要認清的概念就是,我們建立的BADI imp,到底是怎么發揮增強的作用的:
badi本身是一個接口,可以創建很多IMP,但是這些IMP都怎么起作用呢?
(有兩種情況,第一是例如一個主數據的BADI,當你創建了IMP,當修改主數據的時候,就會走這些IMP的代碼。另外一個是,例如自己建一個Z的BADI,然后使用方法就是通過在自己的程序里面調用這個object,并且調用具體的method)
1、首先想知道例如在某個標準程序里面要做增強,我應該使用那些BADI,可以嘗試這樣:
? ? ? badi對象的信息存儲在SXS_INTER,SXC_EXIT, SXC_CLASS和SXC_ATTR?這四個表中,ST05來監控一個TCODE來跟蹤,然后選擇查找有關上述幾個表和視圖的操作,就可獲得相關BADI。
2、可以通過一個程序取查找某些t-code會使用到哪些增強和出口的,在本博客的另外一個文章(分享一個查找t-code和程序的出口)可以看到。當然這個找到某些BADI增強之后,或許還是要通過設置斷點或者是方法1去確定那個才是最終的方案。
3、SE24查看CL_EXITHANDLER類的GET_INSTANCE方法,在 “CALL METHOD ?cl_exithandler=>get_class_name_by_interface”設置斷點,運行事務,DEBUG查看EXIT_NAME的值。
4、一個通過SE38在程序中搜索關鍵字CL_EXITHANDLER,查找程序使用BADI的方法。
http://blog.csdn.net/wbin9752/article/details/7951390
? ? ? 然后對這些BADI建立了相應的IMP之后,當你運行這些標準的t-code之后就會跳入這些IMP里面的method,實現增強。
本文章講述的是本人在初次接觸BADI的一個學習和了解的過程,并不去講述如何去創建這個BADI(這個網上也有很多),主要是為了幫助初學者如何去理解和簡單實用BADI。
首先講到的是BADI的層次概念:
BADI: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? UDM_BASIS_RULE
BADI interface: ? ? ? ? ? ? ? IF_EX_UDM_BASIS_RULE ?
badi interface class: ? ? ? ?CL_EX_UDM_BASIS_RULE
IMP: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ZUDM_BR00000003 ? ? ?
IMP class: ? ? ? ? ? ? ? ? ? ? ? ZCL_IM_UDM_BR00000003
1、BADI ? ? ? ? ? ? ? ? ?SE18進入之后:
輸入BADI的名稱之后進入的就是這個BADI的內容界面,里面有interface,interface怎么理解呢,其實就好比是這個BADI的一個框架,定義好這個BADI有哪些接口(method)
但是這個interface的接口具體有哪些輸入輸出變量或者是功能代碼是怎樣的就通過interface class實現: ?SE24輸入interface class的名稱(通常interface的class的名稱都是把interface名稱的前面的IF改成CL即可)
這個interface的class有了之后,就可以在程序里面實現增強了,怎么實現:
DATA: ? ?IT_BADI ? ??TYPE?REF?TO ??IF_EX_UDM_BASIS_RULE. ? ? ? ?(這里需要指向這個interface)
call?method?cl_exithandler=>get_instance ? ? ? ? ? ? ? ? ? ? ? (此函數是必須要有的,只要是要call ?BADI里面的method,都需要這個method)
?????changing
????????instance?=?IT_BADI.
CALL?METHOD?IT_BADI->EVALUATE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(然后這里就直接調用里面的method了)
???EXPORTING
?????I_LOG?=?IT_LOG
?????IT_SELECT_OPTIONS??=?IT_SE
?????I_BUSINESS_PARTNER?=?IT_BUSSINESS
?????FLT_VAL?=?IT_FLT_VAL.
這些都是標準的,那我可不可以不創建BADI,然后我需要的只是這個interface而已,我自己創建一個class然后
在interface的欄目下輸入參考的interface,然后再method里面就有了!然后具體的使用方法也和上面的一樣,先定義一個interface變量,然后就call ?method就行了。
2、BADI的imp和imp class
已經知道BADI,去創建BADI的imp和imp class : ? ?SE19進入,然后創建
創建之后,里面可以自動帶出BADI的interface到imp里面,并且會自動創建imp class:
創建好了imp和imp class之后怎么在程序里面實現增強呢:
?DATA: ? ? ?IT_BADI?TYPE?REF?TO?ZCL_IM_UDM_BR00000003. ? ??(這里需要指向這個imp class)
call?method?cl_exithandler=>get_instance
?????changing
????????instance?=?IT_BADI.
CALL?METHOD?IT_BADI->IF_EX_UDM_BASIS_RULE~EVALUATE ? ? ? ? ? ? ? ? (注意這里的method是這個,而不是直接的EVALUATE)
???EXPORTING
?????I_LOG?=?IT_LOG
?????IT_SELECT_OPTIONS??=?IT_SE
?????I_BUSINESS_PARTNER?=?IT_BUSSINESS
?????FLT_VAL?=?IT_FLT_VAL.
以上就是正常順序的創建BADI增強的,如果我們在程序中看到有call method,我們也可以通過這里去查找interface,BADI,等:
我們雙擊method的名字,可以查看到這個interface:
然后通過interface的名字去表SXS_INTER取查找對應的BADI,如果表里面沒有的話,就可以到SE24里面查找interface對應的class,說明這個interface沒有對應的BADI,是直接通過class來實現的。
如果知道了BADI IMP class,則可以通過SE24去反過來查找BADI 和BADI imp
以上就是剛接觸BADI時的個人理解,如有錯,歡迎指出,本人也會不斷的學習然后去更新文章!謝謝!
總結
以上是生活随笔為你收集整理的BADI的层次分析以及BADI里面的每个块的理解 看完你就懂!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【操作系统】实时调度
- 下一篇: 金蝶k3服务器维护,金蝶k3问题处理-完