Как я делал cross-отчет
Всем привет.
Мне пришлось недавно сделать отчет, который, на мой взгляд, получился у меня очень кривой, поэтому прошу всех посмотреть мою реализацию и указать на ошибки и/или посоветовать вообще другое решение.
Задача (упрощена): нужен автономный отчет за 2003 год (один .frf) вида
Кол-во экзаменов|I|II|III|1кв|IV|V|VI|2кв|1пг|...|Всего
"Кол-во экзаменов" - cross header
I..XII - месяцы
1кв..4кв - кварталы
1пг..2пг - полугодия
"Всего" - всего за год
Есть таблица в базе данных ExamTable: ID|ExamDate|StudentID
Вот собственно все исходные данные.
Мое решение выглядит так:
Запрос к базе:
SELECT DatePart(m,ExamDate) AS Month, Count(*) AS NumPeople FROM ExamTable GROUP BY DatePart(m,ExamDate)
запрос может вернуть от 0 до 12 записей (Месяц|Количество экзаменов в этом месяце)
В ReportHeader.OnBeforePrint создается массив из 19 элементов (12 месяцев + 4 квартала + 2 полугодия + "всего"), номера элементов соответствуют номеру колонки, т.е. Array[4] - колонка для первого квартала. Массив заполняется вручную данными из запроса, вручную расчитываются кварталы, полугодия и "всего". В MasterData бэнде указывается VirtualDataset с 1 записью, а в CrossData бэнде указывается VirtualDataset c 19 записями. В memo поля, которое лежит на CrossData пишется [Array[COLUMN#]]
Вот, собственно..
Реальный отчет почти такой-же, но там не только "Кол-во экзаменов" но и еще другие строки, под каждой еще строка с процентами (например под строкой "Количество студентов 1го курса" - процент этих студентов от всех в этом месяце), кварталы раскрашиваются в один цвет, а полугодия в другой, ну и не студенты там вовсе )
Как такой отчет сделали бы вы?
Мне пришлось недавно сделать отчет, который, на мой взгляд, получился у меня очень кривой, поэтому прошу всех посмотреть мою реализацию и указать на ошибки и/или посоветовать вообще другое решение.
Задача (упрощена): нужен автономный отчет за 2003 год (один .frf) вида
Кол-во экзаменов|I|II|III|1кв|IV|V|VI|2кв|1пг|...|Всего
"Кол-во экзаменов" - cross header
I..XII - месяцы
1кв..4кв - кварталы
1пг..2пг - полугодия
"Всего" - всего за год
Есть таблица в базе данных ExamTable: ID|ExamDate|StudentID
Вот собственно все исходные данные.
Мое решение выглядит так:
Запрос к базе:
SELECT DatePart(m,ExamDate) AS Month, Count(*) AS NumPeople FROM ExamTable GROUP BY DatePart(m,ExamDate)
запрос может вернуть от 0 до 12 записей (Месяц|Количество экзаменов в этом месяце)
В ReportHeader.OnBeforePrint создается массив из 19 элементов (12 месяцев + 4 квартала + 2 полугодия + "всего"), номера элементов соответствуют номеру колонки, т.е. Array[4] - колонка для первого квартала. Массив заполняется вручную данными из запроса, вручную расчитываются кварталы, полугодия и "всего". В MasterData бэнде указывается VirtualDataset с 1 записью, а в CrossData бэнде указывается VirtualDataset c 19 записями. В memo поля, которое лежит на CrossData пишется [Array[COLUMN#]]
Вот, собственно..
Реальный отчет почти такой-же, но там не только "Кол-во экзаменов" но и еще другие строки, под каждой еще строка с процентами (например под строкой "Количество студентов 1го курса" - процент этих студентов от всех в этом месяце), кварталы раскрашиваются в один цвет, а полугодия в другой, ну и не студенты там вовсе )
Как такой отчет сделали бы вы?
Комментарии
данные должны быть такого типа:
1пг, 1кв, 1мес, кол-во
1пг, 1кв, 2мес, кол-во
1пг, 1кв, 3мес, кол-во
1пг, 2кв, 1мес, кол-во
1пг, 2кв, 2мес, кол-во
1пг, 2кв, 3мес, кол-во
2пг, 3кв, 1мес, кол-во
...