TABLE CONTROL使用方法(待整理)

来源:互联网 发布:大数据时代 四大挑战 编辑:程序博客网 时间:2024/06/08 17:23

原文地址haixuan-2004的博客

 关于SAP控件TABLE Control的用法,近期研究得到的几点如下:

1、使用向导创建table control时,提示“specify the work area of the table or a table with a header line”。检查系统定义,所绑定的内表已很明确地定义了内表的具有表头。后来摸索到,一个屏幕只允许使用向导创建一个table control,如果手工创建则不受限制。
2、 系统提示:Cannot currently edit include Repeat step?想了好久,在SAP论坛上发现老外也存在同样的问题待解决,http://forums.sdn.sap.com/thread.jspa?threadID=1195809
重复了几次,后来仔细想想,include是一个包,screen与程序绑定的,会不会是因为正在打开绑定的程序呢,于时在SE38中退出正在编辑的程序,重新操作则成功。
3、关于这个控件很好的学习资料。见http://blog.chinaunix.net/space.php?uid=150062&do=blog&id=2780070
4、table control配套按钮的设计。今年6月在使用时,为了设计配套按钮(如翻页、全选、全不选、新增、删除等)费了好多时间,还背了一段代码,而如果采用向导创建table Control,系统会自动帮我们设置,具体操作如下
  •     一般情况下配置选择列。定义内表时,增加一列用于标记当前行是否被选中,该列的数据类型为 c,长度为 1, 在“line selectability"中勾选“line selection col”,并指定列名,同时可以指定是否允许选中       多行。如:
          TABLES:SPFLI.
 创建带有选择列的内表
  TYPES:BEGIN OF SP1_TYPE,
          ISSEL TYPE C,
          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,
        END OF SP1_TYPE.

   DATA:OK_CODE TYPE SY-UCOMM,
        SP1 TYPE STANDARD TABLE OF SP1_TYPE WITH HEADER LINE,
        SP2 TYPE STANDARD TABLE OF SP1_TYPE WITH HEADER LINE.
  •     配置实现可编辑的table control。
1、在input/output attributes选项面板中,勾选“input control”。
2、在维护函数选项中,勾选“SCROLL”,“Insert/delete line”,“select/deselect all”选项,系统自动配套设计好相关操作按钮。
3、在屏幕被调用前,指定table control的长度。  如:
  TBL2-LINES 1000.
   CALL SCREEN 100.
    表格控制的行数固定为1000行,如果内表不足一千行,用空行代替,当从屏幕更新数据到内表时,系统会跳过为空的行,所以不用担心这样做会造成内表有很多空行. 一般情况下,当要求可编辑时,要求预留空行,否则,用TBL2_CHANGE_TC_ATTR控制.如果用户不允许空行的存在,则按以下方式
 如果表格不允许空行的存在,则取消此处的注析,系统在显示前都会告知系统要显示的行数.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TBL2'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE TBL2_CHANGE_TC_ATTR OUTPUT.
 DESCRIBE TABLE SP1 LINES TBL2-lines.
ENDMODULE.

  •     自动录入功能增强。为了提高用户的友好性,提高用户的录入效率,有时候会根据用户录入的某些内容,自动带出其它相关的内容,只要监控相关列的值是否改变,如果有改变,即对其它相关列进行赋值。(table control中改变了界面的值后,只有按了enter键才会触发更改)。代码如:
流逻辑中监控字段的值是否改变
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL2'
  LOOP AT SP1.
    CHAIN.
      FIELD SP1-ISSEL.
      FIELD SP1-CARRID.
      FIELD SP1-CONNID.
      FIELD SP1-COUNTRYFR.
      FIELD SP1-CITYFROM.
      FIELD SP1-AIRPFROM.
      FIELD SP1-COUNTRYTO.
      FIELD SP1-CITYTO.
      FIELD SP1-AIRPTO.
      MODULE TBL2_MODIFY ON CHAIN-REQUEST.
    ENDCHAIN.

  ENDLOOP.

在程序中自动赋值:
 当用户更改表格中的数据后,触发该事件
 第一个SP1是内表,第二个SP1是表工作区,这个工作区和SP1表格控制绑定,在流逻辑中指定
 在这里可以实现信息提示,根据之前输入的字段内容,确定后面的字段内容,
MODULE TBL2_MODIFY INPUT.
  IF SP1-COUNTRYFR 'US'.
    SP1-COUNTRYTO 'CHI'.
  ENDIF.

  IF SP1-COUNTRYFR 'CHI'.
    SP1-COUNTRYTO 'US'.
  ENDIF.

  MODIFY SP1 FROM SP1 INDEX TBL2-CURRENT_LINE.
ENDMODULE.

这两天自已做的一个案例的全部内容如下:
*&---------------------------------------------------------------------*
*& Report  ZTABCON_HX_01_04
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZTABCON_HX_01_04.
  TABLES:SPFLI.
 创建带有选择列的内表
  TYPES:BEGIN OF SP1_TYPE,
          ISSEL TYPE C,
          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,
        END OF SP1_TYPE.

  DATA:OK_CODE TYPE SY-UCOMM,
        SP1 TYPE STANDARD TABLE OF SP1_TYPE WITH HEADER LINE,
        SP2 TYPE STANDARD TABLE OF SP1_TYPE WITH HEADER LINE.
      SP1 TYPE STANDARD TABLE OF SPFLI WITH HEADER LINE."采用这种方式创建的表格控件是没有选择列的,因为选择列还需要有额外的一个标记
  SELECT INTO CORRESPONDING FIELDS OF TABLE SP1
    FROM SPFLI.
 表格控件控件
 &SPWIZARD: DECLARATION OF TABLECONTROL 'TBL2' ITSELF
  CONTROLSTBL2 TYPE TABLEVIEW USING SCREEN 0100.

 &SPWIZARD: LINES OF TABLECONTROL 'TBL2'
  DATA    G_TBL2_LINES  LIKE SY-LOOPC.
 表格控制的行数固定为1000行,如果内表不足一千行,用空行代替,当从屏幕更新数据到内表时,系统会跳过为空的行,所以不用担心这样做会造成内表有很多空行.
 一般情况下,当要求可编辑时,要求预留空行,否则,用TBL2_CHANGE_TC_ATTR控制.
  TBL2-LINES 1000.
  CALL SCREEN 100.


  监控用户触发的事件
MODULE USER_COMMAND_0100 INPUT.
  CASE OK_CODE.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.

 当用户更改表格中的数据后,触发该事件
 第一个SP1是内表,第二个SP1是表工作区,这个工作区和SP1表格控制绑定,在流逻辑中指定
 在这里可以实现信息提示,根据之前输入的字段内容,确定后面的字段内容,
MODULE TBL2_MODIFY INPUT.
  IF SP1-COUNTRYFR 'US'.
    SP1-COUNTRYTO 'CHI'.
  ENDIF.

  IF SP1-COUNTRYFR 'CHI'.
    SP1-COUNTRYTO 'US'.
  ENDIF.
  MODIFY SP1 FROM SP1 INDEX TBL2-CURRENT_LINE.
ENDMODULE.


 如果表格不允许空行的存在,则取消此处的注析,系统在显示前都会告知系统要显示的行数.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TBL2'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE TBL2_CHANGE_TC_ATTR OUTPUT.
 DESCRIBE TABLE SP1 LINES TBL2-lines.
ENDMODULE.

*&SPWIZARD: OUTPUT MODULE FOR TC 'TBL2'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE TBL2_GET_LINES OUTPUT.
  G_TBL2_LINES SY-LOOPC.
ENDMODULE.

*&SPWIZARD: INPUT MODULE FOR TC 'TBL2'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: PROCESS USER COMMAND
MODULE TBL2_USER_COMMAND INPUT.
  OK_CODE SY-UCOMM.
  PERFORM USER_OK_TC USING    'TBL2'
                              'SP1'
                              'ISSEL'
                     CHANGING OK_CODE.
  SY-UCOMM OK_CODE.
ENDMODULE.

*----------------------------------------------------------------------*
  INCLUDE TABLECONTROL_FORMS                                         *
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  USER_OK_TC 这是系统标准的表格控制代码,相关控件按钮是按以下规定命名的:表格的名称_操作名,如本程序的名称为SP1_INSR,表示插入一行,
*&          DEL:删除
*&          P--:第一页
*&          P-:前一页
*&          P+:下一页
*&          P++:最后一页
*&          L-:左移一页
*&          L--:左边第一页
*&          ......
*&       所以当想实现左移时,只需要在界面中按规定添加按钮,并按相应的规则命名,就可以了.
*&
*&---------------------------------------------------------------------*
 FORM USER_OK_TC USING    P_TC_NAME TYPE DYNFNAM
                          P_TABLE_NAME
                          P_MARK_NAME
                 CHANGING P_OK      LIKE SY-UCOMM.

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
   DATAL_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 STRLENP_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 'DEL'                     "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_NAMETO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *
   CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME"table body
   ASSIGN (L_TABLE_NAMETO <TABLE>               "not headerline

*&SPWIZARD: get looplines of TableControl                              *
   CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME.
   ASSIGN (L_LINES_NAMETO <LINES>.

*&SPWIZARD: get current line                                           *
   GET CURSOR LINE L_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> .
     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 LINE INTO <TABLE> INDEX L_SELLINE.
   <TC>-LINES <TC>-LINES 1.
*&SPWIZARD: set cursor                                                 *
   SET CURSOR LINE L_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>         TYPE cxtab_control.
   FIELD-SYMBOLS <TABLE>      TYPE STANDARD TABLE.
   FIELD-SYMBOLS <WA>.
   FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

   ASSIGN (P_TC_NAMETO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *
   CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME"table body
   ASSIGN (L_TABLE_NAMETO <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_NAME OF STRUCTURE <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     TYPE I.
   DATA L_TC_NAME             LIKE FELD-NAME.
   DATA L_TC_LINES_NAME       LIKE FELD-NAME.
   DATA L_TC_FIELD_NAME       LIKE FELD-NAME.

   FIELD-SYMBOLS <TC>         TYPE cxtab_control.
   FIELD-SYMBOLS <LINES>      TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

   ASSIGN (P_TC_NAMETO <TC>.
*&SPWIZARD: get looplines of TableControl                              *
   CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_TC_LINES_NAME.
   ASSIGN (L_TC_LINES_NAMETO <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 FIELD L_TC_FIELD_NAME
              AREA  L_TC_NAME.

   IF SYST-SUBRC 0.
     IF L_TC_NAME P_TC_NAME.
*&SPWIZARD: et actual column                                           *
       SET CURSOR FIELD L_TC_FIELD_NAME LINE 1.
     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_NAMETO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *
   CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME"table body
   ASSIGN (L_TABLE_NAMETO <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_NAME OF STRUCTURE <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_NAMETO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *
   CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME"table body
   ASSIGN (L_TABLE_NAMETO <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_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.

     <MARK_FIELD> SPACE.
  ENDLOOP.
ENDFORM                                         "fcode_tc_mark_lines
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STATUS'.
 SET TITLEBAR 'xxx'.

ENDMODULE                STATUS_0100  OUTPUT
0 0
原创粉丝点击