• 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.
     
  • 相关阅读:
    python之----------字符编码具体原理
    python ---------函数
    python爬虫
    python str 与repr区别
    python 正则表达式
    python 正则表达式里使用 split()方法
    python 基础介绍
    python 数据类型--列表
    python 字符串操作
    django(1.6)操作自带的数据库
  • 原文地址:https://www.cnblogs.com/JackeyLove/p/13576291.html
Copyright © 2020-2023  润新知