ABAP学习——第三代增强经典BADI创建小练习

最终效果

在这里插入图片描述

第三代增强-经典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

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值