一般在屏幕中制作了table control要做以下动作:
既然要使用table control当然要用到内表,所以首先要在主程序中声明control和内表.
完了要设置control的lines属性,这个一般是根据内表的最大行来确定
对于屏幕逻辑流:
PBO中要loop control, 用一个module去将内表数据逐行填充的table control的显示区域里面
PAI中也要loop control,此时用一个module去将内表数据进行更新
废话不多说,以下我开发一个程序用来显示航班信息:
主程序:
*====================================================================
*&---------------------------------------------------------------------*
*& Report ztest_pillar *
*&---------------------------------------------------------------------*
REPORT ztest_pillar.
*Data declaration------------------------------------------------------*
TABLES: demo_conn, spfli.
DATA itab TYPE STANDARD TABLE OF demo_conn.
DATA fill TYPE i."定义一个变量来存储内表的行数
DATA ok_save TYPE sy-ucomm.
DATA ok_code TYPE sy-ucomm.
DATA limit TYPE i."该变量用来控制跳行
CONTROLS tc_sflight TYPE TABLEVIEW USING SCREEN 100."定义table control容器
*Event block-----------------------------------------------------------*
*start-of-selection event
start-of-selection.
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE itab."得到内表数据
CALL SCREEN 100.
*Modules block---------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
DESCRIBE TABLE itab LINES fill."取得内表行数
tc_sflight-lines = fill."设置table control的top_line最大值的
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module CANCEL INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE cancel INPUT.
LEAVE PROGRAM.
ENDMODULE. " CANCEL INPUT
*&---------------------------------------------------------------------*
*& Module FILL_TC OUTPUT
*&---------------------------------------------------------------------*
* 将内表数据逐行读到table control中去
*----------------------------------------------------------------------*
MODULE fill_tc OUTPUT.
READ TABLE itab INTO demo_conn INDEX tc_sflight-current_line.
ENDMODULE. " FILL_TC OUTPUT
*&---------------------------------------------------------------------*
*& Module UPDATE_TC INPUT
*&---------------------------------------------------------------------*
* 更新table control记录
*----------------------------------------------------------------------*
MODULE update_tc INPUT.
MODIFY itab FROM demo_conn INDEX tc_sflight-current_line.
ok_save = ok_code.
CLEAR ok_code.
CASE ok_save.
*将头行上移
WHEN 'PREV_LINE'.
tc_sflight-top_line = tc_sflight-top_line - 1.
IF tc_sflight-top_line < 1.
tc_sflight-top_line = 1.
ENDIF.
*显示前一页数据
WHEN 'PREV_PAGE'.
tc_sflight-top_line = tc_sflight-top_line - sy-loopc.
IF tc_sflight-top_line < 1.
tc_sflight-top_line = 1.
ENDIF.
*显示首页数据
WHEN 'FIRST_PAGE'.
tc_sflight-top_line = 1.
*将投行下移一行
WHEN 'NEXT_LINE'.
tc_sflight-top_line = tc_sflight-top_line + 1.
IF tc_sflight-top_line > fill.
tc_sflight-top_line = fill.
ENDIF.
*显示后一页数据
WHEN 'NEXT_PAGE'.
tc_sflight-top_line = tc_sflight-top_line + sy-loopc.
IF tc_sflight-top_line > fill.
tc_sflight-top_line = fill.
ENDIF.
*显示最后一页数据
WHEN 'LAST_PAGE'.
tc_sflight-top_line = fill.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " UPDATE_TC INPUT
*==================================================================================
屏幕逻辑流
*==================================================================================
PROCESS BEFORE OUTPUT.
MODULE status_0100.
LOOP WITH CONTROL tc_sflight.
MODULE fill_tc.
ENDLOOP.
PROCESS AFTER INPUT.
MODULE cancel AT EXIT-COMMAND.
LOOP WITH CONTROL tc_sflight.
MODULE update_tc.
ENDLOOP.