屏幕页签:项目上有一需求,对标准TCODE 一个屏幕增加一个页签。于是做了个例子。
下面屏幕有两个页签。
我们来看一下屏幕结构。100屏幕是主屏幕,101,102是子屏幕,对应页签test1,test2.
看一下屏幕属性
100屏幕:
101屏幕和102屏幕属性相同:
看一下屏幕制作器:区域1 是两个push button; 区域2是tab控件的子区域,用来加载子屏幕的。
看下element list:1.TAB100是tab控件;2.TAB100_TAB1 和 TAB100_TAB2 是两个PUSH button;3.TAB100_SCA 是子区域。
打开屏幕制作器:双击test2,如下图
接下来看看100屏幕的PBO.
PROCESS BEFORE OUTPUT. *&SPWIZARD: PBO FLOW LOGIC FOR TABSTRIP 'TAB100' MODULE TAB100_ACTIVE_TAB_SET. CALL SUBSCREEN TAB100_SCA INCLUDING G_TAB100-PROG G_TAB100-SUBSCREEN.
MODULE TAB100_ACTIVE_TAB_SET.如下
c_tab100 是一个静态的工作区,用来存储两个按钮的 指令code.
tab100是tab控件。
g_tab100控制页签切换的对象。
看一下100屏幕PAI
PROCESS AFTER INPUT. *MODULE exit AT EXIT-COMMAND. *&SPWIZARD: PAI FLOW LOGIC FOR TABSTRIP 'TAB100' CALL SUBSCREEN TAB100_SCA. MODULE TAB100_ACTIVE_TAB_GET. * MODULE USER_COMMAND_0100.
MODULE TAB100_ACTIVE_TAB_GET.如下:
当点击test1的时候,
sy-ucomm = 'TAB100_FC1'
g_tab100-pressed_tab = 'TAB100_FC1'.
此操作会触发100屏幕PBO.即调用 MODULE tab100_active_tab_set OUTPUT.
此时 g_tab100-subscreen = ‘101’
然后执行 CALL SUBSCREEN TAB100_SCA
INCLUDING G_TAB100-PROG G_TAB100-SUBSCREEN.
加载101子屏幕到tab控件的 子屏幕区域。进而显示101屏幕。
接下来我们添加一个新的页签
打开屏幕制作器,编辑模式。
添加一个push buton 控件,name: TAB100_TAB3. text: test3
双击test3,填写如下信息。并激活屏幕。
修改代码如下:并激活。
*&SPWIZARD: FUNCTION CODES FOR TABSTRIP 'TAB100' CONSTANTS: BEGIN OF c_tab100, tab1 LIKE sy-ucomm VALUE 'TAB100_FC1', tab2 LIKE sy-ucomm VALUE 'TAB100_FC2', tab3 LIKE sy-ucomm VALUE 'TAB100_FC3', “ADD END OF c_tab100.
MODULE tab100_active_tab_set OUTPUT.
tab100-activetab = g_tab100-pressed_tab.
CASE g_tab100-pressed_tab.
WHEN c_tab100-tab1.
g_tab100-subscreen = '0101'.
WHEN c_tab100-tab2.
g_tab100-subscreen = '0102'.
WHEN c_tab100-tab3.
g_tab100-subscreen = '0103'."ADD
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE.
MODULE tab100_active_tab_get INPUT.
ok_code = sy-ucomm.
CASE ok_code.
WHEN c_tab100-tab1.
g_tab100-pressed_tab = c_tab100-tab1.
WHEN c_tab100-tab2.
g_tab100-pressed_tab = c_tab100-tab2.
WHEN c_tab100-tab3.
g_tab100-pressed_tab = c_tab100-tab3.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE.
创建子屏幕 103,同101和102,并激活。
自此,页签添加完成,你可以在103屏幕上添加其他控件。
接下来最重要的是给新增的页签 传递参数。假设,页签1,页签2 已经有对应的一个结构,
页签1,页签2上显示的是结构中的数据值。如下:
其对应的结构为:
在主程序中给结构赋值:
现在要把第三个页签中对应的结构,添加到ZJW_LABLE 结构中。
se11修改zjw_lable.
点击Append Structure
输入名字,点击对号。
输入组件,并激活
此时 zjw_lable 如下。
主程序添加如下代码
页签三对应的子屏幕如下
注意:每个控件的名字,要和主程序中的结构-字段名对应,才可以传值。而且必须大写。
看看效果
现在我们发现页签3中的text文本框是可以输入的。如果我们想控制其不允许修改。则做如下操作:
看看效果:
继续添加需求:当满足条件时,页签显示,否则不显示。
添加全局变量G_FLAG. 添加控制条件。
在主屏幕 100的PBO中添加控制代码:
当 G_FLAG <> ‘X’ 的时候,不激活页签。我们手动清空一下g_flag 看下效果:
页签3消失。
设置LIST BOX 下拉框。
se11 设置域,激活保存
修改101 子屏幕LWA_LABLE-LABEL_3 属性为 List box.
添加module。
MODULE fill_carrid OUTPUT. * Do not use this process (but it works) TYPE-POOLS vrm. DATA lit_values TYPE vrm_values. DATA: l_return TYPE sy-subrc, lit_dom TYPE STANDARD TABLE OF dd07v. IF lit_dom IS INITIAL. CALL FUNCTION 'DD_DOMVALUES_GET' EXPORTING domname = 'ZJW_001' text = 'X' langu = sy-langu IMPORTING rc = l_return TABLES dd07v_tab = lit_dom EXCEPTIONS wrong_textflag = 1 OTHERS = 2. 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. LOOP AT lit_dom INTO DATA(lwa_dom). APPEND INITIAL LINE TO lit_values ASSIGNING FIELD-SYMBOL(<lfs_value>). <lfs_value> = VALUE #( key = lwa_dom-domvalue_l text = lwa_dom-ddtext ). ENDLOOP. CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'LWA_LABLE-LABEL_3' values = lit_values EXCEPTIONS id_illegal_name = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDMODULE. " FILL_CARRID OUTPUT
101 子屏幕PBO调用。
看看效果。
给屏幕输入加搜索帮助。
代码如下
MODULE value_label INPUT. DATA: fields LIKE TABLE OF help_value WITH HEADER LINE, select_value TYPE string . DATA: BEGIN OF valuetab OCCURS 0, VALUE(40), END OF valuetab. CLEAR: valuetab, valuetab[], fields[], fields. fields-tabname = 'ZJW_LABLE'. fields-fieldname = 'LABEL_3'. fields-selectflag = 'X'. APPEND fields. IF lit_dom IS INITIAL. CALL FUNCTION 'DD_DOMVALUES_GET' EXPORTING domname = 'ZJW_001' text = 'X' langu = sy-langu IMPORTING rc = l_return TABLES dd07v_tab = lit_dom EXCEPTIONS wrong_textflag = 1 OTHERS = 2. 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. LOOP AT lit_dom INTO lwa_dom. valuetab-value = lwa_dom-ddtext. APPEND valuetab. ENDLOOP. CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE' IMPORTING select_value = select_value "选中的值 TABLES fields = fields "显示的列 valuetab = valuetab "每列的数据 EXCEPTIONS field_not_in_ddic = 1 more_then_one_selectfield = 2 no_selectfield = 3 OTHERS = 4. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. lwa_lable-label_3 = select_value. ENDIF. ENDMODULE.