Выше вы рассматривали отчет, в котором присутствовала только одна полоса"Данные 1 уровня". FastReport позволяет печатать отчеты, содержащие до 6 уровней данных (можно и больше, используя объект "Вложенный отчет"). В реальных приложениях редко приходится печатать отчеты с большой вложенностью данных; как правило, ограничиваются 1-3 уровнями. Рассмотрим создание двухуровневого отчета. Он будет содержать данные из таблиц Student и Uspevaemost. Первая таблица – это список студентов, вторая – список сданных ими зачетов и экзаменов.
Чтобы получить список дисциплин, сданных студентом, из таблицы следует отобрать записи, у которых поле St_bilet = выбранному студенту.
Приступим к созданию отчета, (здесь мы слегка упростим себе задачу отказавшись от динамически генерируемых запросов). Добавим на форму DataModule Delphi два компонента TSQLTable, 1 компонент TDataSource, два компонента TfrxDBDataSet и один TfrxReport. Настроим компоненты TSQLTable таким образом, чтобы на следующим образом:
SQLTable1:
DatabaseConnection = 'MyBase'
TableName = 'Student'
SQLTable2:
DatabaseConnection = 'MyBase'
TableName = 'Uspevaemost'
DataSource1:
DataSet = SQLTable1
frxDBDataSet2:
DataSet = SQLTable1
frxDBDataSet3:
DataSet = SQLTable2
В дизайнере отчета подключим наши источники данных в меню "Report|Data…". Положим на страницу полосы MasterData("Данные 1 уровня") и DetailData ("Данные 2 уровня"). Обратите внимание – полоса "Данные 1 уровня" должна располагаться выше! Если поместить его под полосой "Данные 2 уровня", FastReport сообщит об ошибке при запуске отчета.
Разместим на них объекты отображения полей (frxMemoView) Если сейчас запустить отчет, мы увидим, что список дисциплин одинаковый для каждого студента и содержит все записи из таблицы Uspevaemost. Это произошло потому, что мы не включили фильтрацию записей в таблице Uspevaemost. Вернемся к нашим источникам данных. У компонента SQLTable2 установим свойство MasterSource = DataSource1. Таким образом мы установили связь "главный-подчиненный".
Теперь надо задать условие фильтрации записей в подчиненном источнике. Для этого вызовите редактор свойства MasterFields у компонента SQLTable2 (дважды щелкните справа от свойства MasterFields). Вам надо связать два поля St_bilet в обоих источниках. Для этого выберите индекс St_bilet в списке сверху, выберите поля и нажмите кнопку "Add". Связка полей переместится в нижнее окно. После этого закройте редактор кнопкой ОК.
При запуске отчета FastReport сделает следующее. Выбрав очередную запись из главной таблицы (Student), он установит фильтр на подчиненную таблицу (Uspevaemost). В таблице останутся только те записи, которые удовлетворяют условию Uspevaemost.st_bilet = Student.St_bilet. Т.е. для каждого студента будут показаны только его оценки:
Рисунок 5.5 Предпросмотр отчета «Главный-Детальный»
Аналогичным
образом можно строить отчеты, содержащие до 6 уровней данных.
Эстетико-дизайнерские стороны построения отчета оставляются для самостоятельной
проработки.
ПРИЛОЖЕНИЕ 1
Задания к лабораторным работам.
Задание к лабораторной работе 1.
Согласно варианту, выданному преподавателем разработать в ERWin логическую и физическую модели данных.
Задание к лабораторной работе 2.
Используя модель, созданную в предыдущей лабораторной работе, конвертировать её в *.gdb / *.fdb файл
Заполнить БД информацией (по 7-12 записей в каждую таблицу).
Написать и продемонстрировать преподавателю запросы на выборку (Select), вставку (Insert), обновление (Update), Удаление (delete).
Написать генератор и триггер, обеспечивающие автоматическое заполнение ключевых полей при добавлении данных в таблицу. Минимум один select должен работать с несколькими таблицами.
Задание к лабораторным работам 3-4.
Используя среду TurboDelphi написать для разработанной на занятии 2 БД клиентскую часть с уровнем функциональности не ниже описанного в методических указаниях (фильтрация, поиск, динамическая генерация запросов)
Задание к лабораторной работе 5.
С помощью дизайнера Fast Report Studio разработать:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.