MIRO屏幕增强和SAP标准GUI状态中增加按钮

业务要求在MIRO增强一个页签,但笔者的sap版本偏老无法实现该功能(能力有限),被逼无奈只能退而求其次,将需求改为加一个按钮跳转到alv屏幕来维护相关数据。

下面我将一步一步讲述实现过程(做一个记录):

首先笔者想着在MIRO抬头增强一个按钮来跳转到维护界面

网上查询后发现增强点BADI_FDCB_SUBBAS04可实现(多谢大姑们的分享),第一个问题是该BADI只能实例化一次,先去SXC_EXIT 查询该BADI的实例化

 (发现有一个实例,其实相关增强点有01-06六个,本应找一个没有实例的BADI如BADI_FDCB_SUBBAS06,但网上分享大多为04,笔者此业务后续(业务要求)并无用到此BADI故并未深究,笔者在此完整说明,望读者注意)

SE19查看实施FPIA_APP_FU_MM,发现处于激活状态,我们必须先将其取消激活(望慎重,但笔者取消激活确实并无异常)

下面就该SE19创建实例了

 

 实现代码可以参考示例实施类的代码。

 已调用程序是 function 的主程序SAPLZFG_MIRO, 屏幕是增强的屏幕

 创建函数组ZFG_MIRO(主程序即为上面的SAPLZFG_MIRO)

 相关代码:(开始测试时的代码,加的是一个字段)

LZFG_MIROTOP:声明变量

FUNCTION-POOL zfg_miro.                     "MESSAGE-ID ..

* INCLUDE LZFG_MIROD...                      " Local class definition
TABLES:invfo.
TYPE-POOLS: vrm,slis,truxs.
DATA:o_badi_fdcb_subbas04 TYPE REF TO if_ex_badi_fdcb_subbas04.
CONSTANTS:exit_name_fdcbsubbas04 TYPE exit_def VALUE 'BADI_FDCB_SUBBASO4'.

LZFG_MIROI01:实现代码

*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  GET_INSTANCE  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE get_instance OUTPUT.

  IF o_badi_fdcb_subbas04 IS INITIAL.

    CALL METHOD cl_exithandler=>get_instance_for_subscreens
      CHANGING
        instance                      = o_badi_fdcb_subbas04
      EXCEPTIONS
        no_reference                  = 1
        no_interface_reference        = 2
        no_exit_interface             = 3
        data_incons_in_exit_managem   = 4
        class_not_implement_interface = 5
        OTHERS                        = 6.

    IF sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*     WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

  ENDIF.


* object created
  CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.


* get data from main screen
  CALL METHOD o_badi_fdcb_subbas04->get_data_from_screen_object
    IMPORTING
      ex_invfo = invfo.


ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  SCREEN_MODIFY  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE screen_modify OUTPUT.

  LOOP AT SCREEN.
    CASE sy-tcode.
      WHEN 'FB60' OR 'FB65' OR 'FB70' OR 'FB75'
         OR 'MIRO' OR 'MIRA' OR 'MIR7'.

        screen-input = 1.
      WHEN OTHERS.
        screen-input = 0.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  RECEIVE_ACTUAL_DATA  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE receive_actual_data INPUT.
* object created
  CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.

* get data from main screen
  CALL METHOD o_badi_fdcb_subbas04->get_data_from_screen_object
    IMPORTING
      ex_invfo = invfo.


ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  CASE sy-ucomm.
    WHEN 'CODE_BUT'.
      CALL SCREEN 1001 STARTING AT 20 1 ENDING AT 108 80.
  ENDCASE.
* object created
  CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.

* put data to main screen
  CALL METHOD o_badi_fdcb_subbas04->put_data_to_screen_object
    EXPORTING
      im_invfo = invfo.


ENDMODULE.

9000屏幕

PROCESS BEFORE OUTPUT.
* MODULE STATUS_9000.
  MODULE get_instance.
  MODULE screen_modify.
*
PROCESS AFTER INPUT.
* MODULE receive_actual_data.
*  FIELD:invfo-rebzg.

 MODULE USER_COMMAND_9000.

到这里MIRO增强一个(多个)字段就结束了

下面就是笔者需求发生变更后的记录(上述方法增强的字段或按钮在抬头基本信息下方,即会出现滚动条,故业务要求将按钮换个显眼且方便的地方)

 为满足业务需求,笔者开始尝试将按钮放到旁边的空白处(未能实现,技术有限毫无头绪)、放到状态栏处(两种方法,下文细说)

方法一做一个增强,用新的GUI Status 替换旧的 GUI Status。 

首先当前页面的屏幕和GUI状态

 把原程序中的GUI Status 拷贝过来,并增加我们需要的按钮。

 复制后加上我们需要的按钮

 下面做一个增强,用新的GUI Status 替换旧的 GUI Status。

 

 增强代码:

    DATA: status LIKE sy-pfkey,
          prog   LIKE sy-repid,
          excl_tab LIKE rsexfcode OCCURS 1.
    GET PF-STATUS status PROGRAM prog EXCLUDING excl_tab.
    IF status = '6000' AND prog = 'SAPLMR1M'.
      IF ydrseg[] IS INITIAL.
      ENDIF.
      SET PF-STATUS '6000' "EXCLUDING excl_tab
      OF PROGRAM 'SAPLZFG_MIRO'.
    ENDIF.

按钮有了,下面就是实现按钮

 

 代码如下()

  CASE ok-code.
    WHEN 'TAX'.
      PERFORM frm_button_tax IN PROGRAM SAPLZFG_MIRO CHANGING ydrseg sy-pfkey IF FOUND.
      CLEAR ok-code.
  ENDCASE.

如此就可实现将按钮增强在状态栏处,但随后有发现了一个大问题,那便是原GUI Status的部分按钮的文本是动态文本

 一时间笔者也没什么好办法(读者朋友有什么好方法还望告知一下笔者,感谢!)

那只能用方法二了,直接在原GUI Status上加按钮(改标准功能,风险未知仅作记录)

 向上图步骤走会报下图错误:

 我们需要先分配功能键

 

 加完功能键就可以将按钮加在应用程序工具栏了

加完后发现前台还是没显示,别急还有最后一步激活

 如此就完成了。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值