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)