SAP ABAP – 填充内部表
SAP ABAP – 填充内部表
在内部表中,填充包括选择、插入和追加等功能。本章重点介绍 INSERT 和 APPEND 语句。
插入语句
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行,则在插入行后的行的索引号加1。桌子的尽头。当 SAP 系统成功地向内部表添加一行时,SY-SUBRC 变量设置为 0。
例子
以下是使用插入语句的示例程序。
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。
每条插入语句执行后,系统都会重新索引插入语句下面的所有行。当您在大型内部表的顶部附近插入行时,这会引入开销。如果您需要向大型内部表中插入行块,请准备另一个包含要插入行的表并使用插入行。
在 itable1 的循环内的 itable1 中插入新行时,它不会立即影响内部表。它实际上在下一个循环传递中生效。在当前行之后插入一行时,表会在 ENDLOOP 处重新索引。sy-tabix 递增,下一个循环处理 sy-tabix 指向的行。例如,如果您在第二轮循环中并在第 3 行之前插入一条记录。执行 endloop 时,新行变为第 3 行,旧行 3 变为第 4 行,依此类推。Sy-tabix 加 1,下一个循环处理新插入的记录。
附加声明
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