ABAP_自定义屏幕08—选项卡控件
1、选项卡示例
如MM03中查看物料主数据的标签页(即本文的选项卡)
2、选项卡控件组成
选项卡控件包括:选项卡按钮、子屏幕区域(区域中包含子屏幕)
选项卡控件都放在主屏幕中,以下是一个包含选项卡控件的程序的完整组成图
3、两种实现方式
当多个选项卡控件(标签页)时,有下面两种实现方式
3.1 N个标签页 => (n个)子屏幕区域
3.1 N个标签页 => (同一个)子屏幕区域
关键点:是否有共用同一个子屏幕区域
4、单独子屏幕区域-非向导(不常用)
3.41 创建主屏幕
以下是初始代码
REPORT zcsdn_lion_custom081.
DATA ok_code LIKE sy-ucomm.
DATA my_code LIKE sy-ucomm.
START-OF-SELECTION.
CALL SCREEN '2000'.
*----------- 绑定工具栏、标题------------------------*
MODULE status_2000 OUTPUT.
SET PF-STATUS 'TOOLS'.
SET TITLEBAR 'TITLE'.
ENDMODULE. " STATUS_2000 OUTPUT
*------ PAI ------------*
MODULE user_command_2000 INPUT.
my_code = ok_code.
CLEAR ok_code.
CASE my_code.
WHEN '&BACK' OR '&EXIT'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE. " USER_COMMAND_2000 INPUT
不要忘了主屏幕的OK_CODE
3.42 创建主屏幕的选项卡
3.43 选项卡设置
每个选项卡控件(标签页)都按上面设置
当功能型=空,每个TAB的功能代码必须相同(否则点击tab页不会跳转)
当选项卡控件都没有红色才表示属性完善,否则继续完善属性,直到无红色
3.44 新增子屏幕
几个tab就有几个子屏幕
3.45 将子屏幕加载到子屏幕区域
在主屏幕的PBO中添加下面的代码
PROCESS BEFORE OUTPUT.
MODULE STATUS_2000.
*&--------------------------------------------*
*& 子屏幕加载到子屏幕区域
*&--------------------------------------------*
* TAB1_REF1:子屏幕区域1.
* TAB2_REF1:子屏幕区域2.
* SY-REPID:当前程序
*----------------------------------------------*
CALL SUBSCREEN TAB1_REF1 INCLUDING SY-REPID '2001'.
CALL SUBSCREEN TAB2_REF1 INCLUDING SY-REPID '2002'.
3.46 运行结果
3.47 补充说明
3.471、取消折叠效果
如不需右上角的折叠效果,tab功能型=P + 功能代码命名不要一样(上面设置的功能代码都是一样的=&TAB1)
功能型=P:表示不触发主屏幕的PAI
如设置功能型=P后,还有折叠效果,请尝试把选项卡控件长宽高往大设置
3.472 子屏幕触发事件
如需触发子屏幕的事件,需做两点
1、在子屏幕的PAI添加以下代码
PROCESS AFTER INPUT.
MODULE USER_COMMAND_2001.
2、在主屏幕PAI调用该子屏幕区域
PROCESS AFTER INPUT.
MODULE USER_COMMAND_2000.
CALL SUBSCREEN TAB1_REF1.
5、共用子屏幕区域-非向导(不常用)
按上面设置,区别有以下两点
5.1 设置TAB共享子屏幕
TAB2没有单独子屏幕区域,和TAB1共用同一个子屏幕区域:TAB1_REF1
5.2 每个TAB的功能型=空
5.3 在主屏幕PBO、PAI调用共用子屏幕区域
新增代码就是此次加入的代码
PROCESS BEFORE OUTPUT.
MODULE STATUS_2000.
* 新增代码,SYNNR_NUM:子屏幕变量,需在主程序中定义.
CALL SUBSCREEN TAB1_REF1 INCLUDING SY-REPID SYNNR_NUM.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_2000.
*新增代码
CALL SUBSCREEN TAB1_REF1 .
5.4 在主屏幕PAI的Medule中添加代码
*此变量在主程序开始定义
DATA synnr_num LIKE sy-dynnr VALUE '2001'.
*这是主屏幕2000PAI的Medule
MODULE user_command_2000 INPUT.
my_code = ok_code.
CLEAR ok_code.
CASE my_code.
WHEN '&BACK' OR '&EXIT'.
LEAVE TO SCREEN 0.
*---- 新增代码 Start----
WHEN '&TAB1'.
synnr_num = '2001'.
tab_main-activetab = my_code.
WHEN '&TAB2'.
synnr_num = '2002'.
tab_main-activetab = my_code.
*---- 新增代码 ENd----
ENDCASE.
5.5 运行效果
6、向导方式创建-常用
1、新增主屏幕2000,选中向导式子屏幕
此时主程序已自动生成相关代码
在主程序中添加代码
CALL SCREEN '2000'.
运行效果
6.1 主程序生成代码
REPORT ZCSDN_LION_CUSTOM083.
*&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'TAB_MAIN'
CONSTANTS: BEGIN OF C_TAB_MAIN,
TAB1 LIKE SY-UCOMM VALUE 'TAB1',
TAB2 LIKE SY-UCOMM VALUE 'TAB2',
TAB3 LIKE SY-UCOMM VALUE 'TAB3',
END OF C_TAB_MAIN.
*&SPWIZARD: DATA FOR TABSTRIP 'TAB_MAIN'
CONTROLS: TAB_MAIN TYPE TABSTRIP.
DATA: BEGIN OF G_TAB_MAIN,
SUBSCREEN LIKE SY-DYNNR,
PROG LIKE SY-REPID VALUE 'ZCSDN_LION_CUSTOM083',
PRESSED_TAB LIKE SY-UCOMM VALUE C_TAB_MAIN-TAB1,
END OF G_TAB_MAIN.
DATA: OK_CODE LIKE SY-UCOMM.
*------ 这是我添加的 ----------
CALL SCREEN '2000'.
*&SPWIZARD: OUTPUT MODULE FOR TS 'TAB_MAIN'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: SETS ACTIVE TAB
MODULE TAB_MAIN_ACTIVE_TAB_SET OUTPUT.
TAB_MAIN-ACTIVETAB = G_TAB_MAIN-PRESSED_TAB.
CASE G_TAB_MAIN-PRESSED_TAB.
WHEN C_TAB_MAIN-TAB1.
G_TAB_MAIN-SUBSCREEN = '2001'.
WHEN C_TAB_MAIN-TAB2.
G_TAB_MAIN-SUBSCREEN = '2002'.
WHEN C_TAB_MAIN-TAB3.
G_TAB_MAIN-SUBSCREEN = '2003'.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TS 'TAB_MAIN'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GETS ACTIVE TAB
MODULE TAB_MAIN_ACTIVE_TAB_GET INPUT.
OK_CODE = SY-UCOMM.
CASE OK_CODE.
WHEN C_TAB_MAIN-TAB1.
G_TAB_MAIN-PRESSED_TAB = C_TAB_MAIN-TAB1.
WHEN C_TAB_MAIN-TAB2.
G_TAB_MAIN-PRESSED_TAB = C_TAB_MAIN-TAB2.
WHEN C_TAB_MAIN-TAB3.
G_TAB_MAIN-PRESSED_TAB = C_TAB_MAIN-TAB3.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE.
7、补充说明
7.1 尽量使用第6点向导方式创建
7.2 如需触发子屏幕的事件,需做两点
1、在子屏幕的PAI添加以下代码
PROCESS AFTER INPUT.
MODULE USER_COMMAND_2001.
2、在主屏幕PAI调用该子屏幕区域
PROCESS AFTER INPUT.
MODULE USER_COMMAND_2000.
CALL SUBSCREEN TAB1_REF1.