Получение первой строки неиндексированных внутренних таблиц - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть переменная с типом ANY TABLE, и она должна быть, так как она может содержать STANDARD, SORTED или HASHED.

Мне нужно получить первую строку этой таблицы.

Использование индекса доступа, такого как READ TABLE itab INDEX 1 или itab[ 1 ], невозможно для этого типа.

Есть ли элегантный способ получить первую строку?

Мой способ не элегантен :

LOOP AT itab ASSIGNING <ls_line>.
  EXIT.
ENDLOOP.

Гугл найден аналогичный вопрос без соответствующего ответа.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Ваш вопрос не имеет смысла, поскольку вы не можете однозначно определить, что является первым в вашей задаче.

Ваша переменная generi c может принимать любую таблицу. Если это хешированная таблица, то она организована по ключевым полям , чаще всего она напоминает таблицу базы данных, если DB-таблица имеет тот же ключ.

Если это индексные таблицы (стандартные или отсортировано), то порядок сортировки определяется по индексу , который не имеет ничего общего с полями order или key. Если некоторые манипуляции были выполнены с таблицей (INSERT, UPDATE, DELETE), она будет отличаться от естественной сортировки и сортировки БД.

0 голосов
/ 13 февраля 2020

Значение «первой строки» хешированной внутренней таблицы немного субъективно, поскольку к хешированной внутренней таблице обычно обращаются с помощью ключевого значения, а не позиции.

Если вы имеете в виду первая строка « в том порядке, в котором [строки] были вставлены в таблицу, и в соответствии с порядком сортировки, используемым после оператора 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`.

Если «первая строка» означает строку с данным компонентом хешированной внутренней таблицы, содержащей наименьшее значение, вы можете определить вторичный ключ sorted :

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`.
...