[ABAP编程宝典]内表的填充(复制、插入和添加)

复制内表

简单赋值没有构造表达式的情况下,会复制另一个内表的内容(注意,现有的内容将被删除)。以下示例假定源表和目标表具有兼容的行类型。使用内联声明有助于避免为适当类型的额外内表声明。

itab = itab2.

DATA(itab3) = itab.
FINAL(itab4) = itab.

💡 注意

内表只能分配给内表。

如果内表的行类型兼容或可转换,内表之间可以相互分配。

如果目标表被分配了一个唯一主键或辅助键的重复项,赋值操作可能会触发不可捕获的异常。

使用 INSERT 和 APPEND 语句填充内表

可以使用 ABAP 关键字 INSERTAPPEND 向内表添加行。

使用 APPEND 和 INSERT 的注意事项

  • APPEND
    • 总是在内表的末尾添加行。
    • 对于标准表,使用索引管理行时没有问题。使用该语句时,系统字段 sy-tabix 会设置为最近添加行的索引。sy-tabix 总是相对于主表索引设置索引。
    • 无法用于哈希表。对于排序表,仅在匹配排序顺序且未创建唯一主表键的重复条目时,才追加行。因此,向排序表添加行时应使用 INSERT
  • INSERT

💡 注意: 对于唯一主表键,表不能有重复键的条目。如果插入重复条目,插入失败并且系统字段 sy-subrc 设置为 4

  • 可以用于在表的特定位置添加行(通过指定目标索引)。这样,所有后续行会向下移动一个位置。
    • 未指定位置时,在标准表中添加行到表末尾。然而,使用 INSERT 时,sy-tabix 不会像 APPEND 那样设置。在排序表中,行会自动插入到正确的位置。
    • 使用 INSERT 时,可以在 INTO 后指定行插入的位置:
      • ... INTO TABLE itab ...: 行插入到...
    • 标准表的最后一行(即追加)
      • 按主键值排序的排序表
      • 通过哈希管理的哈希表按主键值
      • ... INTO itab INDEX n: 适用于索引表。行插入到主表索引中行号为 n 的行之前。

INSERT和APPEND 什么时候使用什么?

推荐使用 INSERT 语句。它涵盖所有表和键类型。当您更改表/键类型时,考虑使用 APPEND 可能引起的问题。

向内表添加一行

示例显示了使用VALUE运算符创建的结构以及添加的现有结构。

APPEND VALUE #( comp1 = a comp2 = b ... ) TO itab.
APPEND lv_struc TO itab.

INSERT VALUE #( comp1 = a comp2 = b ... ) INTO TABLE itab.
INSERT lv_struc INTO TABLE itab.

向内表添加初始行而不提供任何字段值:

APPEND INITIAL LINE TO itab.

INSERT INITIAL LINE INTO TABLE itab.

向内表添加一行并将添加的行分配给字段符号或数据引用变量

使用字段符号:

"声明内表
DATA: lt_table TYPE TABLE OF zdemo_abap_fli.

"声明字段符号
FIELD-SYMBOLS: <fs_row> TYPE zdemo_abap_fli.

"使用APPEND添加一行并将其分配给字段符号
APPEND INITIAL LINE TO lt_table ASSIGNING <fs_row>.

"为添加的行赋值
<fs_row>-carrid = 'LH'.
<fs_row>-connid = '400'.

使用数据引用变量:

"声明内表
DATA: lt_table TYPE TABLE OF zdemo_abap_fli.

"声明数据引用变量
DATA: lr_row TYPE REF TO zdemo_abap_fli.

"使用INSERT添加一行并将其分配给数据引用变量
INSERT INITIAL LINE INTO TABLE lt_table REFERENCE INTO lr_row.

"为添加的行赋值
lr_row->carrid = 'LH'.
lr_row->connid = '400'.

上述示例展示了如何使用 APPENDINSERT 语句将初始行添加到内表,并将新添加的行分配给字段符号或数据引用变量。这样可以方便地对新添加的行进行赋值。

将另一内表中的所有行添加到当前内表中

将另一内表中的所有行添加到当前内表中,可以使用 APPEND LINES OFINSERT LINES OF 语句。以下是示例:

示例:使用 APPEND LINES OF

"声明两个内表
DATA: lt_source TYPE TABLE OF zdemo_abap_fli,
      lt_target TYPE TABLE OF zdemo_abap_fli.

"向源内表添加数据
APPEND VALUE #( carrid = 'LH' connid = '400' ) TO lt_source.
APPEND VALUE #( carrid = 'AA' connid = '200' ) TO lt_source.

"将源内表的所有行添加到目标内表
APPEND LINES OF lt_source TO lt_target.

示例:使用 INSERT LINES OF

"声明两个内表
DATA: lt_source TYPE TABLE OF zdemo_abap_fli,
      lt_target TYPE TABLE OF zdemo_abap_fli.

"向源内表添加数据
APPEND VALUE #( carrid = 'LH' connid = '400' ) TO lt_source.
APPEND VALUE #( carrid = 'AA' connid = '200' ) TO lt_source.

"将源内表的所有行插入到目标内表
INSERT LINES OF lt_source INTO TABLE lt_target.

注意事项

  • 使用 APPEND LINES OF 时,所有源内表的行将被添加到目标内表的末尾。
  • 使用 INSERT LINES OF 时,源内表的所有行将被插入到目标内表中。如果目标内表是一个排序表或哈希表,行将按照相应的键进行排序或哈希处理。

示例:将所有行添加到排序表中

"声明两个排序内表
DATA: lt_source TYPE SORTED TABLE OF zdemo_abap_fli WITH UNIQUE KEY carrid,
      lt_target TYPE SORTED TABLE OF zdemo_abap_fli WITH UNIQUE KEY carrid.

"向源内表添加数据
APPEND VALUE #( carrid = 'LH' connid = '400' ) TO lt_source.
APPEND VALUE #( carrid = 'AA' connid = '200' ) TO lt_source.

"将源内表的所有行插入到目标排序内表
INSERT LINES OF lt_source INTO TABLE lt_target.

以上代码展示了如何将一个内表的所有行添加到另一个内表中,包括标准表和排序表的情况。

将另一内表的多行添加到当前内表

可以使用 INSERT LINES OF 语句和指定索引范围来将另一内表的多行添加到当前内表。以下是一个示例,展示如何从指定索引范围添加多行:

示例:从指定索引范围添加多行

"声明两个内表
DATA: lt_source TYPE TABLE OF zdemo_abap_fli,
      lt_target TYPE TABLE OF zdemo_abap_fli.

"向源内表添加数据
APPEND VALUE #( carrid = 'LH' connid = '400' ) TO lt_source.
APPEND VALUE #( carrid = 'AA' connid = '200' ) TO lt_source.
APPEND VALUE #( carrid = 'BA' connid = '300' ) TO lt_source.
APPEND VALUE #( carrid = 'SQ' connid = '500' ) TO lt_source.

"将源内表索引2到3(包含)的行插入到目标内表
INSERT LINES OF lt_source FROM 2 TO 3 INTO TABLE lt_target.

注意事项

  • 使用 INSERT LINES OF ... FROM ... TO ... 语句时,行从指定的起始索引(包含)到结束索引(包含)被添加到目标内表。
  • 起始索引和结束索引必须在源内表的有效范围内,否则将会引发运行时错误。

示例:从指定索引范围添加多行到排序表中

"声明两个排序内表
DATA: lt_source TYPE SORTED TABLE OF zdemo_abap_fli WITH UNIQUE KEY carrid,
      lt_target TYPE SORTED TABLE OF zdemo_abap_fli WITH UNIQUE KEY carrid.

"向源内表添加数据
APPEND VALUE #( carrid = 'LH' connid = '400' ) TO lt_source.
APPEND VALUE #( carrid = 'AA' connid = '200' ) TO lt_source.
APPEND VALUE #( carrid = 'BA' connid = '300' ) TO lt_source.
APPEND VALUE #( carrid = 'SQ' connid = '500' ) TO lt_source.

"将源内表索引1到2(包含)的行插入到目标排序内表
INSERT LINES OF lt_source FROM 1 TO 2 INTO TABLE lt_target.

示例:从指定索引范围添加多行到哈希表中

"声明两个哈希内表
DATA: lt_source TYPE HASHED TABLE OF zdemo_abap_fli WITH UNIQUE KEY carrid,
      lt_target TYPE HASHED TABLE OF zdemo_abap_fli WITH UNIQUE KEY carrid.

"向源内表添加数据
APPEND VALUE #( carrid = 'LH' connid = '400' ) TO lt_source.
APPEND VALUE #( carrid = 'AA' connid = '200' ) TO lt_source.
APPEND VALUE #( carrid = 'BA' connid = '300' ) TO lt_source.
APPEND VALUE #( carrid = 'SQ' connid = '500' ) TO lt_source.

"将源内表索引1到3(包含)的行插入到目标哈希内表
INSERT LINES OF lt_source FROM 1 TO 3 INTO TABLE lt_target.

以上示例展示了如何使用 INSERT LINES OF 语句和指定索引范围将另一内表的多行添加到目标内表,包括标准表、排序表和哈希表的情况。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值