[ABAP编程宝典]从内表中读取单行

从内表中读取单行

有三种不同的方法可以指定要读取的行:

  1. 通过索引(仅适用于索引表)
    • 索引表是基于行的顺序进行存储和访问的。每行都有一个唯一的索引。
    • 使用索引可以直接访问内表中的指定行。
  2. 通过表键(仅适用于定义了键的表)
    • 表键可以是主键、排序键或哈希键。表的键定义了行的唯一性和排序方式。
    • 使用表键可以通过键值来读取行。
  3. 通过自由键
    • 自由键允许通过非正式的键值访问内表中的行,通常在哈希表中使用。
    • 这种方法提供了灵活的行访问方式,但要求键值与定义的键相匹配。

读取单行时确定目标区域

在 ABAP 中读取内表的单行时,有三种主要方法来确定目标区域:

1. 使用 INTO 将行复制到数据对象

使用 READ TABLE ... INTO 语句将内表中的一行数据复制到数据对象中。这种方法会将找到的行与数据对象分开。如果修改数据对象或内表中的行,另一个不会受到影响。不过,您可以通过 MODIFY 语句基于修改后的数据行来更新内表。

语法:
READ TABLE itab INTO dobj ...   " dobj 必须具有表的结构类型

READ TABLE itab INTO DATA(dobj_inl) ...

READ TABLE itab INTO ... TRANSPORTING comp1 [comp2 ... ].
  • dobj:数据对象,必须与内表的行类型匹配。
  • dobj_inl:内联声明的数据对象。
  • TRANSPORTING:指定要复制的字段。如果不指定,则复制所有字段。
示例:
TYPES: BEGIN OF ty_line,
         comp1 TYPE i,
         comp2 TYPE c LENGTH 10,
       END OF ty_line.

DATA: itab TYPE TABLE OF ty_line WITH EMPTY KEY.

" 填充内表
APPEND VALUE #( comp1 = 1 comp2 = 'A' ) TO itab.
APPEND VALUE #( comp1 = 2 comp2 = 'B' ) TO itab.
DATA: lv_dobj TYPE ty_line.

" 将第一行读取到数据对象
READ TABLE itab INTO lv_dobj INDEX 1.
IF sy-subrc = 0.
  " 行读取成功
  WRITE: / lv_dobj-comp1, lv_dobj-comp2.
ELSE.
  " 行读取失败
  WRITE: / 'Line not found'.
ENDIF.

2. 使用 ASSIGNING 将行分配给字段符号

使用 READ TABLE ... ASSIGNING 将行分配给字段符号。此方法不进行实际的数据复制,修改字段符号即直接修改内表中的行。注意,这种方法不支持 TRANSPORTING 附加项,因为整个表都会分配给字段符号。

语法:
READ TABLE itab ASSIGNING <fs1> ...   " 字段符号必须具有适当的类型。

READ TABLE itab ASSIGNING FIELD-SYMBOL(<fs2>) ...   " 字段符号在内联声明中创建。
示例:
FIELD-SYMBOLS: <fs> TYPE ty_line.

" 将第一行分配给字段符号
READ TABLE itab ASSIGNING <fs> INDEX 1.
IF sy-subrc = 0.
  " 行读取成功
  WRITE: / <fs>-comp1, <fs>-comp2.
  " 修改字段符号会直接影响内表中的行
  <fs>-comp2 = 'Modified'.
ELSE.
  " 行读取失败
  WRITE: / 'Line not found'.
ENDIF.

3. 使用 REFERENCE INTO 将行读取到数据引用变量

使用 READ TABLE ... REFERENCE INTO 将行读取到数据引用变量。此方法不进行数据复制。如果要访问该行,必须首先取消引用数据引用。无法使用 TRANSPORTING 附加项。

语法:
READ TABLE itab REFERENCE INTO dref ...

READ TABLE itab REFERENCE INTO DATA(dref_inl) ...
  • dref:数据引用变量,用于引用内表中的行。
  • dref_inl:内联声明的数据引用变量。
示例:
DATA: lr_dref TYPE REF TO ty_line.

" 将第一行读取到数据引用变量
READ TABLE itab REFERENCE INTO lr_dref INDEX 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李威威wiwi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值