Шаг 14.
Вкладка QReport. Компонент TQRGroup

    На этом шаге мы рассмотрим компонент TQRGroup.

    Компонент TQRGroup используется для группировки информации. Его свойство Expression указывает некоторое выражение, которое и используется для группировки, иными словами, в группу входят записи, удовлетворяющие условию этого выражения. При смене выражения происходит смена группы.

    Для каждой группы обычно создается ее заголовок и подвал. В обоих случаях создается полоса TQRBand: в качестве заголовка группы со значением свойства BandType, равным rbColumnHeader, а в качестве подвала - со значением rbGroupFooter. Свойство FooterBand компонента TQRGroup должно содержать ссылку на компонент подвала группы. В заголовке группы, как правило, выводится группирующее выражение, а в подвале группы - агрегированная информация: суммарные, средние и т.п. значения по группе в целом.


    Замечание. Обычно в качестве группирующего выражения используется одно из полей НД: смена значения поля воспринимается как конец очередной группы и переход к следующей. Если НД создан компонентом TTable, необходимо создать индекс по группирующему полю и сделать его текущим. Если НД создан с помощью компонента TQuery, в нем следует отсортировать данные, включив группирующее поле первым в список полей.

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

    Вид отчета на этапе конструирования показан на рис.1.


Рис.1. Отчет с группировкой данных на этапе конструирования

    Поскольку отчет должен группировать данные по издательствам, необходимо в свойстве IndexFieldName компонента TTable1 указать поле Izdat.

    Поместим на форму компоненты:

  1. TQRBand1 типа rbTitle. На нем расположим компонент TQRLable1 со свойством Caption:='Список книг с группировкой по издательствам'.
  2. TQRBand2 типа rbColumnHeader c заголовками колонок.
  3. TQRGroup1 - она будет осуществлять группировку данных. Для этого вручную или с помощью мастера создания выражений установите в ее свойство Expression имя того поля, по которому будут группироваться данные (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 .




Предыдущий шаг Содержание Следующий шаг