SAP ABAP 填充内部表
在内部表中,填充包括选择、插入和附加等功能。本章重点介绍 INSERT
和 APPEND
语句。
INSERT 语句
INSERT
语句用于将单行或一组行插入到内部表中。
以下是向内部表中添加单行的语法:
INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.
在此语法中,INSERT
语句在内部表 internal_tab 中插入新行。通过在表达式中使用 work_area_itab INTO
,可以在 internal_tab 参数之前插入新行。使用 work_area_itab INTO
表达式时,新行取自 work_area_itab 工作区,并插入到 internal_tab 表中。但是,当 work_area_itab INTO
表达式不用于插入行时,该行取自 internal_tab 表的标题行。
当使用 INDEX
子句在内部表中插入新行时,插入行之后的行的索引号将增加 1。如果内部表包含 <index_num> - 1 行,则新行将添加到表的末尾。当 SAP 系统成功地向内部表添加一行时,SY-SUBRC
变量设置为 0。
实例
下面是使用 INSERT
语句的实例程序。
REPORT ZCUSLIST1.
DATA: BEGIN OF itable1 OCCURS 4,
F1 LIKE SY-INDEX,
END OF itable1.
DO 4 TIMES.
itable1-F1 = sy-index.
APPEND itable1.
ENDDO.
itable1-F1 = -96.
INSERT itable1 INDEX 2.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
LOOP AT itable1 Where F1 ≥ 3.
itable1-F1 = -78.
INSERT itable1.
ENDLOOP.
Skip.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
结果如下:
1
96-
2
3
4
1
96-
2
78-
3
78-
4
DO
循环附加了 4 行,其中包含数字 1 到 4。标题行组件 itable1-F1
的值为 -96。Insert
语句将标题行作为新行插入到第 3 行之前的主体中。插入后,现有的第 3 行变为第 4 行。循环 LOOP AT
语句从内部表中检索 F1 值大于或等于 3 的行。在每行之前,Insert
语句从其标题行插入新行。在插入之前,F1 组件已更改为包含 -78。
在执行每个 insert
语句后,系统 重新索引 插入语句下方的所有行。当您在大型内部表的顶部附近插入行时,会影响性能。如果需要在大型内部表中插入行块,请用要插入的行准备另一个表,并改用插入行。
当在 itable1
的循环内的 itable1
内插入新行时,它不会立即影响内部表。它实际上在下一个循环过程中生效。在当前行之后插入行时,表在 ENDLOOP
处 重新索引。sy-tabix
递增,下一个循环处理 sy-tabix
指向的行。例如,如果您在第二个循环过程中,并且在第 3 行之前插入了一条记录。执行 endloop
时,新行变为第 3 行,旧行变为第 4 行,依此类推。 Sy-tabix
增加 1,下一个循环过程处理新插入的记录。
APPEND 语句
APPEND
语句用于向现有内部表中添加单行。此语句从工作区复制一行,并将其插入内部表中最后一行的后面。工作区可以是标题行,也可以是与内部表的行具有相同结构的任何其他字段字符串。
下面是 APPEND
语句的语法,用于在内部表中追加单行:
APPEND <record_for_itab> TO <internal_tab>.
在这种语法中,<record_for_itab>
表达式可以由 <work_area_itab>
工作区表示,该工作区可以转换为行类型或 INITIAL LINE
子句。如果用户使用 <work_area_itab>
工作区,则 SAP 系统会在 <internal_tab> 内部表中添加一行,并用工作区的内容填充该行。INITIAL LINE
子句附加一个空行,其中包含表结构每个字段的初始值。在每个 APPEND
语句之后,SY-TABIX
变量包含追加行的索引号。
无论表中是否已经存在具有相同键的行,都可以使用非唯一键将行追加到标准表和排序表中。换句话说,可能会出现重复条目。但是,如果用户试图使用唯一键向排序表中添加重复条目,或者用户通过在排序表中添加行来违反排序顺序,则会发生运行时错误。
实例
REPORT ZCUSLIST1.
DATA: BEGIN OF linv Occurs 0,
Name(20) TYPE C,
ID_Number TYPE I,
END OF linv.
DATA table1 LIKE TABLE OF linv.
linv-Name = 'Melissa'.
linv-ID_Number = 105467.
APPEND linv TO table1.
LOOP AT table1 INTO linv.
Write: / linv-name, linv-ID_Number.
ENDLOOP.
结果如下:
Melissa 105467