SAP 实例- 页签tabsrip

屏幕页签:项目上有一需求,对标准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.
 
原文地址:https://www.cnblogs.com/JackeyLove/p/13576291.html