我有一个类型为ANY TABLE的变量,它应该是,因为它可能包含STANDARD,SORTED或Hashed,我需要获取该表的第一行。
使用索引访问,例如
READ TABLE itab INDEX 1` or `itab[ 1 ]
对于该类型是不可能的。有没有一种优雅的方式来获得第一行?
我的方式不优雅:
LOOP AT itab ASSIGNING <ls_line>.
EXIT.
ENDLOOP.
谷歌搜索发现了类似的问题,但没有适当的答案。
你的问题没有意义,因为你无法明确地定义任务中的第一个是什么。
泛型变量可以接受任何表。如果这是散列表,那么它是按键字段组织的,如果数据库表具有相同的键,则通常它类似于数据库表。
如果这是索引表(标准表或排序表(,则其排序顺序由索引确定,这与字段顺序或键无关。如果使用表(插入,更新,删除(进行了某些操作,它将与自然排序和数据库排序不同。
散列内部表的"第一行"的含义有点主观,因为散列内部表通常使用键值而不是位置进行访问。
如果您的意思是第一行"按照 [行] 在表中插入的顺序,以及语句 SORT [如果有的话] 之后使用的排序顺序",那么没有比问题中提出的解决方案更好的解决方案了:
TYPES ty_hashed_table TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
DATA(hashed_table) = VALUE ty_hashed_table( ( `World` ) ( `Hello` ) ).
LOOP AT hashed_table ASSIGNING FIELD-SYMBOL(<line>).
EXIT.
ENDLOOP.
ASSERT <line> = `World`.
如果"第一行"是指包含最低值的散列内部表的给定组件的行,则可以定义辅助排序键:
TYPES ty_hashed_table TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line
WITH NON-UNIQUE SORTED KEY by_table_line COMPONENTS table_line
##TABKEY[PRIMARY_KEY][BY_TABLE_LINE].
DATA(hashed_table) = VALUE ty_hashed_table( ( `World` ) ( `Hello` ) ).
ASSIGN hashed_table[ KEY by_table_line INDEX 1 ] TO FIELD-SYMBOL(<line>).
ASSERT <line> = `Hello`.
对于找到这篇文章的任何人,有两种方法可以获得第一行。 首先是在表中进行选择,但只读取 1 行。
SELECT * FROM your_internal_table UP TO 1 ROWS INTO your_work_area.
" your logic here
ENDSELECT.
相反,只需使用 READ 并选择第一个索引
READ TABLE your_internal_table INTO your_work_area INDEX 1.
" your logic here
差不多就是这样。 如果您将内部表作为哈希表进行管理,第二种解决方案将为您提供帮助。尽管有更优雅的方法可以做到这一点。您可以将这两个选项视为知道您将始终有 1 行,但不想使用循环来提取它。