:::: МЕНЮ ::::

Автоматический пересчет данных в разрезе выбранных полей ALV Grid

ALV Grid позволяет пользователю отображать отчет в желаемом виде. Пользователю доступны такие операции как: отображение или скрытие указанных полей, изменение порядка вывода столбцов. Зачастую, при изменении списка отображаемых полей, заказчик хочет видеть пересчет данных в разрезе отображаемых столбцов. Ниже описан способ автоматического пересчета данных в таблице, на основе каталога полей ALV Grid.

Постановка задачи

Пусть наш отчет имеет следующую структуру:

По умолчанию, суммы отображаются в разрезе БЕ, завода и материала. В определенный момент пользователь скрыл поле MATNR. Ожидается, что данные «схлопнутся», и отчет уже будет отображать данные в разрезе БЕ и завода. То есть в каждой строке таблицы необходимо очистить поле MATNR и сделать COLLECT всех строк в новую таблицу. Полученная таблица и будет желаемым результатом.

Вывод отчета в разрезе БЕ, завода и материала

Вывод отчета в разрезе БЕ, завода и материала

Вывод отчета в разрезе БЕ и завода

Вывод отчета в разрезе БЕ и завода

Вывод отчета в разрезе БЕ

Вывод отчета в разрезе БЕ

Алгоритм

Первое что нужно сделать, это создать копию отображаемой таблицы и в ALV Grid передавать не исходную таблицу, а ее копию. Это необходимо для того, чтобы можно было восстановить исходные данные в случае отображения скрытых полей. Если не делать копию таблицы, то после скрытия столбцов ненужные поля очистятся и данные пересчитаются, а если мы захотим отобразить скрытые поля обратно, то данные уже нельзя будет вернуть. Именно поэтому нужна копия исходной таблицы.

После выполнения какой-либо команды пользователя в ALV Grid вызывается событие AFTER_USER_COMMAND. В этот момент необходимо сделать проверку на изменение каталога полей в ALV. Если поля изменились, то необходимо обновить внутреннюю таблицу с данными и вызвать метод REFRESH_TABLE_DISPLAY для обновления данных на экране. Пересчет табличных данных оформим во вспомогательном классе из предыдущей заметки. Для этого, определим статический метод AUTO_COLLECT в классе ZCL_ALV_GRID_HELPER.

Вызов данного метода нужно делать в обработчике события AFTER_USER_COMMAND.

Разбор действий

А теперь давайте разберем что происходит в методе AUTO_COLLECT.
1. Метод принимает 2 параметра: таблицу с исходными данными и ссылку на экземпляр ALV Grid.
2. После объявления переменных проверяется наличие данных в исходной таблице. Символьным переменным <lt_src> <lt_dest> присваиваются исходная и результирующая таблицы соответственно. Также создается структура строки исходной таблицы и назначается в переменную <ls_row>.

3. В переменную lt_fieldcat импортируется каталог полей переданного экземпляра ALV Grid.

4. Формируется таблица lt_component, содержащая скрытые, но не технические поля ALV Grid.

5. Далее делаем проверку, если в скрытые поля отсутствуют, то выводим таблицу как есть.

6. Если скрытые поля существуют то создаем структуру, состоящую из скрытых полей и очищаем ее.

7. И наконец формируем итоговую таблицу


Присоединиться к обсуждению...