业务要求在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上加按钮(改标准功能,风险未知仅作记录)
向上图步骤走会报下图错误:
我们需要先分配功能键
加完功能键就可以将按钮加在应用程序工具栏了
加完后发现前台还是没显示,别急还有最后一步激活
如此就完成了。