创建经典BADI

实施BADI

创建屏幕

绘制屏幕

定义GUI

运行结果

程序代码
*&---------------------------------------------------------------------*
*& Report ZRP_BADITEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZRP_BADITEST.
DATA: OK_CODE LIKE SY-UCOMM.
DATA: PROGRAM TYPE PROGRAM,
DYNPRO TYPE DYNNR.
DATA: REF_BADI_INTERFACE TYPE REF TO ZIF_EX_BADI_DEFINED.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
DATA ACT_IMP_EXISTING.
SET PF-STATUS '100'.
* SET TITLEBAR 'xxx'.
IF REF_BADI_INTERFACE IS INITIAL.
CALL METHOD CL_EXITHANDLER=>GET_INSTANCE
EXPORTING
EXIT_NAME = 'ZBADI_DEFINED'
"如果未找到BADI实现或有实现但未激活时,ref_badi_interface是否可以接受NULL(即 INITIAL)
"一般设置为空,在为空时,如果未实现或未激活时,还是会返回一个代理实现,这样后面程序运行不
"会出错,否则设置为X时,在未实现或未激活时,ref_badi_interface不会有值,则如果通过它调用
"方法时,会抛异常
NULL_INSTANCE_ACCEPTED = ' '
IMPORTING
ACT_IMP_EXISTING = ACT_IMP_EXISTING "实现是否已激活
CHANGING
INSTANCE = REF_BADI_INTERFACE.
ENDIF.
IF ACT_IMP_EXISTING <> 'X'.
MESSAGE 'BADI实现没有被激活' TYPE 'I'.
"EXIT.
ENDIF.
CALL METHOD CL_EXITHANDLER=>GET_PROG_AND_DYNP_FOR_SUBSCR
EXPORTING
EXIT_NAME = 'ZBADI_DEFINED' "BADI 出口名,即BADI定义名
CALLING_DYNPRO = '0100'"主调屏幕号
CALLING_PROGRAM = 'ZRP_BADITEST' "主调屏幕所属程序
* FLT_VAL =
SUBSCREEN_AREA = 'SUB_SCREEN'"主调屏幕中的增强子屏幕区域名
IMPORTING
CALLED_DYNPRO = DYNPRO
CALLED_PROGRAM = PROGRAM.
WRITE:''.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
CASE OK_CODE.
WHEN 'FC1'.
MESSAGE '普通菜单' TYPE 'I'.
"只要BADI实现激活后,才会出现菜单,即可以点击,才可能走这里的逻辑
WHEN '+BADI'.
MESSAGE '增强菜单' TYPE 'I'.
WHEN 'BUT1'.
"如果BADI未实现或实现但未激活时,只要 cl_exithandler=>get_instance
"时,设置输入参数 null_instance_accepted = ' ',ref_badi_interface
"就会指向一个代理实现类,调用不会抛异常,但只是个空的方法,什么作用
"也不会有
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT