第三代增强(BADI)-经典Badi

本文详细介绍了如何在ABAP中创建和管理BADI增强,包括通过SE18创建BADI,使用SE19实施增强以及管理子屏幕和主程序的交互。重点展示了如何通过实例化BADI并设置GUI状态来实现不同功能码的操作。
摘要由CSDN通过智能技术生成

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

运行结果

菜单

在这里插入图片描述

增强子屏幕

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值