如果想在屏幕上显示一个表的内容,比如表 sflight 的内容。
第一步:创建一个screen 100,并在这个screen 100中使用向导创建一个Table Control,在创建的过程中
如果要求选择DDIC中的表,就选择sflight,然后选择要在屏幕上要显示的表中的字段。
最有在屏幕的效果为:
另外,该向导还能自动为你维护 flow logic,以及各个module的实现。通常我们将module的实现放在主程序中进行。
所以,屏幕的flow logic的内容如下为:
PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'SFLIGHTTAB'
MODULE SFLIGHTTAB_INIT.
*&SPWIZARD: MODULE SFLIGHTTAB_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE SFLIGHTTAB_CHANGE_COL_ATTR.
LOOP AT G_SFLIGHTTAB_ITAB
INTO G_SFLIGHTTAB_WA
WITH CONTROL SFLIGHTTAB
CURSOR SFLIGHTTAB-CURRENT_LINE.
*&SPWIZARD: MODULE SFLIGHTTAB_CHANGE_FIELD_ATTR
MODULE SFLIGHTTAB_MOVE.
MODULE SFLIGHTTAB_GET_LINES.
ENDLOOP.
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'SFLIGHTTAB'
LOOP AT G_SFLIGHTTAB_ITAB.
CHAIN.
FIELD SFLIGHT-CARRID.
FIELD SFLIGHT-CONNID.
FIELD SFLIGHT-FLDATE.
FIELD SFLIGHT-PRICE.
FIELD SFLIGHT-CURRENCY.
FIELD SFLIGHT-PLANETYPE.
FIELD SFLIGHT-SEATSMAX.
FIELD SFLIGHT-SEATSOCC.
FIELD SFLIGHT-PAYMENTSUM.
ENDCHAIN.
ENDLOOP.
MODULE SFLIGHTTAB_USER_COMMAND.
*&SPWIZARD: MODULE SFLIGHTTAB_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE SFLIGHTTAB_CHANGE_COL_ATTR.
主程序中自动生成的代码为:
REPORT ZTEST10.
tables: sflight.
*&SPWIZARD: TYPE FOR THE DATA OF TABLECONTROL 'SFLIGHTTAB'
TYPES: BEGINOFT_SFLIGHTTAB,
CARRID LIKE SFLIGHT-CARRID,
CONNID LIKE SFLIGHT-CONNID,
FLDATE LIKE SFLIGHT-FLDATE,
PRICE LIKE SFLIGHT-PRICE,
CURRENCY LIKE SFLIGHT-CURRENCY,
PLANETYPE LIKE SFLIGHT-PLANETYPE,
SEATSMAX LIKE SFLIGHT-SEATSMAX,
SEATSOCC LIKE SFLIGHT-SEATSOCC,
PAYMENTSUM LIKE SFLIGHT-PAYMENTSUM,
END OF T_SFLIGHTTAB.
*&SPWIZARD: INTERNAL TABLE FOR TABLECONTROL 'SFLIGHTTAB'
DATA: G_SFLIGHTTAB_ITAB TYPET_SFLIGHTTABOCCURS 0,
G_SFLIGHTTAB_WA TYPE T_SFLIGHTTAB."work area
DATA: G_SFLIGHTTAB_COPIED. "copy flag
*&SPWIZARD: DECLARATION OF TABLECONTROL 'SFLIGHTTAB' ITSELF
CONTROLS: SFLIGHTTAB TYPE TABLEVIEW USING SCREEN0100.
*&SPWIZARD: LINES OF TABLECONTROL 'SFLIGHTTAB'
DATA: G_SFLIGHTTAB_LINES LIKESY-LOOPC.
DATA: OK_CODE LIKE SY-UCOMM.
*&SPWIZARD: OUTPUT MODULE FOR TC 'SFLIGHTTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: COPY DDIC-TABLE TO ITAB
MODULE SFLIGHTTAB_INIT OUTPUT.
IF G_SFLIGHTTAB_COPIED IS INITIAL.
*&SPWIZARD: COPY DDIC-TABLE 'SFLIGHT'
*&SPWIZARD: INTO INTERNAL TABLE 'g_SFLIGHTTAB_itab'
SELECT * FROM SFLIGHT
INTO CORRESPONDING FIELDS
OF TABLE G_SFLIGHTTAB_ITAB.
G_SFLIGHTTAB_COPIED = 'X'.
REFRESH CONTROL 'SFLIGHTTAB'FROMSCREEN'0100'.
ENDIF.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'SFLIGHTTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MOVE ITAB TO DYNPRO
MODULE SFLIGHTTAB_MOVE OUTPUT.
MOVE-CORRESPONDING G_SFLIGHTTAB_WA TO SFLIGHT.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'SFLIGHTTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE SFLIGHTTAB_GET_LINES OUTPUT.
G_SFLIGHTTAB_LINES = SY-LOOPC.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TC 'SFLIGHTTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: PROCESS USER COMMAND
MODULE SFLIGHTTAB_USER_COMMAND INPUT.
OK_CODE = SY-UCOMM.
PERFORM USER_OK_TC USING 'SFLIGHTTAB'
'G_SFLIGHTTAB_ITAB'
'FLAG'
CHANGING OK_CODE.
SY-UCOMM = OK_CODE.
ENDMODULE.
*----------------------------------------------------------------------*
* INCLUDE TABLECONTROL_FORMS *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form USER_OK_TC *
*&---------------------------------------------------------------------*
FORM USER_OK_TC USING P_TC_NAMETYPEDYNFNAM
P_TABLE_NAME
P_MARK_NAME
CHANGING P_OK LIKE SY-UCOMM.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA: L_OK TYPE SY-UCOMM,
L_OFFSET TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
*&SPWIZARD: Table control specific operations *
*&SPWIZARD: evaluate TC name and operations *
SEARCH P_OK FOR P_TC_NAME.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
L_OFFSET = STRLEN(P_TC_NAME)+ 1.
L_OK = P_OK+L_OFFSET.
*&SPWIZARD: execute general and TC specific operations *
CASE L_OK.
WHEN 'INSR'. "insert row
PERFORM FCODE_INSERT_ROW USING P_TC_NAME
P_TABLE_NAME.
CLEAR P_OK.
WHEN 'DELE'. "delete row
PERFORM FCODE_DELETE_ROW USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME.
CLEAR P_OK.
WHEN 'P--' OR "top of list
'P-' OR "previous page
'P+' OR "next page
'P++'. "bottom of list
PERFORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
L_OK.
CLEAR P_OK.
* WHEN 'L--'. "total left
* PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.
*
* WHEN 'L-'. "column left
* PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.
*
* WHEN 'R+'. "column right
* PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.
*
* WHEN 'R++'. "total right
* PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.
*
WHEN 'MARK'. "mark all filled lines
PERFORM FCODE_TC_MARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
CLEAR P_OK.
WHEN 'DMRK'. "demark all filled lines
PERFORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
CLEAR P_OK.
* WHEN 'SASCEND' OR
* 'SDESCEND'. "sort column
* PERFORM FCODE_SORT_TC USING P_TC_NAME
* l_ok.
ENDCASE.
ENDFORM. " USER_OK_TC
*&---------------------------------------------------------------------*
*& Form FCODE_INSERT_ROW *
*&---------------------------------------------------------------------*
FORM fcode_insert_row
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_LINES_NAME LIKE FELD-NAME.
DATA L_SELLINE LIKE SY-STEPL.
DATA L_LASTLINE TYPE I.
DATA L_LINE TYPE I.
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE CXTAB_CONTROL.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <LINES> TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME)TO<TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME)TO<TABLE>. "not headerline
*&SPWIZARD: get looplines of TableControl *
CONCATENATE 'G_' P_TC_NAME'_LINES'INTOL_LINES_NAME.
ASSIGN (L_LINES_NAME)TO<LINES>.
*&SPWIZARD: get current line *
GET CURSOR LINEL_SELLINE.
IF SY-SUBRC <> 0. " append line to table
L_SELLINE = <TC>-LINES+1.
*&SPWIZARD: set top line *
IF L_SELLINE > <LINES>.
<TC>-TOP_LINE = L_SELLINE-<LINES> +1 .
ELSE.
<TC>-TOP_LINE = 1.
ENDIF.
ELSE. " insert line into table
L_SELLINE = <TC>-TOP_LINE + L_SELLINE-1.
L_LASTLINE = <TC>-TOP_LINE + <LINES>-1.
ENDIF.
*&SPWIZARD: set new cursor line *
L_LINE = L_SELLINE - <TC>-TOP_LINE +1.
*&SPWIZARD: insert initial line *
INSERT INITIAL LINEINTO<TABLE>INDEX L_SELLINE.
<TC>-LINES =<TC>-LINES+1.
*&SPWIZARD: set cursor *
SET CURSOR LINEL_LINE.
ENDFORM. " FCODE_INSERT_ROW
*&---------------------------------------------------------------------*
*& Form FCODE_DELETE_ROW *
*&---------------------------------------------------------------------*
FORM fcode_delete_row
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPEcxtab_control.
FIELD-SYMBOLS <TABLE> TYPESTANDARDTABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME)TO<TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME)TO<TABLE>. "not headerline
*&SPWIZARD: delete marked lines *
DESCRIBE TABLE <TABLE> LINES <TC>-LINES.
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAMEOFSTRUCTURE<WA> TO <MARK_FIELD>.
IF <MARK_FIELD> = 'X'.
DELETE <TABLE> INDEX SYST-TABIX.
IF SY-SUBRC = 0.
<TC>-LINES =<TC>-LINES-1.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " FCODE_DELETE_ROW
*&---------------------------------------------------------------------*
*& Form COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
* -->P_OK ok code
*----------------------------------------------------------------------*
FORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
P_OK.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TC_NEW_TOP_LINE TYPEI.
DATA L_TC_NAME LIKEFELD-NAME.
DATA L_TC_LINES_NAME LIKEFELD-NAME.
DATA L_TC_FIELD_NAME LIKEFELD-NAME.
FIELD-SYMBOLS <TC> TYPEcxtab_control.
FIELD-SYMBOLS <LINES> TYPEI.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME)TO<TC>.
*&SPWIZARD: get looplines of TableControl *
CONCATENATE 'G_' P_TC_NAME'_LINES'INTOL_TC_LINES_NAME.
ASSIGN (L_TC_LINES_NAME)TO<LINES>.
*&SPWIZARD: is no line filled? *
IF <TC>-LINES=0.
*&SPWIZARD: yes, ... *
L_TC_NEW_TOP_LINE = 1.
ELSE.
*&SPWIZARD: no, ... *
CALL FUNCTION 'SCROLLING_IN_TABLE'
EXPORTING
ENTRY_ACT = <TC>-TOP_LINE
ENTRY_FROM = 1
ENTRY_TO = <TC>-LINES
LAST_PAGE_FULL = 'X'
LOOPS = <LINES>
OK_CODE = P_OK
OVERLAPPING = 'X'
IMPORTING
ENTRY_NEW = L_TC_NEW_TOP_LINE
EXCEPTIONS
* NO_ENTRY_OR_PAGE_ACT = 01
* NO_ENTRY_TO = 02
* NO_OK_CODE_OR_PAGE_GO = 03
OTHERS =0.
ENDIF.
*&SPWIZARD: get actual tc and column *
GET CURSOR FIELDL_TC_FIELD_NAME
AREA L_TC_NAME.
IF SYST-SUBRC = 0.
IF L_TC_NAME = P_TC_NAME.
*&SPWIZARD: et actual column *
SET CURSOR FIELDL_TC_FIELD_NAMELINE1.
ENDIF.
ENDIF.
*&SPWIZARD: set the new top line *
<TC>-TOP_LINE = L_TC_NEW_TOP_LINE.
ENDFORM. " COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
*& Form FCODE_TC_MARK_LINES
*&---------------------------------------------------------------------*
* marks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM FCODE_TC_MARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME.
*&SPWIZARD: EGIN OF LOCAL DATA-----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME)TO<TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME)TO<TABLE>. "not headerline
*&SPWIZARD: mark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAMEOFSTRUCTURE<WA> TO <MARK_FIELD>.
<MARK_FIELD> = 'X'.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines
*&---------------------------------------------------------------------*
*& Form FCODE_TC_DEMARK_LINES
*&---------------------------------------------------------------------*
* demarks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME)TO<TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME)TO<TABLE>. "not headerline
*&SPWIZARD: demark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAMEOFSTRUCTURE<WA> TO <MARK_FIELD>.
<MARK_FIELD> = SPACE.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines
第二步:修改主程序
在主程序中增加对screen 100的调用语句:callscreen100.
然后激活运行这个程序,效果为:
也就是说,表sflight中的所有记录都被显示出来了。
但是,实际开发中,我们需要的并不是表中的所有记录,而是只会显示表中符合条件的那部分记录。
这个时候,我们可以修改向导自动生成的select语句,给它添加where条件来实现。
向导生成的select语句为:
SELECT * FROM SFLIGHT
INTO CORRESPONDING FIELDS
OF TABLE G_SFLIGHTTAB_ITAB.
我们修改后的select语句为:
SELECT * FROM SFLIGHT
INTO CORRESPONDING FIELDS
OF TABLE G_SFLIGHTTAB_ITAB
where carrid = 'AC'.
然后,我们再次运行程序,输出结果如下图所示,也就是说,在where条件的过滤下,进进输出了carrid为'AC'的记录。