文章目录
第三代增强(BADI)-经典Badi
一个增强实现(Enhancement Implementation)可以有多个BADI Implementations(相当于多个版本,每个BADI Implementations即与一个且仅一个实现类对应),但起作用的同时只能有一个,有多个版本时需要进行设置:
创建增强(BADI)- SE18
输入事务代码:SE18,输入BADI的名称,点击“实用程序”–“创建典型业务加载项”:
功能码(FCodes)
子屏幕(Subsreens)
实施增强 - SE19
可以直接通过菜单栏创建实施
,也可以通过事务代码SE19,我们现在通过事务代码去创建:
功能码
增强的子屏幕
修改增强的实施 - SE19
主程序
GUI状态
主调屏幕100
设置OK_CODE,并绘制子屏幕:
主程序代码
*&---------------------------------------------------------------------*
*& Report ZRP_BADITEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zrp_baditest.
DATA: ok_code LIKE sy-ucomm.
DATA: save_ok 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.
SET PF-STATUS '100'.
IF ref_badi_interface IS INITIAL.
DATA: act_imp_existing.
"获取badi的实现
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'.
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
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_ok = ok_code.
CASE save_ok.
WHEN 'FC1'.
MESSAGE '普通菜单' TYPE 'I'.
"只要BADI实现激活后,才会出现菜单,即可以点击,才可能走这里的逻辑
WHEN '+BADI'.
MESSAGE '增强菜单' TYPE 'I'.
WHEN 'EXBTN'.
CALL METHOD ref_badi_interface->hello.
WHEN 'BACK'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT