Виртуальная сортировка внутренних таблиц

Виртуальная сортировка внутренних таблиц, добавленная в ABAP 7.52, описана всего одним методом — virtual_sort, класса CL_ABAP_ITAB_UTILITIES

Основная особенность виртуальной сортировки заключается в том, что вы получаете массив индексов относительно сортировки, без необходимости формирования копии таблицы (или её изменения).

Далее разберём особенности работы метода на простых примерах.

Результат виртуальной сортировки можно использовать для формирования копии таблицы с новым порядком сортировки, на основе полученных индексов:

Внимательный читатель сразу задаст вопрос, а зачем нам пользоваться этим методом, если мы можем выполнить нечто подобное?

Результат:

И безусловно будет прав, в подобных случаях нам не потребуется использовать метод виртуальной сортировки, ABAP окружение сделает все само. Но что если таблица не сортированная, а стандартная и порядок сортировки не соответствует порядку сортировки ключа (по возрастанию)?

Читатель может вновь возразить и сказать что может сделать вот так:

И вновь будет прав, более того, скорость виртуальной сортировки на большом объеме данных с формированием копии таблицы будет ниже:

Результат:

Так зачем вообще нужно использовать виртуальную сортировку?

Основная суть её в следующем:

  1. Результат виртуальной сортировки — таблица с индексами (тип cl_abap_itab_utilities=>virtual_sort_index), в некоторых случаях могут потребоваться только индексы, например: если нужно убедиться в изменении сортировки некоторого массива данных, копирование данных в таком случае будет слишком затратной по памяти операцией. Подобный случай используется во внутреннем устройстве ALV;
  2. Результат виртуальной сортировки или последующую сформированную таблицу можно передавать в выражения без создания вспомогательных переменных или методов;
  3. Результат виртуальной сортировки можно дополнительно фильтровать с учётом входной таблицы индексов — параметр im_filter_index (тип cl_abap_itab_utilities=>virtual_sort_index);
  4. Позволяет получать результат сортировки относительно нескольких таблиц, объединяя их в виртуальном массиве;

Третий вариант использования можно рассмотреть на примере:

Таким образом мы можем оценить изменение сортировки в определённой группе индексов, построенной по условию фильтрации.

Четвёртый вариант использования еще более хитрый (из официальной документации):

Результат:

Представьте что вы объединяете две таблицы itab1 и itab2 в некоторый комбинированный массив данных и сортируете его на основе двух полей из itab1 по возрастанию и двух полей в itab2 по убыванию. Именно такой массив сортированных индексов будет сформирован на выходе.

При комбинированном подходе требуется иметь одинаковое число строк в таблицах, иначе получите дамп — ITAB_VSORT_ILLEGAL_TABLE.

Комбинированный подход уже будет выигрывать как по памяти, так и по скорости, при большом объеме данных, т.к. не требует явного создания массива данных для сортировки, как при явном объединении с последующей явной сортировкой.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *