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.