Развёртка, оно же проваливание, оно же drilldown.
Если внутри SAP GUI оно реализуется просто, то как же быть, если отчёт у нас выгружается в Excel?
Один из простых сценариев решения такой задачи заключается в применении группировки:
Структура и управление
В данном примере сделана двухуровневая группировка:
1. Первый уровень – просто счёта главной книги, с текстом.
2. Счёт раскладывается на некоторые контировки (текст склеен через слеши), на скриншоте эти строки выделены.
3. Каждая контировка раскладывается на документы, текстовка которых также представляет склейку (дата+вид+номер)
Кнопки управления группировкой в стандартном интерфейсе Excel вы можете найти в верхнем правом углу скриншота. После того как сделана хоть одна группировка, то появляется панелька слева с плюсиками, минусиками и номерами уровней.
Общая форма отчёта при этом никак не меняется. Колонки остаются такими же узкими, поэтому приходится в них упаковываться.
Реализация
Реализация такого следующая (предполагается использование ZWWW):
1. Выгружаем данные так, как если бы они были разгруппированы полностью. Данные должны быть предварительно правильно отсортированы.
2. Примечаем признаки, по которым мы алгоритмизируем свёртку. Если для этого требуются дополнительные данные – выгружаем их в скрытую колонку. Например в моём примере: первый уровень группировки делается по первой колонке (одинаковый номер пункта), а второй уровень группировки делается по скрытой колонке J.
3. Пишем макрос, который сворачивает наши строки, считывая данные. Сначала проходим первый уровень группировки, затем – второй. (забросил пример сюда: http://pastebin.com/WAEJHuCZ)
Суть макроса:
3.1. Делаем цикл по строкам, по всем выгруженным данным
3.2. Сравниваем значения в ячейках List.Cells(i, j).Value
3.3. В нужные моменты делаем вызовы для сворачивания:
adress = rownum_a & ":" & rownum_b
Rows(adress).Select
Selection.Rows.Group
4. После выгрузки строк в ZWWW пинаем макрос.
Вуаля.
В целом получается достаточно быстро, просто и надёжно.
Ограничения
Метод не идеален, и у него есть свои минусы:
1. Одно из существенных ограничений – это ограничение по объёму. То есть: если у нас отчёт является оборотной ведомостью по счетам ГК, то это значит, что он, как правило, формируется по всем счетам главной книги. Следовательно, в форму выгружаются сразу все документы за период, что может привести к существенным провалам в плане производительности. А если развёртку требуется делать не всегда, то цена такой фишки может быть завышенной. Таким образом можно прийти к двум вариантам (быстрый без развёртки, и медленный с развёрткой).
2. Второе существенное ограничение – это ограничение по форме. Мы можем использовать только общие колонки для всех уровней. Новые колонки при развёртке могут появиться например только в конце таблицы и без шапки.
3. Применяются макросы. Ну мало ли, есть у кого предубеждения против макросов и VBA вообще.