从内表中读取单行
有三种不同的方法可以指定要读取的行:
- 通过索引(仅适用于索引表)
- 索引表是基于行的顺序进行存储和访问的。每行都有一个唯一的索引。
- 使用索引可以直接访问内表中的指定行。
- 通过表键(仅适用于定义了键的表)
- 表键可以是主键、排序键或哈希键。表的键定义了行的唯一性和排序方式。
- 使用表键可以通过键值来读取行。
- 通过自由键
- 自由键允许通过非正式的键值访问内表中的行,通常在哈希表中使用。
- 这种方法提供了灵活的行访问方式,但要求键值与定义的键相匹配。
读取单行时确定目标区域
在 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

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



