Меню

Способы группировки в ABAP: 3 + 1 способ

|

При обработке данных иногда требуется сгруппировать данные и посчитать какое-либо агрегированное значение (MAX, MIN, AVG, SUM, COUNT и другие). Традиционно, такие функции реализуются в SQL; однако и на сервере приложений приходится выполнять такие вычисления.

← Предыдущий пост

В ABAP имеется 3 стандартных способа (встроенных) для группировки с последующим вычислением агрегированных значений, а именно:

  1. Группировка с помощью ключей сортированной таблицы.
  2. Группировка с помощью относительного недавно введенного оператора GROUP BY (в том числе GROUP BY without MEMBERS)
  3. Группировка с помощью операторов AT ENDAT.

Давайте рассмотрим на примере вычисления максимального значения (поле BUDAT) из внутренней таблицы эти способы.

Пусть у нас имеется таблица (полный код доступен по ссылке).

Рис. 1 Начальное заполнение внутренней таблицы

Сортированная таблица (SORTED TABLE)

Группировка с помощью сортированной таблицы выполняется просто: создаётся сортированная таблица с уникальным ключом, равным ключам группировки. А затем выполняется нужная агрегированная функция. Однако в нашем примере нам нужно найти максимальное значение поля BUDAT для каждой полученной группы, и мы можем заранее подготовить данные так, что максимальное значение уже будет подготовленно: а именно предварительно отсортировать данные, сделав первую запись с наибольшей датой.

Рис. 2 Группировка с максимальной датой с помощью сортировки

Результат будет таким:

Рис. 3 Результат группировки

Этот способ является лаконичным, наглядным и надежным: ключи задаются явно, контролируются компилятором, и сортированные таблицы уже существуют много десятилетий (то есть достаточно оптимизированным) (полный код доступен по ссылке).

Группировка с помощью GROUP BY

GROUP BY – относительно новый (и долгожданный оператор в ABAP. Справка к нему доступна. Даёт разные возможности по группировки данных. Принцип работы: «внутри» создаётся объект «группа» и затем с помощью этого объекта можно обрабатывать группу и каждую запись внутри группы. При этом можно передавать как полную строку, так и только ключи (для целей производительности). Давайте рассмотрим пример (полный код доступен по ссылке). (!!!) Объект группы нельзя передавать в качестве параметра другим code-unit и зачастую это «портит картину»; особенно когда нужно использовать несколько функций для агрегированного значения; а также нельзя менять порядок строк и ключи в исходной таблице.

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти