最终效果
第三代增强-经典BADI
创建运行程序
屏幕——0100
逻辑流:
代码如下:
PROCESS BEFORE OUTPUT.
MODULE status_0100.
CALL SUBSCREEN sub_area INCLUDING program dynpro.
PROCESS AFTER INPUT.
CALL SUBSCREEN sub_area.
MODULE user_command_0100.
如图所示拉取三个控件,创建如图所示布局。
上述操作完成后, 保存并激活屏幕,返回元素列表,生成如下内容。
屏幕——0101
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.
SET PF-STATUS '100'.
IF ref_badi_interface IS INITIAL.
DATA: act_imp_existing .
"获取 BADI 的实现 Generated Exit Class
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.
IF act_imp_existing <> 'X'.
MESSAGE 'BADI实现没有被激活' TYPE 'I'.
"EXIT.
ENDIF.
CALL METHOD cl_exithandler=>set_instance_for_subscreens
EXPORTING
instance = ref_badi_interface.
"获取BADI实现中所配置的增强子屏幕信息
CALL METHOD cl_exithandler=>get_prog_and_dynp_for_subscr
EXPORTING
exit_name = 'ZBADI_DEFINED' "BADI 出口名,即BADI定义名
calling_dynpro = '0100' "主调屏幕号
calling_program = 'ZRP_BADITEST' "主调屏幕所属程序
subscreen_area = 'SUB_AREA' "主调屏幕中的增强子屏幕区域名
IMPORTING
called_dynpro = dynpro "增强子屏幕号
called_program = program. "增强子屏幕所属程序
ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
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
"就会指向一个代理实现类,调用不会抛异常,但只是个空的方法,什么作用
"也不会有
CALL METHOD ref_badi_interface->hello.
WHEN 'LEAVE'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
创建BADI
BADI定义
se18 --> 实用程序 --> 创建典型业务加载项 --> 输入增强名称
取消勾选 ‘多次使用’,展示功能码,子屏幕俩页签。
接口定义
BADI实现
1.实现BADI定义可以在 定义页面 实施 -> 创建 -> 输入BADI实现名称。
2.也可以在 se19通过事务码创建。
具体效果
当BADI实施未激活时,增强内容消失。
参照大佬写的博文,增加了一点点小细节,这是原文地址:https://www.cnblogs.com/jiangzhengjun/p/4265513.html