zoukankan      html  css  js  c++  java
  • ABAP学习(12):Table Control显示

    ABAP的Table Control

        Table Control是ABAP提供的内表显示控件,可以动态的显示操作内表数据。

    示例1:自动创建Table Control

        1、创建项目Z_TEST_TC;

        2、创建屏幕100,右键选择creat->Screen;

     

         3、输入描述,然后点击layout;

     

        4、拖动1:手动建立Table Tontrol;拖动2:自动建立Table Control,这里我们先自动创建。

     

           5、弹出Table Control的自动创建步骤,选择continue;

     

         6、输入Table Control名,点击Continue;

     

         7、选择是使用ABAP的Dictonary中table的数据结构还是我们当前Program自定义的内表结构,这里我们选择使用Dictornary的数据结构,SPFLI;

     

         8、选择要显示的列,选择好后点击Continue;

     

         9、设置Table Control是否可输入,还是只输出显示;

     

         10、选择是否有Scroll等功能,选择Dictionary,不可选择;

     

         11、设置完成,显示效果,选择保存,激活;

    屏幕100的Flow logic,自动生成代码:

    PROCESS BEFORE OUTPUT.
    *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBC_100'
      MODULE TBC_100_INIT.
    *&SPWIZARD: MODULE TBC_100_CHANGE_TC_ATTR.
    *&SPWIZARD: MODULE TBC_100_CHANGE_COL_ATTR.
      LOOP AT   G_TBC_100_ITAB
           INTO G_TBC_100_WA
           WITH CONTROL TBC_100
           CURSOR TBC_100-CURRENT_LINE.
    *&SPWIZARD:   MODULE TBC_100_CHANGE_FIELD_ATTR
        MODULE TBC_100_MOVE.
      ENDLOOP.
    
    * MODULE STATUS_0100.
    *
    PROCESS AFTER INPUT.
    *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBC_100'
      LOOP AT G_TBC_100_ITAB.
        CHAIN.
          FIELD SPFLI-CARRID.
          FIELD SPFLI-CONNID.
          FIELD SPFLI-COUNTRYFR.
          FIELD SPFLI-CITYFROM.
          FIELD SPFLI-AIRPFROM.
          FIELD SPFLI-COUNTRYTO.
          FIELD SPFLI-CITYTO.
          FIELD SPFLI-AIRPTO.
          FIELD SPFLI-FLTIME.
          MODULE TBC_100_MODIFY ON CHAIN-REQUEST.
        ENDCHAIN.
      ENDLOOP.
    
    *&SPWIZARD: MODULE TBC_100_CHANGE_TC_ATTR.
    *&SPWIZARD: MODULE TBC_100_CHANGE_COL_ATTR.
    * MODULE USER_COMMAND_0100.

    主程序Program,自动生成代码:

    REPORT Z_TEST_TC.
    
    ***&SPWIZARD: DATA DECLARATION FOR TABLECONTROL 'TBC_100'
    *&SPWIZARD: DEFINITION OF DDIC-TABLE
    TABLES:   SPFLI.
    *&SPWIZARD: TYPE FOR THE DATA OF TABLECONTROL 'TBC_100'
    TYPES: BEGIN OF T_TBC_100,
             CARRID LIKE SPFLI-CARRID,
             CONNID LIKE SPFLI-CONNID,
             COUNTRYFR LIKE SPFLI-COUNTRYFR,
             CITYFROM LIKE SPFLI-CITYFROM,
             AIRPFROM LIKE SPFLI-AIRPFROM,
             COUNTRYTO LIKE SPFLI-COUNTRYTO,
             CITYTO LIKE SPFLI-CITYTO,
             AIRPTO LIKE SPFLI-AIRPTO,
             FLTIME LIKE SPFLI-FLTIME,
           END OF T_TBC_100.
    *&SPWIZARD: INTERNAL TABLE FOR TABLECONTROL 'TBC_100'
    DATA:     G_TBC_100_ITAB   TYPE T_TBC_100 OCCURS 0,
              G_TBC_100_WA     TYPE T_TBC_100. "work area
    DATA:     G_TBC_100_COPIED.           "copy flag
    
    *&SPWIZARD: DECLARATION OF TABLECONTROL 'TBC_100' ITSELF
    CONTROLS: TBC_100 TYPE TABLEVIEW USING SCREEN 0100.
    *&SPWIZARD: OUTPUT MODULE FOR TC 'TBC_100'. DO NOT CHANGE THIS LINE!
    *&SPWIZARD: COPY DDIC-TABLE TO ITAB
    MODULE TBC_100_INIT OUTPUT.
      IF G_TBC_100_COPIED IS INITIAL.
    *&SPWIZARD: COPY DDIC-TABLE 'SPFLI'
    *&SPWIZARD: INTO INTERNAL TABLE 'g_TBC_100_itab'
        SELECT * FROM SPFLI
           INTO CORRESPONDING FIELDS
           OF TABLE G_TBC_100_ITAB.
        G_TBC_100_COPIED = 'X'.
        REFRESH CONTROL 'TBC_100' FROM SCREEN '0100'.
      ENDIF.
    ENDMODULE.
    
    *&SPWIZARD: OUTPUT MODULE FOR TC 'TBC_100'. DO NOT CHANGE THIS LINE!
    *&SPWIZARD: MOVE ITAB TO DYNPRO
    MODULE TBC_100_MOVE OUTPUT.
      MOVE-CORRESPONDING G_TBC_100_WA TO SPFLI.
    ENDMODULE.
    
    *&SPWIZARD: INPUT MODULE FOR TC 'TBC_100'. DO NOT CHANGE THIS LINE!
    *&SPWIZARD: MODIFY TABLE
    MODULE TBC_100_MODIFY INPUT.
      MOVE-CORRESPONDING SPFLI TO G_TBC_100_WA.
      MODIFY G_TBC_100_ITAB
        FROM G_TBC_100_WA
        INDEX TBC_100-CURRENT_LINE.
    ENDMODULE.

    在Controls:语句添加调用屏幕100就可以看到显示Table Control

    "调用屏幕
    CALL SCREEN 100.

    设置工具栏,PF-STATUS

    屏幕100,Flow logic解除MODUL STATUS_0100这行注释

    MODULE STATUS_0100.

    主程序逻辑:

    "设置工具栏
    MODULE STATUS_0100 OUTPUT.
      SET PF-STATUS 'STA_100'.
    ENDMODULE.

    设置用户操作功能

    屏幕100,Flow logic解除USER_COMMAND_0100这行注释

    MODULE USER_COMMAND_0100.

    主程序逻辑:

    MODULE USER_COMMAND_0100 INPUT.
      "点击退出
      CASE SY-UCOMM.
        WHEN 'EXIT'.
          LEAVE PROGRAM.
      ENDCASE.
    ENDMODULE.                 " USER_COMMAND_0100  INPUT

    示例2:选择Program自定义内表

        第7步选择Internal program table,设置Program中自定义的内表。这里我们就是使用主程序中的自定义内表t_spfli。

    主程序逻辑:

    *&---------------------------------------------------------------------*
    *&
    *&表格控制器(自动创建)
    *&---------------------------------------------------------------------*
    DATA: OK_CODE TYPE SY-UCOMM.
    "两种写法类似,OO中不能使用occurs
    DATA:t_spfli LIKE TABLE OF spfli WITH HEADER LINE.
    *DATA:t_spfli LIKE spfli OCCURS 0 WITH HEADER LINE.
    
    "查询数据
    SELECT * INTO CORRESPONDING FIELDS OF TABLE t_spfli FROM spfli.
    
    "调用屏幕
    CALL SCREEN 100.
    
    "设置工具栏
    MODULE STATUS_0100 OUTPUT.
      SET PF-STATUS 'STATUS_100'.
    ENDMODULE.
    
    *&---------------------------------------------------------------------*
    *&      Module  USER_COMMAND_0100  INPUT
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    MODULE USER_COMMAND_0100 INPUT.
      OK_CODE = SY-UCOMM.
      "点击退出
      CASE OK_CODE.
        WHEN 'CANCEL'.
          LEAVE PROGRAM.
      ENDCASE.
    ENDMODULE.                 " USER_COMMAND_0100  INPUT
    
    "定义的表格控制器TCL_100
    *&SPWIZARD: DECLARATION OF TABLECONTROL 'TCL_100' ITSELF
    CONTROLS: TCL_100 TYPE TABLEVIEW USING SCREEN 0100.
    
    "内表数据更新,更新显示表
    *&SPWIZARD: OUTPUT MODULE FOR TC 'TCL_100'. DO NOT CHANGE THIS LINE!
    *&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
    MODULE TCL_100_CHANGE_TC_ATTR OUTPUT.
      DESCRIBE TABLE T_SPFLI LINES TCL_100-lines.
    ENDMODULE.
    
    "显示表被编辑,将更新内表数据
    *&SPWIZARD: INPUT MODULE FOR TC 'TCL_100'. DO NOT CHANGE THIS LINE!
    *&SPWIZARD: MODIFY TABLE
    MODULE TCL_100_MODIFY INPUT.
      MODIFY T_SPFLI
        INDEX TCL_100-CURRENT_LINE.
    ENDMODULE.

    屏幕100的Flow logic程序逻辑:

    PROCESS BEFORE OUTPUT.
    *&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TCL_100'
      MODULE TCL_100_CHANGE_TC_ATTR.
    *&SPWIZARD: MODULE TCL_100_CHANGE_COL_ATTR. LOOP AT T_SPFLI WITH CONTROL TCL_100 CURSOR TCL_100-CURRENT_LINE. *&SPWIZARD: MODULE TCL_100_CHANGE_FIELD_ATTR ENDLOOP. MODULE STATUS_0100. PROCESS AFTER INPUT. *&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TCL_100' LOOP AT T_SPFLI. CHAIN. FIELD T_SPFLI-CARRID. FIELD T_SPFLI-CONNID. FIELD T_SPFLI-COUNTRYFR. FIELD T_SPFLI-CITYFROM. FIELD T_SPFLI-AIRPFROM. FIELD T_SPFLI-COUNTRYTO. FIELD T_SPFLI-CITYTO. FIELD T_SPFLI-AIRPTO. FIELD T_SPFLI-FLTIME. FIELD T_SPFLI-DEPTIME. FIELD T_SPFLI-ARRTIME. FIELD T_SPFLI-DISTANCE. FIELD T_SPFLI-DISTID. FIELD T_SPFLI-FLTYPE. FIELD T_SPFLI-PERIOD. MODULE TCL_100_MODIFY ON CHAIN-REQUEST. endchain. ENDLOOP. *&SPWIZARD: MODULE TCL_100_CHANGE_TC_ATTR. *&SPWIZARD: MODULE TCL_100_CHANGE_COL_ATTR. MODULE USER_COMMAND_0100.

    示例3:手动创建Table Control

     拖选Table Control控件,输入Table Control名,这里TBC;Separators:设置分割线;Line Sel:设置行选择,单行或多行;Column Sel:设置列选择,单列或多列;这里直接选择拖动第1个,创建Table Control。

     

     拖动2,设置列栏位,拖动1设置列名;

    屏幕100的Flow logic逻辑代码:

    PROCESS BEFORE OUTPUT.
      MODULE STATUS_0100.
      LOOP WITH CONTROL TBL1.
        MODULE FILLTAB.
      ENDLOOP.
    
    *
    PROCESS AFTER INPUT.
      MODULE USER_COMMAND_0100.
    
      LOOP WITH CONTROL TBL1.
        MODULE UPDATETAB.
      ENDLOOP.

    主程序逻辑代码:

    DATA: OK_CODE TYPE SY-UCOMM.
    "定义的表格控制器TBL1
    CONTROLS: TBL1 TYPE TABLEVIEW USING SCREEN 0100.
    "表格单元个控制
    DATA:WA_COLS LIKE LINE OF TBL1-COLS.
    
    "定义table显示的字段
    DATA:BEGIN OF t_spfli OCCURS 0 ,
       carrid LIKE spfli-CARRID,
       cityfrom LIKE spfli-cityfrom,
       cityto LIKE spfli-cityto,
       fltype LIKE spfli-fltype,
    END OF t_spfli.
    
    "屏幕的字段Name就是 WA_SPFLI-内表结构名
    DATA:wa_spfli LIKE LINE OF  t_spfli.
    "手动创建没有垂直下拉条,需要NUMS参数设置行数
    DATA:NUMS TYPE I.
    
    "查询数据
    SELECT * INTO CORRESPONDING FIELDS OF TABLE t_spfli FROM spfli.
    
    "调用屏幕
    CALL SCREEN 100.
    
    MODULE STATUS_0100 OUTPUT.
      SET PF-STATUS 'STATUS_100'.
      "设置垂直下拉条
      IF NUMS = 0.
        DESCRIBE TABLE t_spfli LINES NUMS.
        TBL1-LINES = NUMS.
      ENDIF.
    ENDMODULE.
    
    *&---------------------------------------------------------------------*
    *&      Module  USER_COMMAND_0100  INPUT
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    MODULE USER_COMMAND_0100 INPUT.
      OK_CODE = SY-UCOMM.
      "点击退出
      CASE OK_CODE.
        WHEN 'CANCEL'.
          LEAVE PROGRAM.
        WHEN 'NOW'.
          PERFORM current_line.
        WHEN 'EDIT'.
          PERFORM change_rw.
      ENDCASE.
    ENDMODULE.                 " USER_COMMAND_0100  INPUT
    
    *&---------------------------------------------------------------------*
    *&      Module  FILLTAB  OUTPUT
    *&---------------------------------------------------------------------*
    * 将内表数据填充到显示屏幕,屏幕显示之前执行module,
    *----------------------------------------------------------------------*
    MODULE FILLTAB OUTPUT.
      READ TABLE t_spfli INTO wa_spfli INDEX TBL1-CURRENT_LINE.
    ENDMODULE.                 " FILLTAB  OUTPUT
    
    *&---------------------------------------------------------------------*
    *&      Module  UPDATETAB  INPUT
    *&---------------------------------------------------------------------*
    *       将显示区域表更新到内表
    *----------------------------------------------------------------------*
    MODULE UPDATETAB INPUT.
      MODIFY t_spfli FROM wa_spfli INDEX TBL1-CURRENT_LINE.
    ENDMODULE.                 " UPDATETAB  INPUT
    
    *&---------------------------------------------------------------------*
    *&      Form  CURRENT_LINE
    *&---------------------------------------------------------------------*
    *       获取当前行
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM CURRENT_LINE .
      DATA:LINEA TYPE I.
      "获取鼠标所在行
      GET CURSOR LINE LINEA.
      CHECK SY-SUBRC = 0.
    *  LINEA = TBL1-TOP_LINE - 1.
      MESSAGE s006(ymess) WITH '当前行:' LINEA.
    ENDFORM.                    " CURRENT_LINE
    
    *&---------------------------------------------------------------------*
    *&      Form  CHANGE_RW
    *&---------------------------------------------------------------------*
    *     修改表的读写设置
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    FORM CHANGE_RW .
      "屏幕控制数据结构
      DATA:temp_screen LIKE WA_COLS-SCREEN.
      LOOP AT TBL1-COLS INTO WA_COLS.
        "SCREEN-INPUT:1能够输入,0不能输入
        "SCREEN-NAME:字段名
        IF WA_COLS-SCREEN-INPUT = '1'.
           WA_COLS-SCREEN-INPUT = '0'.
        ELSE.
          WA_COLS-SCREEN-INPUT = '1'.
        ENDIF.
    
        "将指定列隐藏
        "WA_COLS-INVISIBLE :X 为隐藏,0显示
    *    IF WA_COLS-SCREEN-NAME = 'WA_SPFLI-FLTYPE'.
    *      WA_COLS-INVISIBLE = 'X'.
    *    ENDIF.
    "通过设置可见长度设置列隐藏 IF WA_COLS-SCREEN-NAME = 'WA_SPFLI-FLTYPE'. "设置vislength为0,实现隐藏;要显示设置显示字段长度即可 WA_COLS-VISLENGTH = 0. ENDIF. MODIFY TBL1-COLS FROM WA_COLS INDEX SY-TABIX. ENDLOOP. ENDFORM. " CHANGE_RW

    4.设置隐藏PF-STATUS按钮

              设置隐藏PF-STATUS,只需要在设置PF-STATUS时,设置需要隐藏的fcode内表。这里隐藏SHOW这个Function code。

     

     实例代码:

    "设置status
    DATA:lt_exfcode TYPE TABLE OF sy-ucomm.
    "将要隐藏的Fcode加入内表
    APPEND 'SHOW' TO lt_exfcode.
    
    MODULE STATUS_0100 OUTPUT.
      "设置不显示Fcode
      SET PF-STATUS 'STATUS_100' EXCLUDING lt_exfcode.
      "设置垂直下拉条
      IF NUMS = 0.
        DESCRIBE TABLE t_spfli LINES NUMS.
        TBL1-LINES = NUMS.
      ENDIF.
    ENDMODULE.
  • 相关阅读:
    LocalDateTime和Date使用@JsonFormat显示毫秒时间
    curl查看ip的几种方式
    thinkphp5.1生成缩略图很模糊
    ajax发送时禁用按钮
    thinkphp5 不使用form,用input+ajax异步上传图片
    GOLANG 闭包和普通函数的区别
    GOLANG 匿名函数笔记
    父级自适应自己高度且高度完全一致css
    子元素等高 css
    ios 用jquery为元素标签绑定点击事件时,ios上不执行点击事件
  • 原文地址:https://www.cnblogs.com/tangToms/p/11978946.html
Copyright © 2011-2022 走看看