SAP ABAP 表控件
表控件和单步循环是添加到屏幕刷中的屏幕的屏幕表显示对象。

从编程的角度来看,表控件和单步循环几乎完全相同。表控件只是改进的单步循环,其显示的数据具有与桌面应用程序中的表相关联的外观。
ABAP 表控件的功能
使用表控件,用户可以:
- 垂直和水平滚动表格
- 调整列的宽度
- 在字段中滚动(当字段内容比字段宽时)
- 选择表格行或列
- 对列序列重新排序
- 保存当前显示设置以备将来使用
表格控件还提供特殊的格式设置功能(一些自动设置,一些可选),使表格更易于查看和使用。表控件提供:
- 当用户调整窗口大小时自动调整表格大小(垂直和水平)
- 行之间和列之间的分隔线(垂直和水平)
- 所有列的列标题字段
单步循环的一个特点是它们的表行可以跨越屏幕上的多行。另一方面,表控件的一行必须始终包含在一行中(尽管可以滚动)。
通常,表控件提供的许多功能都由系统的 SAPgui 前端在本地处理,因此您无需自己对其进行编程。唯一值得注意的例外是垂直滚动。
示例(事务 TZ60 )

若要处理 ABAP 程序中的表控件,必须使用以下语句在程序的声明部分中为每个表控件声明一个控件:
CONTROLS <ctrl> TYPE TABLEVIEW USING SCREEN <scr>
其中 是 ABAP 程序中屏幕上的表控件的名称。该控件允许 ABAP 程序读取表控件的属性并影响控件。此处 是加载表初始值的屏幕编号。
可以通过以下方式设置表控件的光标位置:
在 PBO 中,您可以将光标设置在表控件的特定行的特定字段上。
SET CURSOR FIELD <f> LINE <lin> [OFFSET <off>]
使用可选的添加 OFFSET,您可以在字段中输入光标的偏移量,如设置光标位置中所述。
在PAI上,您可以读取当前光标位置。
GET CURSOR FIELD <f> LINE <lin> ...
除了“找出光标位置”下提供的信息外,字段还包含有关光标当前位于表控件的哪一行的信息。您也可以使用
GET CURSOR LINE <lin>.
以确定表控件的行。SY-SUBRC 允许您检查光标是否放置在表控件的一行中。
为了获取内部表的相应行:
GET CURSOR line <lin>.
ind = <table_control>-top_line + <lin> - 1.
Read table <itab> index ind.
系统变量 stepl – 在一个循环中包含当前表线索引 …结束循环。Loopc – 包含表中可见的行数
创建表控件
- 在屏幕上添加表控件元素
- 为表控件命名。在 ABAP 程序中声明一个具有相同 ( 控件类型 表视图 使用屏幕 )
- 为了创建字段,请转到字典/程序字段功能。 
   - 输入所需字段的结构的名称。(如果您希望它从程序的字典中选择它,请单击相关的puh按钮)。
- 在字段列表中,选择所需的字段,然后选择“确定”。
- 在表格控制区域中单击。
 
如果需要选择列,请选中属性中的相应复选框并为其命名。在 ABAP 程序中创建字段。
在 PBO 中,您应该有声明
LOOP at <itab> USING CONTROL <cntrl_name>.
ENDLOOP.
在PAI中,您应该拥有:
LOOP at <itab>.
ENDLOOP.
在循环中,数据传输发生在屏幕和内部表之间。填充内部表时,请使用“描述表行”-“行”来存储控件中的行总数。FIELD 语句可用于控制数据传输发生的时间
要更改单个单元格的属性,请临时更改 PBO 中的 SCREEN 表。您可以更改由 CONTROLS 语句创建的结构的属性
<cntrl>-fixed_cols etc are the attributes of the control
<cntrl>-cols-index etc are the attributes of the columns.
<cntrl>-cols-screen-invisible etc are the screen attributes of each column.
表空间插入行代码
&---------------------------------------------------------------------*
*&      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
如果你选择用系统屏幕制作器的表控件(含向导) 的话,这些代码都会自动生成。
- 点赞
- 收藏
- 关注作者
 
             
           
评论(0)