Найти в Дзене
rustabapclub

Еще способы группировки в ABAP-среде: итератор и …

В одной из предыдущих статей мы рассматривали различные способы группировки в ABAP. Однако, тот список не был исчерпывающий (и даже текущий – тоже не исчерпывающий 😊), и есть еще, способы. В данной статье рассмотрим способ через паттерн итератор. Не будем здесь приводить детальное описание паттерна итератор (если нужно – дайте знать в комментариях). Но важно сказать, что это поведенческий паттерн; и его назначение предоставить последовательный доступ ко всем элементам составного объекта (в нашем случае – внутренней таблицы), не раскрывая внутреннего представления. Паттерн итератор также называют cursor (и термин cursor уже является ключевым словом для ABAP). С помощью итератора, мы можем одинаковым образом обойти внутреннюю таблицу (какой бы структуры она ни была) и сделать нужные действия: в нашем текущем случае – сгруппировать. В данном случае мы рассмотрим, простой (и надежный; используемый в том числе продуктивных целях) пример паттерна итератор. Классический паттерн итератор имее

В одной из предыдущих статей мы рассматривали различные способы группировки в ABAP. Однако, тот список не был исчерпывающий (и даже текущий – тоже не исчерпывающий 😊), и есть еще, способы. В данной статье рассмотрим способ через паттерн итератор.

С помощью паттерна итератор.

Не будем здесь приводить детальное описание паттерна итератор (если нужно – дайте знать в комментариях). Но важно сказать, что это поведенческий паттерн; и его назначение предоставить последовательный доступ ко всем элементам составного объекта (в нашем случае – внутренней таблицы), не раскрывая внутреннего представления. Паттерн итератор также называют cursor (и термин cursor уже является ключевым словом для ABAP). С помощью итератора, мы можем одинаковым образом обойти внутреннюю таблицу (какой бы структуры она ни была) и сделать нужные действия: в нашем текущем случае – сгруппировать.

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

Классический паттерн итератор имеет, как правило, 2 обязательных метода (минимум; могут быть и другие):

1) has_next_element – проверяет есть ли в коллекции еще один элемента
2)
get_next_element – получает следующий элемент коллекции.

Однако, в случае группировки: у нас, по сути, существует две коллекции: группировка и сама таблица; поэтому мы добавим ещё методы:

1) has_next_group – проверяет есть ли следующая Группа

2) get_next_group – переключает контекст для работы в следующей группе

3) read_group_key – получает запись с ключом для группы

и для работы с записями внутри группы:

4) has_next_row - проверяет есть ли в группе еще элемент

5) get_next_line_as_data_ref – получает элемент из группы

Реализация самого итератора находится здесь. Пример использования будет таким (доступен в unit-test):

Пример расчета суммы в группированных позиция через итератор.
Пример расчета суммы в группированных позиция через итератор.

Какую возможность дает нам паттерн итератор как таковой (общие рекомендации по итератору):

1) Доступ к содержимому коллекции и группировки таблицы без раскрытия внутреннего представления

2) Для поддержания нескольких активных обходов одной и той коллекции (внутренней таблицы)

3) Единообразный итерфейс доступа с целью обхода различных агрегированных структур

Как это влияет именно на abap (в текущей реализации):

1) У нас есть один класс, который позволяет группировать и обходить как группы так и записи внутри групп. Его не нужно копировать для каждой внутренней таблицы.

2) Инстанцию этого типа мы можем передавать в качестве параметра в другие методы и тем самым, повышая удобочитаемость (передавать группу в стандартной реализации ABAP – вообще говоря, бесполезно – можно считать ключ и передать уже его).

3) Инстанций по группировке у нас в один момент может быть несколько (в стандартной реализации ABAP – несколько параллельных группировок быть не может)

4) Мы можем дополнить реализацию любыми методами в ООП-стиле для расчета промежуточных значений – таким образом, мы можем сразу получать итоговую таблицу с рассчитанными агрегированными таблицами. (Если нужен пример – прошу дать знать).

А теперь вопрос: является ли этот способ адекватным или нет? Или все-таки нужно как в стандартной библиотеке – через доп.операторы?

Давайте посмотрим, как реализуется группировка в других языках (Java, Python, JavaScript). Ниже указаны одни из способов в указанных языках, а не все.

В JAVA группировка выполняется объектно-ориентированным способом https://metanit.com/java/tutorial/10.7.php . Но философия JAVA заслуживает отдельного внимания (надеюсь, мы сможем даже до такой темы дойти 😊 )

В python в библиотеке pandas группировка также выполняется функциональным способом https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html + https://realpython.com/pandas-groupby/

В JavaScript используется метод groupBy https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy .

А что думаете Вы?

Моё мнение: паттерн итератор может использоваться так же, как и операторы GROUP BY, но должен быть, естественно к месту.

Надо также сказать, что есть еще способ группировки в ABAP-среде, но они даже в рамках quarzBox кажутся экзотическими 😊 , но тем не менее мы постараемся как-нибудь и их рассмотреть.