SAP ABAP 填充内部表
在内部表中,填充包括选择,插入和追加等功能。 本章重点介绍INSERT和APPEND语句。
INSERT语句
INSERT语句用于将单个行或一组行插入内部表。
以下是将一行添加到内部表的语法:
INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.
在此语法中,INSERT语句在internal_tab内部表中插入一行。 可以通过在internal_tab参数之前使用work_area_itab INTO表达式插入新行。 当使用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循环将包含数字1到4的4行附加到它。 标题行组件itable1-F1已分配值-96。 Insert语句将标题行作为新行插入到第3行之前的主体中。现有行3在插入后变为第4行。 LOOP AT语句从内部表中检索F1值大于或等于3的那些行。在每一行之前,Insert语句从它的标题行插入一个新行。 在插入之前,F1组件已经改变为包含-78。
执行每个insert语句后,系统将重新编制所插入的行下面的所有行。 当在大型内部表的顶部附近插入行时,会引入开销。 如果需要将一个行插入到一个大型内部表中,请准备另一个包含要插入的行的表,并改为使用插入行。
当在itable1的循环内部在itable1中插入一个新行时,它不会立即影响内部表。 它实际上在下一个循环传递中生效。 当在当前行之后插入一行时,该表在ENDLOOP处重新索引。 系统递增,下一个循环处理syxix指向的行。 例如,如果您在第二个循环遍历中,并且在第3行之前插入记录。当执行endloop时,新行将变为第3行,旧行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