Разработка баз данных в Delphi. 11 Уроков

       

Построение отчета главный-детальный


Если необходимо построить отчет на основе более чем одной ТБД, можно поступить двумя способами:

1.     с помощью компонента TQuery произвести соединение данных из нескольких таблиц БД в один НД, после чего определить в отчете нужные группировки;

2.     создать в приложении по одному НД на каждую таблицу, соединить эти наборы между собой связью главный-детальный (используя свойства MasterSource, MasterFields набора данных) и применить в отчете компонент (или несколько компонентов) TQRSubDetail для вывода информации из детального НД (или группы детальных НД); для вывода информации из главного НД, как и в обычных отчетах, применяется компонент TQRBand, у которого в свойстве BandType установлено значение rbDetail.

Построение отчета для первого случая осуществляется аналогично тому, как это описано выше. Построение отчета для второго случая имеет некоторые отличительные особенности. Рассмотрим второй способ.

Компонент TQRSubDetail предназначен для показа в отчете информации из детального НД. Его свойство

 

Property DataSet: TDataSet;

указывает имя детального НД, информация из которого будет выводиться в пространстве компонента TQRSubDetail. В остальном использование этого компонента аналогично использованию компонента TQRBand, у которого в свойство BandType установлено значение rbDetail.

Пусть имеется таблица БД TOVARY.DB, содержащая помимо прочих поле TOVAR (название товара). Пусть также имеется таблица БД RASHOD.DB, содержащая сведения об отпуске материалов со склада. В ее состав входят поля N_RASH (уникальный номер события отпуска товара), DEN (номер дня), MES (номер месяца), GOD (номер года), TOVAR (наименование отпущенного товара), POKUP (наименование покупателя) и KOLVO (количество единиц отпущенного товара).

Таблицы TOVARY.DB и RASHOD.DB находятся в отношении один-ко-многим, то есть одному товару может соответствовать более одного факта отпуска товара со склада.

Разместим на форме компонент TTable (им TovaryTable), ассоциированный с ТБД TOVARY.DB, и связанный с ним компонент TDataSource


(имя DS_TovaryTable). Разместим также еще один компонент TTable (им RashodTable), ассоциированный с ТБД RASHOD.DB, и установим между НД связь главный-детальный. Для этого установим в свойство RashodTable.MasterSource значение DS_TovaryTable, а в свойство RashodTable.MasterFields значение TOVAR (рис.19).

Рис. 19. Установка связи главный-детальный.
Заметим, что после установления связей НД и НД RashodTable текущим индексом должен быть индекс по полю Tovar (свойство RashodTable.IndexFieldNames).
Приступим к разработке отчета. Определим заголовок отчета – компонент TQRBand с именем QRBand1, в свойство BandType которого установлено значение rbTitle. Установим в качестве основного НД отчета TovaryTable, указав QuickRep1.DataSet = TovaryTable. Разместим в отчете компонент TQRBand с именем QRBand2 и установим в его свойство BandType значение rbDetail. Этот компонент будет использоваться для отображения детальной информации из НД TovaryTable.
Разместим в отчете компонент TQRSubTetail (имя QRSubDetail). Установим в его свойство DataSet значение RashodTable, связав таким образом данный компонент с подчиненным НД. Разместим в области компонента QRSubDetail три компонента TQRDBText и свяжем их соответственно с полями Pokup, Kolvo и D НД RashodTable (поле D определено в НД RashodTable  как вычисляемое по значениям полей DEN, MES, GOD). Разместим в области компонента QRBand2 заголовки столбцов.
Вид формы отчета показан на рис.20.

Рис. 20. Макет отчета, в котором показываются записи из связанных наборов данных.
В результирующем отчете (рис.21) для каждой записи НД TovaryTable выводятся подчиненные ей записи из НД RashodTable.

Рис. 21. Отчет, в котором показываются записи из связанных наборов данных.
Замечание.
Если необходимо определить заголовок и подвал для информации, группируемой в компоненте TQRSubDetail, следует воспользоваться свойством
property Bands: TQRSubDetailGroupBands;
 
этого компонента, которое имеет два логических подсвойства (HasHeader и HasFooter), указывающих на наличие или отсутствие соответственно заголовка и подвала.

Содержание раздела