TABLE CONTROL使用方法详解编程语言

关于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

  CONTROLS: TBL2 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—————————————-*

   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 ‘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_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’ INTO L_LINES_NAME.

   ASSIGN (L_LINES_NAME) TO <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> + 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 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_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_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_NAME) TO <TC>.

*&SPWIZARD: get looplines of TableControl                              *

   CONCATENATE ‘G_’ P_TC_NAME ‘_LINES’ INTO L_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 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_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_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_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_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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20073.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论