dialog module (5)屏幕上显示某个表的内容(Table Control)

来源:互联网 发布:高中刷题软件 编辑:程序博客网 时间:2024/06/06 00:29

如果想在屏幕上显示一个表的内容,比如表 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_SFLIGHTTABOCCURS0,
          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>INDEXL_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'的记录。

原创粉丝点击