На этом шаге мы рассмотрим компонент TQRGroup.
Компонент TQRGroup используется для группировки информации. Его свойство Expression указывает некоторое выражение, которое и используется для группировки, иными словами, в группу входят записи, удовлетворяющие условию этого выражения. При смене выражения происходит смена группы.
Для каждой группы обычно создается ее заголовок и подвал. В обоих случаях создается полоса TQRBand: в качестве заголовка группы со значением свойства BandType, равным rbColumnHeader, а в качестве подвала - со значением rbGroupFooter. Свойство FooterBand компонента TQRGroup должно содержать ссылку на компонент подвала группы. В заголовке группы, как правило, выводится группирующее выражение, а в подвале группы - агрегированная информация: суммарные, средние и т.п. значения по группе в целом.
Для иллюстрации группировки создадим отчет, в котором выводится список всех книг для каждого издательства, а в конце группы указывается общее количество наименований книг этого издательства.
Вид отчета на этапе конструирования показан на рис.1.
Рис.1. Отчет с группировкой данных на этапе конструирования
Поскольку отчет должен группировать данные по издательствам, необходимо в свойстве IndexFieldName компонента TTable1 указать поле Izdat.
Поместим на форму компоненты:
Одновременно эта полоса является заголовком группы, поэтому разместите на ней компоненты TQRLable1 (Caption:='Издательство') и TQRDBText (DataSet=Form1.Table1, DataField=Izdat).
Чтобы отделить заголовок группы от следующей за ним детальной информации, установите для полосы в свойство Frame.Drawbottom значение True.
За полосой заголовка группы должна размещаться детальная полоса - поместим на отчет компонент TQRBand3 типа rbDetail. На нем расположим компоненты TQRDBText2, TQRDBText3, TQRDBText4, и с помощью свойства DataField свяжем их с полями НД.
Для формирования итогов по группе - поместим на отчет компонент TQRBand4 типа rbGroupFooter, а чтобы полоса заголовка группы "знала", где следует размещать групповые итоги, сошлитесь на новую полосу в значении FooterBand компонента TQRGroup1. Поместите на полосу подвала группы компоненты TQRLable2 (Caption:='Итого наименований') и TQRExpr (Expression=COUNT).
Если вы выполните прогон программы, то заметите, что количество книг указано верно только для первого издательства. Связано это с тем, что компонент TQRExpr, ответственный за этот вывод, показывает текущий счетчик книг, а не сумму книг в группе. Чтобы сумма книг выводилась верно, необходимо доработать программу. Для этого компонент TQRExpr заменим на TQRLable, введем глобальную переменную N и напишим два обработчика событий OnBeforePrint для полосы заголовка группы и детальной полосы. В первом обработчике счетчик N обнуляется, готовясь к подсчету количества книг очередной группы, во втором - наращивается на единицу при выводе данных об очередной книге.
procedure TForm2.QRBand4BeforePrint(Sender:TQRCustomBand; var PrintBand: Boolean); begin QRLabel7.Caption:=IntToStr(n); n:=0; end;
procedure TForm2.QRBand3BeforePrint(Sender:TQRCustomBand; var PrintBand: Boolean); begin inc(n); end;
После выполнения программы отчет должен содержать следующее:
Рис.2. Отчет в окне предварительного просмотра
Текст этого примера можно взять здесь.
На следующем шаге мы рассмотрим компонены TQRRichText и TQRDBRichText .