Как сделать отчет типа Drill-Down

04.09.2019

Отчеты с группировкой просто необходимы для анализа данных. Но когда данных много и нет необходимости их все отображать обычный отчет с группировкой становится громоздким и избыточным. Хочется найти универсальное решение для таких случаев. И оно есть.

Отчет с выпадающим списком – это по сути отчет с группировкой данных, но с возможностью скрыть или отобразить данные в группе по клику мышью. Это не только очень удобно, но и красиво. Ведь отчет превращается в интерактивный объект. Пользователю приятно, когда он может участвовать в отображении информации.

Рассмотрим на примере, как сделать такой отчет. Прежде всего, как и в отчете Master-Detail нам потребуется источник данных со связанными таблицами. Допустим, у нас есть две таблицы: customer и orders.

 

Один клиент может делать множество заказов. Связь один-ко-многим. Давайте добавим ее. Нажимаем кнопку Actions и выбираем из выпадающего списка New Relation …

 

Родительская таблица главная, значит выбираем customer. Дочерняя – соответственно orders. В customer есть первичный ключ CustNo. Выбираем его среди колонок. В orders есть внешний ключ CustNo. Также выбираем его.

В итоге мы получим связь:

 

Теперь приступим к созданию шаблона отчета. Добавим бэнд «Заголовок группы». На нем разместим поля из связи: orders.customer.Company, orders.customer.Addr1, orders.customer.Phone, orders.customer.Contact.

Помимо этих полей, добавим на этот бэнд элемент управления checkbox. В его свойстве CheckedSymbol выбираем Plus, а в UncheckedSymbol – Minus.

На бэнд «Данные» добавляем поля из таблицы orders: OrderNo, SaleDate, PaymentMethod, AmountPaid. Также, добавим заголовочный бэнд для данных и заголовки полей:

Сделайте двойной клик по заголовку бэнда «Заголовок группы». Выберите поле для группировки:

 

А теперь выбираем checkbox, который мы добавили раньше. Зададим ему свойство Hyperlink:

Выберите бэнд «Заголовок группы» и создайте для него обработчик события BeforePrint:

     

1
2
3
4
5
6
7
8
9
10
11
 private void GroupHeader1_BeforePrint(object sender, EventArgs e)
 {
 string groupName = (String)Report.GetColumnValue("orders.customer.Company");
 //получаем имя группы
 bool groupVisible = expandedGroups.Contains(groupName);
 //Проверяем видимость группы
 DataHeader1.Visible = groupVisible;
 Data1.Visible = groupVisible;// Устанавливаем видимость данных в соответствии с видимостью группы
 GroupFooter1.Visible = groupVisible;// Устанавливаем видимость подвала группы в соответствии с видимостью группы 
 CheckBox1.Checked = !groupVisible;//Устанавливаем состояние флажка в зависимости от видимости группы
 }

Также, добавим в класс список развернутых групп:

1
private List<string> expandedGroups = new List<string>();

Вернемся к нашему checkbox. Для него создадим обработчик события Click:

1
2
3
4
5
6
7
8
9
private void CheckBox1_Click(object sender, EventArgs e)
 {
 string groupName = (sender as CheckBoxObject).Hyperlink.Value; //Получаем имя группы из гиперссылки
 if (expandedGroups.Contains(groupName)) //Если список видимых групп содержит выбранную группу
 expandedGroups.Remove(groupName); //То удалить из списка видимых групп выбранную
 else
 expandedGroups.Add(groupName); //Иначе добавить группу в список видимых
 Report.Refresh(); //Обновить отчет
 }

Запустим отчет в режиме предварительного просмотра:

А теперь кликнем на какой-нибудь плюс:

При клике по минусу группа свернется. Согласитесь, очень удобно.

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
1 ноября 2024

Новые возможности редактора отчетов FastReport VCL

Рассматриваем новые возможности редактора отчетов: выносные линии, подсветка пересекающихся объектов, обновлённые деревья отчетов и данных.
30 октября 2024

Использование стилей при создании отчетов в FastReport VCL

В статье подробно рассматривается одна из новых возможностей FastReport VCL – применение стилей и страниц стилей.