Найти последний соответствующий результат, используя «читать таблицу с ключом» - PullRequest
0 голосов
/ 11 января 2019

Мне нужно найти sy-tabix последней записи во внутренней таблице, которая соответствует v_key = x. Я пытаюсь сделать это с:

read table i_tab with key v_key = x

Но поскольку в таблице есть несколько записей, соответствующих v_key = x, как я могу убедиться, что получаю sy-tabix последней соответствующей записи? К сожалению, я не могу искать по другому ключу.

Ответы [ 5 ]

0 голосов
/ 12 января 2019
sort i_tab by v_key .
read table i_tab with key v_key = x binary search.

while i_tab-key = x
  lv_tabix = sy-tabix + 1 .
  read table i_tab index = lv_tabix .
endwhile.

result = lv_tabix -1 .
0 голосов
/ 12 января 2019

Я пишу другое решение, которое может быть полезно для вас.

добавить один столбец keyno в таблицу i_tab.

Когда вы вставляете записи в таблицу i_tab, и в таблицу i_tab добавляется несколько записей для одного и того же ключа, вы можете добавить keyno для каждой записи, где один и тот же ключ имеет несколько записей.

Например:

Вставка записей в таблицу i_tab

i_tab_line-key = 'X'.
i_tab_line-keyno = 1.
APPEND i_tab_line to i_tab.
i_tab_line-key = 'X'.
i_tab_line-keyno = 2.
APPEND i_tab_line to i_tab.
i_tab_line-key = 'X'.
i_tab_line-keyno = 3.
APPEND i_tab_line to i_tab.

Таблица i_tab Сортировка по ключу Кейно по убыванию .

   SORT i_tab by key keyno Desc.

Now Read Table найдет последнюю соответствующую запись из таблицы i_tab для ключа.

   read table i_tab with key = X

С уважением,

Умар Абдулла

0 голосов
/ 11 января 2019

Я думаю, что самый быстрый путь -

Sort itab by key.
read table itab with key key = v_key
                binary search.
loop at itab assign <fs> from sy-tabix.
   if <fs>-key ne v_key.
      exit.
   endif.
endloop.
0 голосов
/ 11 января 2019

Еще одна возможность, которая полезна, если у вас много строк с одинаковым значением v_key.

Во-первых, убедитесь, что для X существует строка. Если она не найдена, то не нужно продолжать.

Рассчитать следующее возможное значение (переменная x_next_value) искомого значения (переменная X). Примеры:

  • Если X - целое число, просто выполните поиск X + 1. Пример: для значения 5 x_next_value будет равно 6.
  • Если X - это символы (C или строка), тогда получите номер последнего символа (cl_abap_conv_**out**_ce=>uccpi), добавьте 1 и обновите последний символ (cl_abap_conv_**in**_ce=>uccpi).
  • Такая же логика для других типов X.

Убедитесь, что ваша таблица отсортирована (предпочтительнее, чем объявленная таблица sorted table of ... with non-unique key v_key)

Затем сделайте READ TABLE itab WITH KEY v_key = x_next_value.

Важно : даже если строка не найдена, SY-TABIX будет установлен на номер следующей строки после всех строк, имеющих v_key = x (ср. ABAP документация READ TABLE - возможно значения для SY-SUBRC и SY-TABIX )

Псевдокод:

READ TABLE ... WITH KEY v_key = x_next_value.
" eventually BINARY SEARCH if itab is STANDARD instead of SORTED

CASE sy-subrc.
  WHEN 0.
    last_tabix_of_x = sy-tabix.
  WHEN 4.
    last_tabix_of_x = sy-tabix - 1.
  WHEN 8.
    last_tabix_of_x = lines( itab ).
ENDCASE.

Примечание: необходимо ровно два READ TABLE , чтобы найти последний соответствующий результат.

0 голосов
/ 11 января 2019

READ TABLE для чтения отдельных строк, для большего количества строк вы должны использовать LOOP:

LOOP AT itab
     ASSIGNING ...
     WHERE vkey EQ x.
ENDLOOP.

Сразу после LOOP sy-tabix будет содержаться последняя строка, где условие истинно.

Как было указано (см. Обсуждение ниже), для лучшей производительности должен существовать ключ NON-UNIQUE SORTED (основной или дополнительный) для этого поля

...