Как я делал cross-отчет

отредактировано 01:21 Раздел: FastReport 2.xx VCL
Всем привет.

Мне пришлось недавно сделать отчет, который, на мой взгляд, получился у меня очень кривой, поэтому прошу всех посмотреть мою реализацию и указать на ошибки и/или посоветовать вообще другое решение.

Задача (упрощена): нужен автономный отчет за 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го курса" - процент этих студентов от всех в этом месяце), кварталы раскрашиваются в один цвет, а полугодия в другой, ну и не студенты там вовсе =))

Как такой отчет сделали бы вы?

Комментарии

  • отредактировано 01:21
    Если есть возможность, лучше использовать новый кросс-таб. Он сам позаботится о сортировке, суммировании и "квадратности" таблицы.
  • отредактировано 01:21
    Новый cross-tab это тот, который компонент, а не band? Я попытался, но не понял как им в моей задаче воспользоваться. У меня может быть от 0 до 12 записей в recordset'е, но в отчете должны отражаться все 12 месяцев, те, которые не присутствуют в recordset'е - заполняются нулями. Заголовки (cross-header) берутся не из recordset'а, а статически прописывются в отчете.. Если я правильно понял, то в этой задаче, для использования нового cross-tab'а, мне придется всю логику перенести в запрос и возвращать непременно 12 записей, уже с полугодиями, заголовками и т.п. Или я неправильно понимаю?
  • отредактировано 01:21
    Да, кварталы и полугодия надо возвращать в запросе.
    данные должны быть такого типа:

    1пг, 1кв, 1мес, кол-во
    1пг, 1кв, 2мес, кол-во
    1пг, 1кв, 3мес, кол-во
    1пг, 2кв, 1мес, кол-во
    1пг, 2кв, 2мес, кол-во
    1пг, 2кв, 3мес, кол-во
    2пг, 3кв, 1мес, кол-во
    ...
  • отредактировано 01:21
    Ясно, спасибо. Буду думать. =)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.