BADI是SAP主要的增强的方式之一,根据不同的阶段,目前BADI有两种:CLassic BADI 和 New BADI。两种BADI的基本原理差不多,但是具体的实现方式不同。
实现原理
BADI最基本的实现原理即利用接口(interface)的继承。在原程序中调用接口的方法,接口的方法没有代码,实现BADI时创建一个继承该接口的类,在类中实现方法。
但CLassic BADI 和 New BADI在实现有差别:
CLassic BADI
以BADI:IMRC_STATUS_CHECK为例,以下为SAP源代码:
DATA l_badi_imrc_status_check_ref TYPE REF TO if_ex_imrc_status_check.
DATA l_badi_imrc_status_check_act(1) TYPE c.
CONSTANTS l_badi_name TYPE exit_def VALUE 'IMRC_STATUS_CHECK'.
CALL METHOD cl_exithandler=>get_instance
EXPORTING
exit_name = l_badi_name
null_instance_accepted = 'X'
IMPORTING
act_imp_existing = l_badi_imrc_status_check_act
CHANGING
instance = l_badi_imrc_status_check_ref
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 l_badi_imrc_status_check_act = 'X'.
CALL METHOD l_badi_imrc_status_check_ref->check_imrg_status
EXPORTING
is_imrg = imrg
EXCEPTIONS
change_imrg_denied = 1.
ENDIF.
其中:if_ex_imrc_status_check是BADI中定义的接口名。
New BADI
以BADI:MP_TRANSFER_RELATION为例,以下为SAP源代码:
DATA badi_propose_relation TYPE REF TO mp_transfer_relation.
GET BADI badi_propose_relation.
IF badi_propose_relation IS BOUND.
CALL BADI badi_propose_relation->determine
EXPORTING
it_transfer_relation = lt_propose_temp
IMPORTING
et_transfer_relation = lt_propose_new.
ENDIF.
其中:mp_transfer_relation不是接口的名字,而直接是BADI的名字。
实现原理的应用
了解了BADI的源代码实现方式之后,就可以通过查找源代码的方式来查找BADI,或者在程序中根据语句(如CALL METHOD 、GET BADI 、CALL BADI )设置断点来查找一个业务操作具有的BADI.
CLassic BADI 和 New BADI的前台比较
通过SE18可以查看BADI:
CLassic BADI:
New BADI:
可以看到两种BADI的显示差别很大。实际上New BADI是属于SAP新发布的Enhancement Framework的,它的上层有一个Enhancement Spot的容器,一个Enhancement Spot下可以有多个New BADI。
Enhancement Spot是SAP新的Enhancement Framework的主要概念,其用于组织两种主要的增强技术,一种是BADI,另一种是直接的源代码增强。源代码增强在后续文章中介绍。