Сложный отчёт с группировкой по строкам и столбцам

Обсуждение Stimulsoft Reports.WEB
Ответить
gustav
Сообщения: 10
Зарегистрирован: 28 мар 2019, 07:05

Сложный отчёт с группировкой по строкам и столбцам

Сообщение gustav »

Добрый день.
Стоит задача сделать отчёт такого вида (см. вложение).
Данные для отчёта я формирую в C#, поэтому структуру данных можно сделать любую. Но я так и не смог понять, как можно построить такой отчёт в дизайнере. Мои соображения:
  1. Можно делать простую структуру данных типа таблицы БД, то есть список строк со столбцами Кампания-Тип-ТС-Агрегат-Маршрут-Поля-Смена-ФИО1-ФИО2. В этом случае в дизайнере нужно как-то группировать эти строки сначала по кампании, потом по типу, потом по полям + размещать ФИО в одной строке по сменам. Кросс-таблица вроде не подходит - тут нет суммарных данных, просто группировка. Как по-другому можно сформировать такой вид отчёта при такой структуре данных я не понял.
  2. Можно делать сложную структуру данных, например:

Код: Выделить всё

public class Activity
{
	public string TS { get; set; }
	public string Aggregat { get; set; }
	public string Route { get; set; }
	public string Driver { get; set; }
	public string Responsible { get; set; }
	public string Smena { get; set; }
}

public class ByFields
{
	public string Fields { get; set; }
	public List<Activity> Activities { get; set; }
}

public class ByTypes
{
	public string Type { get; set; }
	public List<ByFields> Fields { get; set; }
}

public class ByCampaigns
{
	public string Campaign { get; set; }
	public List<ByTypes> Types { get; set; }
}
В этом случае я думал размещать DataBand верхнего уровня с источником ByCampaigns. На бэнде свойство Campaign и вложенный DataBand (в помощью панели) с источником Types. Далее рекурсия - внутри бэнда для Types наименование типа (Type) и панель с бэндом для Fields. Внутри бэнда Fields уже последний бэнд - собственно для строк с данными по ТС, агрегату и маршруту. Тут же можно попробовать разбить колонки по сменам с помощью CrossDataBand (но тут интуитивно - с этим я ещё не разбирался).

Может быть, у более опытных пользователей есть лучшие варианты решения проблемы? Заранее спасибо.
Вложения
Макет.png
Макет.png (108.71 КБ) 4114 просмотров
gustav
Сообщения: 10
Зарегистрирован: 28 мар 2019, 07:05

Re: Сложный отчёт с группировкой по строкам и столбцам

Сообщение gustav »

Как всегда, всё оказалось достаточно просто.

Группировку по строкам можно делать просто установив свойство "Обработка дубликатов" у текстового элемента. Только надо будет при формировании данных для отчёта расположить строки так, чтобы ячейки с одинаковыми значениями располагались рядом. Вот и всё.

Что касается разделения столбцов по сменам (в моём примере), то это, как я и предполагал, буду пытаться делать с помощью CrossDataBand.
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Сложный отчёт с группировкой по строкам и столбцам

Сообщение Aleksey »

Здравствуйте,

Спасибо за информацию о решении проблемы.

Спасибо.
gustav
Сообщения: 10
Зарегистрирован: 28 мар 2019, 07:05

Re: Сложный отчёт с группировкой по строкам и столбцам

Сообщение gustav »

Небольшой отчёт по решению проблемы. Реальный mrt прикреплять не буду, а пример делать нет времени. Расскажу на словах.
gustav писал(а): 29 мар 2019, 09:51 Группировку по строкам можно делать просто установив свойство "Обработка дубликатов" у текстового элемента. Только надо будет при формировании данных для отчёта расположить строки так, чтобы ячейки с одинаковыми значениями располагались рядом.
Можно. И даже не надо ничего делать на стороне формирования данных - можно в самом отчёте отсортировать данные сначала по первому столбцу, потом по второму и так для всех, которые нужно объединять, тогда одинаковые значения окажутся рядом.
Но тут другая проблема - если, например, в строке для кампании 2 (см. скриншот в стартовом посте) первый тип операции будет не Тип 1, а Тип 2 - тогда эта ячейка объединится с предыдущей ячейкой "Тип 2" для кампании 1, хотя по идее не должна, так как они относятся к разным кампаниям. Это можно обойти так: в свойстве "Обработка дубликатов" нужно указать не "Соединить" , а "Соединить в зависимости от свойства Тег". А в свойстве Тег (это Поведение - Взаимодействие - Тег) прописать что-то уникальное в рамках нужной группировки. Например, для кампании я оставил просто "Соединить", так как на самом верхнем уровне такой ошибки быть не может. Для типа операции я указал в теге значение из источника для кампании и для типа. Для "Поля" - значения для кампании, типа и поля. Таким образом, соседние ячейки для разных строк предыдущего уровня группировки будут иметь разный Тег (даже если имеют одинаковое значение) и соответственно объединяться не будут.
gustav писал(а): 29 мар 2019, 09:51 Что касается разделения столбцов по сменам (в моём примере), то это, как я и предполагал, буду пытаться делать с помощью CrossDataBand.
Собственно, так и сделал. Только сделал подходящую структуру данных. В строке Водитель - это массив строк по количеству смен. Аналогично для Ответственного. Соответственно, для CrossDataBand указываю в качестве источника нужный массив. Кроме этого в свойствах CrossDataBand нужно ещё настроить Связь и Мастер компонент, чтобы данные брались только для текущей строки. Пример, как это делать, есть вот тут (см. вложение Report2.mrt).

И ещё была проблема с заголовком для Водителя и Ответственного. Решение предложил вот тут.
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Сложный отчёт с группировкой по строкам и столбцам

Сообщение Aleksey »

Здравствуйте,

Спасибо за дополнительную информацию.
Ответить