SAP增强:BADI

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:

image

New BADI:

 image

可以看到两种BADI的显示差别很大。实际上New BADI是属于SAP新发布的Enhancement Framework的,它的上层有一个Enhancement Spot的容器,一个Enhancement Spot下可以有多个New BADI。

Enhancement Spot是SAP新的Enhancement Framework的主要概念,其用于组织两种主要的增强技术,一种是BADI,另一种是直接的源代码增强。源代码增强在后续文章中介绍。