Генератор отчетов в Rave Reports


НазадСодержаниеВперед

Отчеты для приложений баз данных

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

Приложение может воспользоваться соединением, предоставленным генератором отчетов, созданным и настроенным в проекте отчета, а также может использовать компоненты Rave Reports, которые обеспечивают передачу данных в отчет.

При помощи компонентов и визуальной среды генератора отчетов Rave Reports приложение баз данных может использовать базы данных, обращаясь к ним при помощи трех технологий доступа к данным (подробнее о технологиях доступа к данным см. часть IV), доступных по умолчанию.

Кроме этого, компонент TRvDataSetConnection (без участия визуальной среды) позволяет использовать любые наборы данных, открываемые через компоненты доступа к данным Delphi. Любой потомок компонента TDataSet может быть использован в отчете Rave Reports. Это означает, что дополнительно к перечисленным технологиям отчеты Rave Reports могут использовать компоненты InterBase Express (см. гл. 18), а также подключать клиентские наборы данных в распределенных приложениях (см. часть IV).

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

Что касается элементов оформления отчетов средствами визуальной среды Rave Reports, можно создавать отчеты самых различных типов. Естественно, это простые табличные отчеты, а также отчеты, представляющие данные в отношении "один-ко-многим", отчеты с группировкой данных, отчеты с вычисляемыми значениями.

В этой главе рассматриваются следующие вопросы: 

Соединения с источниками данных в Rave Reports

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

В Rave Reports существуют два типа соединений с источниками данных (рис. 26.1):

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

При соединении через драйвер Rave Reports проект отчета на этапе разработки и ядро генератора отчетов на этапе выполнения используют драйверы, которые реализованы в виде файлов с расширением rvd. Именно наличие этих файлов предопределяет выбор технологий доступа к данным при создании объекта соединения в среде разработки (рис. 26.2). В стандартную поставку Rave Reports 5.0 входят драйверы для следующих технологий доступа к данным:

Рис. 26.1. Соединения с источниками данных в отчете Rave Reports

При соединении через компоненты в Delphi сначала необходимо создать объект просмотра Direct Data View, который реализует прямой доступ к набору данных на основе активного соединения в приложении Delphi. При этом соединение может быть создано на основе любой доступной в Delphi технологии доступа к данным. Это позволяет сделать набор компонентов Rave Reports на странице Rave Палитры компонентов Delphi. Это следующие технологии доступа к данным:

За визуализацию данных в отчете отвечают специализированные элементы оформления, расположенные на странице Report Палитры инструментов визуальной среды Rave Reports. Они связываются с полями объекта просмотра данных, созданного разработчиком. Это может быть просмотр на основе запроса SQL, созданного разработчиком, или прямой просмотр набора данных Delphi. Просмотр объединяет нужные поля из таблиц, которые доступны через соединение с источником данных (см. гл. 24). Для этого используется свойство Dataview элементов оформления.

Соединения с источниками данных в визуальной среде Rave Reports

Любой отчет, работающий с базами данных, должен быть настроен соответствующим образом в визуальной среде создания отчетов Rave Reports. Независимо от типа соединения здесь должен быть создан хотя бы один объект доступа к данным.

Если вы хотите создать соединение через драйверы Rave Reports, вам потребуется объект соединения и связанный с ним объект просмотра на основе запроса SQL.

При необходимости использовать соединение на основе компонентов Delphi в визуальной среде вам потребуется создать объект прямого просмотра.

Рассмотрим подробнее действия, которые необходимо выполнить в визуальной среде Rave Reports для создания и настройки соединения.

Соединение через драйвер Rave Reports

Проект, отчеты которого используют соединение через драйверы Rave Reports, должен содержать два объекта доступа к данным (в дереве проекта они отображаются в ветви Data View Dictionary).

В первую очередь нужно создать объект соединения (компонент Database). Для этого используется команда File | New Data Object главного меню. В появившемся диалоге Data Connections (см. рис. 24.4) необходимо выбрать Database Connection и нажать кнопку Next — появится список Database Connection Type (рис. 26.2). В нем представлены все доступные в визуальной среде типы соединений. Элементы списка соответствуют файлам RDV драйверов соединений. В стандартную поставку входят драйверы для соединений ADO, BDE, dbExpress. Эти файлы по умолчанию устанавливаются в папке \Delphi7\Rave5\DataLinks.

После нажатия кнопки Finish появляется специализированный диалог настройки параметров соединения, типовой для выбранной технологии доступа к данным (см. часть IV), и создается новый объект соединения. В его свойствах AuthDesign и AuthRun содержатся настройки соединения, которые используются при его открытии на этапах разработки и выполнения отчета соответственно.

Теперь, когда соединение готово, необходимо создать просмотр данных. Он формирует набор данных, который будет передан в отчет и там связан с элементами оформления (см. рис. 26.1).

Рис. 26.2. Диалог выбора драйвера соединения

В диалоге выбора объекта доступа к данным (см. рис. 24.4) используются два объекта просмотра. Но с соединением на основе драйвера Rave Reports умеет взаимодействовать только один из них — Driver Data View. Для него необходимо выбрать соединение из созданных ранее в этом проекте (рис. 26.3).

Рис. 26.3. Список выбора соединения для просмотра Driver Data View

После этого в редакторе Query Advanced Designer (см. рис. 24.5) создается запрос SQL, используемый для создания набора данных просмотра. Подробнее о пользовательском интерфейсе этого редактора рассказывается в гл. 24.

После создания объекта просмотра (компонент DriverDataview) в его свойстве Database появляется ссылка на объект выбранного соединения, а свойство Query позволяет редактировать запрос SQL просмотра. Для этого используется все тот же редактор Query Advanced Designer. Соединение просмотра можно изменить, выбрав новое в списке свойства Database, однако при этом может потребоваться частично или полностью переписать запрос SQL.

В состав объекта просмотра входят объекты всех полей, определенных на этапе разработки для запроса SQL.

Теперь подготовленный в просмотре набор данных можно подключить к элементам оформления нужного отчета (см. разд. "Типы отчетов" ниже в данной главе).

Соединение через компонент приложения Delphi

Второй тип соединения базируется на компоненте набора данных, который уже существует и соединен с источником данных в приложении Delphi. Основой такого соединения в приложении является один из специализированных компонентов со страницы Rave Палитры компонентов Delphi — например, компонент TRvDataSetConnection. В проекте отчета в визуальной среде Rave Reports соединение обеспечивает объект просмотра Direct Data View. При создании объекта прямого просмотра для него необходимо выбрать из списка одно из соединений из приложения Delphi, в котором будет использоваться проект отчета. В этом списке можно выбрать все соединения, доступные как во время разработки, так и во время выполнения приложения. Для этого используются флажки в нижней части окна (рис. 26.4).

Рис. 26.4. Список доступных соединений из приложения Delphi

После создания объект прямого просмотра (компонент DataView) доступен в дереве проекта и может быть использован. В его состав входят все поля набора данных, связанного в приложении Delphi с компонентом соединения. И их можно подключить к элементам оформления нужного отчета (см. разд. "Типы отчетов" ниже в данной главе).

Соединения с источниками данных в приложении

Теперь давайте посмотрим, как нужно использовать специализированные компоненты Rave Reports в приложениях Delphi для того, чтобы создать соединение отчета с источником данных. Их основная задача — передать в отчет связанный набор данных.

Для создания соединения можно использовать следующие компоненты:

После переноса на форму проекта Delphi эти компоненты становятся доступны для выбора при создании прямых просмотров Direct Data View в визуальной среде создания отчетов Rave Reports. Однако перед этим компонент соединения необходимо связать с набором данных.

Компонент TRvDataSetConnection

Компонент TRvDataSetConnection позволяет отчету получить доступ к наборам данных, инкапсулированных в любых компонентах, произошедших от класса TDataSet. Это открывает перед разработчиком самые широкие возможности по созданию отчетов для любых приложений баз данных и распределенных приложений.

Сразу после переноса на форму компонент становится доступным в визуальной среде Rave Reports при создании объекта прямого просмотра. Однако толк от ненастроенного соединения пока небольшой. Сначала его нужно связать с компонентом набора данных. Для этого предназначено свойство

property DataSet: TDataSet;

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

Впрочем, еще несколько вспомогательных свойств могут дать разработчику дополнительные удобства.

Примечание 

Здесь мы рассмотрим только часть свойств и методов. Компонент TRvDataSetConnection обладает большой группой свойств и методов, которые, будучи использованы в методах-обработчиках событий, позволяют дополнительно оформлять отчет. Более детально эти свойства и методы рассматриваются ниже в разд. "Компонент TRvCustomConnection" данной главы.

Свойство

property FieldAliasList: TStrings;

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

Методы-обработчики событий компонента отслеживают процесс навигации по набору данных при печати отчета.

При открытии соединения для создания отчета генератором отчетов вызывается метод-обработчик

type

TRPConnectorEvent = procedure(Connection: TRvCustomConnection); 

property OnOpen: TRPConnectorEvent;

При открытии соединения отчет требует передать ему информацию о структуре набора данных (метаданные). Компонент соединения делает это и вызывает метод-обработчик

property OnGetCols: TRPConr.ectorEvent;

Когда курсор устанавливается на первую строку набора данных, вызывается метод-обработчик

property OnFirst: TRPConnectcrEvent;

а при перемещении на следующую запись можно использовать метод

property OnNext: TRPConnectorEvent;

Если генератор отчетов нашел нужную запись и считал ее для представления в отчете, для отслеживания этого события разработчик может использовать метод

property OnGetRow: TRPConnectorEvent;

При достижении последней записи набора вызывается метод-обработчик

type

TRPEOFEvent = procedure(Connection: TRvCustomConnection; var Eof: Boolean); 

property OnEOF: TRPEOFEvent;

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

property OnRestore: TRPConnectorEvent;

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

Перед началом сортировки и фильтрации и после их завершения вызываются пары методов-обработчиков

property OnGetSort: TRPConnectorEvent;

property OnSetSort: TRPConnectorEvent;

И

property OnGetFilter: TRPConnectorEvent; 

property OnSetFilter: TRPConnectorEvent;

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

type

TRPValidateRowEvent = procedure(Connection: TRvCustomConnection;

var ValidRow: Boolean);

property OnValidateRow: TRPValidateRowEvent;

Параметр ValidRow управляет отправкой отдельной записи отчету: при значении True запись пропускается в отчет.

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

procedure TForml.RvSomeConValidateRow(Connection: TRvCustomConnection;

 var ValidRow: Boolean); 

begin

with TRvDataSetConnection(Connection) do

ValidRow :=DataSet.FieldByName('Area').AsInteger > 1000000; 

end;

Компоненты, использующие BDE

В состав набора компонентов соединений Rave Reports включены два компонента, которые обеспечивают связь прямого просмотра в проекте отчета с набором данных BDE.

Компонент TRvTableConnection работает с компонентом TTаblе. Для связывания с таблицей BDE используется свойство

property Table: TTable; 

Еще одно свойство

property UseSetRange: Boolean;

при значении True определяет, что при создании отчета будут использованы механизмы фильтрации и сортировки компонента TTаblе.

Компонент TRvQueryConnection работает с компонентом TQuery.

Свойство

property Query: TQuery;

задает компонент TQuery.

Остальные свойства и методы этих компонентов соответствуют компоненту TRvDataSetConnection.

Компонент TRvCustomConnection

Компонент TRvCustomConnection обеспечивает доступ к самым разнообразным источникам данных. Фактически через этот компонент разработчик может передать в отчет все данные, какие только сможет загрузить в приложение. Причина столь удивительной универсальности кроется в том, что:

Повторим банальную истину, что чудес не бывает, и, как видите, за гибкость приходится расплачиваться дополнительным объемом работы.

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

1. Определить число строк отчета и установить его в компоненте.

2. Создать структуру данных отчета (метаданные). Здесь нужно решить, какие именно поля будут присутствовать в отчете, в каком порядке, дать им названия и определить их тип данных.

3. Создать процедуру, обеспечивающую передачу данных из источника данных в текущую строку отчета.

4. Связать компонент соединения с объектом прямого просмотра.

Обсудим эту последовательность действий более детально на простом примере. Создадим небольшое приложение, которое позволяет загружать текстовые файлы в два компонента TMemo. Перенесем на форму и настроим все необходимые компоненты Rave Reports.

Затем разработаем отчет, который печатает данные из этих двух компонентов в двух колонках. Отчет тоже несложен и состоит из полос заголовка и окончания, а также полосы данных с расположенными на ней двумя элементами Оформления DataText.

Наша задача сейчас — настроить компонент TRvCustomConnection так, чтобы он мог отображать данные из двух компонентовTMemo.

Листинг 26.1. Методы -обработчики событий компонента TRvCustomConnection,  обеспечивающего соединение отчета с массивами Memo

procedure TfmMain.rcCustomOpen(Connection: TRvCustomConnection);

 begin

Connection.DataRows := Max(meLeft.Lines.Count, meRight.Lines.Count);

i := 0;

  end;

procedure TfmMain.rcCustomGetCols(Connection: TRvCustomConnection); 

begin

Connection.WriteField('LeftColumn', dtString, 40, 'LeftColumn', '');

Connection.WriteField('RightColumn1, dtString, 40, 'RightColumn1, '');

  end;

procedure TfmMain.rcCustomGetRow(Connection: TRvCustomConnection);

 begin

if meLeft.Lines.Count >= i

then Connection.WriteStrData('', meLeft.Lines[i])

 else Connection. WriteNullData; if meRight.Lines.Count >= i

then Connection.WriteStrData('', meRight.Lines[i])

 else Connection. WriteNullData; 

Inc(i); 

end;

При открытии соединения в методе-обработчике onopen рассчитывается число записей, необходимое для отображения наиболее длинного из двух файлов.

Метод-обработчик onGetCols вызывается, когда отчету необходимы метаданные о наборе данных соединения. Здесь создаются два поля.

Для этого используется метод

procedure WriteField(Name: String; DataType; TRPDataType; Width: Integer; FullName: String; Description: String);

который создает поле в соответствии с переданными в нем параметрами.

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

function WriteBCDData(FormatData: String; NativeData: Currency): String;

function WriteBlobData(var: Buffer; Len: Longint): String;

function WriteBoolData(FonnatCata: String; NativeData: Boolean): String;

function WriteCurrData(FormatData: String; NativeData: Currency): String;

function WriteDateTime(FormatData: String; NativeData: TDateTime);

function WriteFloatData(FomatData: String; NativeData: Extended): String;

function WritelntData(FormatData: String; NativeData: Integer): String;

function WriteNullData;

function WriteStrData(FormatData: String; NativeData: String): String;

Обратите внимание, что все эти методы не определяют, какому именно полю будет присвоено значение. Поэтому присваивание осуществляется в порядке следования полей: первый по порядку метод отправляет в отчет значение для первого поля, второй для второго и т. д.

Примечание 

Методы-обработчики компонентов TRvCustomConnection и TRvDataSetConnection совпадают (см. выше разд. "Компонент TRvDataSetConnection" данной главы).

Теперь осталось связать соединение с проектом отчетов. Это делается стандартным образом — при создании объекта прямого просмотра. Но здесь есть одна особенность. Как уже говорилось выше, при создании прямого просмотра в нем автоматически создаются объекты полей, соответствующие полям набора данных. И теперь мы знаем, что у компонента соединения имеется специальный метод-обработчик OnGetCols, который вызывается при создании полей.

Однако, если вы создадите объект прямого просмотра обычным способом, визуальная среда Rave Reports создаст один-единственный объект поля, не имеющего ничего общего с реальными метаданными. Для того чтобы поля импортировались в проект отчета правильно, необходимо, чтобы при создании объекта просмотра приложение, содержащее компонент TRvDataSetConnection, было запущено. Тогда в диалоге выбора соединений (см. рис. 26.4) необходимо включить флажок Runtime, и вы увидите компонент нужного соединения. В этом случае объект прямого просмотра получит все необходимые поля, которые затем следует связать с элементами оформления отчета.

Аутентификация пользователя в отчете

Два объекта Rave Reports позволяют включить в проекте отчета механизм проверки имени пользователя и пароля. Это объекты Simple Security Controller (элемент simpleSecurity) и Data Lookup Security Controller (элемент LookupSecurity), которые доступны для выбора в диалоге создания объектов доступа к данным визуальной среды Rave Reports (см. рис. 24.4). Создается новый объект командой File | New Data Object главного меню Rave Reports. Созданный объект появляется в ветви Data View Dictionary дерева проекта.

Элемент SimpleSecurity предназначен для хранения списка пользователей и их паролей. Он имеет свойство userList, в котором в формате userName = Password заносятся имена и пароли пользователей.

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

Теперь несколько слов о том, как подключить созданные объекты.

Вы можете организовать аутентификацию на двух уровнях — уровне проекта и уровне отчета. В обоих случаях используется свойство securityControl объекта проекта или отчета. В нем необходимо выбрать нужный объект аутентификации.

Однако это действие не сделает ваши отчеты сколько-нибудь защищеннее — все необходимые проверочные операции придется написать самому в исходном коде приложения Delphi. Единственное отличие в аутентификации по уровням в том, где именно вы сможете получить доступ к объекту аутентификации — из компонента проекта или отчета.

Для организации простейшей проверки имени пользователя и пароля на уровне проекта в приложении нужно написать примерно такой код:

rpReport.Open; if rpReport.ProjMan.SecurityControi.IsValidUser(

edUserName.Text, edPassword.Text} 

then rpReport.Execute

 else ShowMessage('Доступ запрещен');

  rpReport.Close;

В данном случае доступ к объекту аутентификации SecurityControд (класс TRaveBaseSecurity) осуществляется через объект менеджера проекта projMan (класс TRaveProjectManager).

Метод

function IsValidUser(AUserName: string;

APassword: string): Boolean;

этого объекта возвращает значение True, если переданные в параметрах имя и пароль не совпадают со значениями из списка или базы данных.

Для уровня отчета код выглядит так:

rpReport.Open;

if rpReport.ProjMan.ActiveReport.

SecurityControl.IsValidUser(

edUserName.Text, edPassword.Text) 

then rpReport.Execute

 else ShowMessage('Доступ запрещен');

rpReport.Close;

Здесь объект ActiveReport (класс TRaveReport) представляет текущий отчет.

Типы отчетов

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

Для всех рассматриваемых типов отчетов создано демонстрационное приложение DemoReports.

Простой табличный отчет

Для создания отчетов, использующих данные из источников, предоставленных объектами соединений и просмотров, используются элементы оформления со страницы Report Палитры инструментов Rave Reports.

Основой, без которой нельзя использовать полосы (элементы Band и DataBand), является элемент Region. Он ограничивает часть страницы, на которой будут печататься данные.

Главную роль в отчетах для приложений баз данных играют полосы. Это невизуальные элементы оформления, моделирующие горизонтальную область или строку отчета. На странице Report доступны два таких элемента. Обычная полоса Band создает горизонтальную область, которая не изменяет свое абсолютное или относительное положение на странице. Например, созданная на основе элемента Band полоса TitleBand всегда располагается в начале первой страницы отчета и оформляет заголовок таблицы (рис. 26.5). Полоса FooterBand будет напечатана сразу после основной таблицы — но ее конкретное положение на странице зависит от размера набора данных.

Рис. 26.5. Страница простого табличного отчета в визуальной среде Rave Reports

Элемент оформления DataBand обеспечивает размножение строк отчета в соответствии с числом строк набора данных. Для этого полосу данных MainDataview необходимо связать с просмотром при помощи свойства Dataview. В нашем примере это прямой просмотр countryview, связанный с компонентом соединения TRvDataSetConnection в приложении.

На полосе данных MainDataview необходимо разместить элементы оформления DataText. Каждый из этих элементов связывается с объектом просмотра и полем данных такого просмотра. Для этого используются свойства Dataview и DataField соответственно. Таким образом, каждый элемент оформления DataText размножается вместе с полосой данных и формирует в отчете колонку значений поля набора данных.

Расположив на полосах горизонтальные и вертикальные линии, можно легко оформить данные в табличном виде.

Отчет "один-ко-многим"

При помощи средств Rave Reports можно создавать и более сложные отчеты. В приложениях баз данных очень часто используются отношения "один-ко-многим" между наборами данных.

Давайте посмотрим, как создать отчет "один-ко-многим". Само собой, он должен быть связан как минимум с двумя просмотрами, которые находятся в отношении "один-ко-многим".

Для компонентов наборов данных в Delphi не нужно создавать отношение "один-ко-многим"— речь идет о том, что их поля позволяют такое отношение создать теоретически.

Подобно рассмотренному выше простому отчету, отчет "один-ко-многим" может содержать полосы Band и DataBand. Причем дополнительные настройки необходимы для обоих типов полос. Число полос DataBand должно соответствовать числу используемых в отчете наборов данных. Полосы Band несут в основном оформительскую нагрузку, и их число зависит от эскиза отчета и вашей фантазии.

В качестве примера создадим отчет для двух таблиц из демонстрационной базы данных Delphi. Таблицы CUSTOMER и ORDERS находятся в отношении "один-ко-многим". Для них в тестовом приложении создано соединение с использованием ADO, и два табличных компонента ADO подключены r компонентам соединения TRvDataSetConnection.

Соответственно полоса данных CustBand будет отображать записи из набора данных tCustomer, а полоса ordBand — из набора данных torders (рис. 26.6). Их необходимо связать с объектами прямых просмотров, как уже описывалось выше для примера простого отчета.

Рис. 26.6. Страница отчета MasterDetailReport в визуальной среде Rave Reports

А теперь займемся созданием отношения "один-ко-многим".

В подчиненной полосе данных ordBand необходимо задать значения для четырех свойств.

Кроме этого, необходимо настроить атрибуты местоположения полос на странице отчета. Для этого используется Редактор полос отчета Band Style Editor (рис. 26.7), который открывается при щелчке на кнопке свойства Bandstyle Инспектора объектов визуальной среды Rave Reports. В нем в группе Print Location для подчиненной полосы ordBand необходимо установить флажок Detail.

Рис. 26.7. Редактор полос отчета Band Style Editor для отчета MasterDetailReport

На этом настройка отношения "один-ко-многим" завершена. Однако скажем еще несколько слов об использовании обычных полос при оформлении такого рода отчетов. В нашем примере две дополнительные полосы OrdHeaderBand и OrdFooterBand помогают визуально выделить группы записей подчиненной полосы. Для этого необходимо в их свойстве controiierBand выбрать полосу данных OrdBand. Затем в редакторе полос отчета в группе Print Location для полосы OrdHeaderBand необходимо выбрать флажок Body Header (В), а для полосы OrdFooterBand — флажок Body Footer (b).

Обратите внимание (см. рис. 26.6 и 26.7), что значки маркировки на полосах страницы и в редакторе полос наглядно демонстрируют текущий статус полосы. Цветом выделены уровни вложения данных и подчиненность полос. Полосы с маркировкой одного цвета печатаются в одном блоке. Квадраты обозначают полосы данных, а треугольники — обычные полосы, при этом направление вершины треугольника обозначает полосу заголовка или окончания. Левая панель редактора полос отчета Band Style Editor (рис. 26.7) наглядно демонстрирует модель отчета, как если бы он был напечатан для трех записей набора данных.

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

Группирующий отчет

Отчеты, работающие с базами данных, часто должны отображать данные с различными уровнями группировки. Обычно группировка осуществляется в наборе данных, если он создается на основе запроса SQL с применением оператора GROUP BY. Но в самом наборе данных невозможно предусмотреть оформление групп записей, однако это можно сделать в отчете.

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

В качестве таких полос могут использоваться обычные полосы и полосы данных. Обычные полосы применяются, если группировка имеет один уровень вложенности (для каждого значения группового ключа существует одна или несколько сгруппированных записей). Полосы данных используются, если группировка имеет несколько уровней (внутри группы выделяется еще один групповой ключ и каждая запись в группе имеет еще несколько сгруппированных записей второго уровня).

Кроме этого, для полос группового заголовка необходимо в свойстве ControllerBand задать основную полосу данных и настроить свойство Bandstyle. Для группового заголовка в редакторе Band Style Editor в группе Print Location устанавливается флажок Group Header (G), а для полосы группового окончания — флажок Group Footer (g).

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

Использование вычисляемых значений

На странице Reports Палитры инструментов визуальной среды Rave Reports доступны несколько компонентов, которые позволяют применять агрегатные функции к значениям полей набора данных, переданного через соединение в отчет.

К агрегатным относятся следующие функции:

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

Рассмотрим все эти элементы оформления.

Вычисляемые значения по одному источнику

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

Элемент CalcText позволяет отобразить результат вычисления на полосе отчета. Так же, как и обычный элемент DataText, его необходимо связать с просмотром и полем. Для этого используются свойства DataView и DataField соответственно.

Кроме этого, элемент CalcText должен быть связан со специализированным элементом CaicController (см. ниже), который будет управлять процессом вычисления. Связывание осуществляется при помощи свойства Controller.

В свойстве CalcType задается одна из пяти перечисленных выше агрегатных функций.

Дополнительно, для функции COUNT можно настроить еще три свойства. При необходимости включить или отключить подсчет нулевых значений или пробелов используются булевские свойства countNulls и countBianks соответственно. А свойство Countvalue позволяет задать значение поля, которое будет учитываться при расчете функции, все остальные значения будут игнорироваться.

Вычисленное значение при сохранении может быть отформатировано в соответствии с шаблоном, заданным свойством DisplayFormat.

Для всех агрегатных функций можно задать момент начала вычислений. Для этого в свойстве initializer необходимо указать элемент оформления отчета, и при его печати начнется вычисление. Это может быть любой элемент, расположенный с элементом CalcText на одной полосе. Но желательно использовать для этого специализированный элемент calccontroller (см. ниже).

Примечание 

Пример использования элемента оформления CalcText имеется в отчетах, рассмотренных нами выше.

Элемент CalcTotal является невизуальным аналогом элемента CalcText. Поэтому он обладает всеми свойствами, о которых рассказывается выше для элемента CalcText. Вычисленное при его печати значение разработчик может использовать по своему усмотрению после того, как оно сохранено. Приемником вычисленного значения может быть один из параметров объекта отчета.

Свойство DestParam позволяет выбрать один из предопределенных или созданных разработчиком параметров отчета (свойство Parameters объекта отчета).

Свойство DestPiVar задает переменную отчета, в которую будет передано вычисленное значение (свойство pivars объекта отчета).

Рис. 26.8. Редактор свойства DataField

Затем параметр или переменная может быть использована для дальнейших вычислений или напечатана при помощи элемента DataText. В редакторе свойства DataField этого элемента (рис. 26.8) параметры и переменные отчета можно выбрать из списков Project Parameters и Post Initialize Variables.

Вычисляемые значения по нескольким источникам

Вычислительный элемент calcOp позволяет проводить вычислительные операции над значениями из двух различных источников.

Разработчик должен задать исходные значения и источники данных, используя два набора свойств (табл. 26.1). Назначение части этих свойств вам уже знакомо (см. разд. "Вычисляемые значения по одному источнику" выше).

Таблица 26.1. Свойства элемента СаlсОр для определения двух источников данных

Первый источник

Второй источник

Назначение свойства

SrclCalcVar

Src2CalcVar

Определяет вычисляемый элемент, результат которого берется в качестве исходного

SrclDataField

Src2DataField

Задает поле просмотра, над значениями которого проводятся вычисления. Игнорируется при заданном свойстве SrcXCalcVar

SrclDataView

Src2DataView

Задает поле просмотра, над значениями которого проводятся вычисления. Игнорируется при заданном свойстве SrcXCalcVar

SrclFunction

Src2Function

Позволяет выбрать математическую функцию (их список гораздо шире, чем просто агрегатные функции), которая будет выполнена над исходным значением перед вычислением основной операции элемента

SrclValue

Src2Value

Задает фиксированное значение, над которым производится вычислительная операция

Собственно функция, которая должна обработать значения из двух заданных источников, задается свойством operator.

После выполнения основной операции результат может быть обработан еще один раз, если вы зададите математическую функцию в свойстве

ResultFunction.

Таким образом, при помощи элемента CalcOp разработчик может реализовывать довольно сложные вычисления.

Если задать в качестве двух источников данных:

 то их значения будут последовательно обработаны вычислительной операцией, которую вы зададите свойствами:

Кроме этого, элемент CalcOp позволяет создавать вычислительные цепочки, если использовать в качестве одного или двух источников другие вычислительные элементы (рис. 26.9).

Рис. 26.9. Пример вычислительной цепочки на основе элементов CalcOp

Это могут быть как простые элементы CalcText и calcTotal, так и другие элементы calcOp, которые, в свою очередь, могут содержать сколь угодно сложные вычислительные цепи.

Пример использования элемента CalcOp имеется в демонстрационном приложении DemoReports на дискете, прилагаемой к этой книге.

Управляющие вычислительные элементы

Выше мы упоминали о свойстве Controller элементов CalcText и calcTotal, которое позволяет определить момент начала вычислений. Для этого используется специальный невизуальный элемент CalcController. Обычно он располагается на той же полосе, что и вычислительные элементы и инициализирует процесс вычисления в момент своей печати. Хотя на самом деле невизуальный элемент CalcController не печатается, тем не менее событие onBeforePrint он получает исправно вместе со всеми элементами, расположенными на данной полосе. А значит и с инициализацией вычислений он справится вполне.

Обладая несколькими специфическими свойствами, он позволяет определить момент начала вычислений более точно. И так же, как элемент FontMaster используется для централизованного управления шрифтами, этот элемент может быть центром управления вычислениями.

Свойство initcaicvar должно ссылаться на другой вычислительный элемент. И вычисленное им значение будет использовано в качестве начального.

Свойство initDataField задает поле данных, значение которого используется в качестве начального. Работает, если свойство initcaicvar не задано.

Свойство initvalue задает начальное значение, если предыдущие два свойства не заданы.

Для того чтобы эти свойства работали и задавали начальное значение, ссылка на элемент CalcController должна присутствовать в свойстве Initializer элементов оформления Call или CalcTotal.

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

Свойство oataview задает просмотр данных, с которым будет работать элемент DataCycle.

При помощи свойств MasterDataView, MasterKey и DetailKey можно получить подмножество записей для отношения "один-ко-многим".

Свойство sortKey позволяет отсортировать записи по заданному полю.

Резюме

Генератор отчетов Rave Reports позволяет создавать разнообразные отчеты для приложений баз данных.

Совокупность компонентов Delphi и средств визуальной среды Rave Reports обеспечивают создание соединений с источниками данных любых видов, в том числе и не основанных на СУБД. Соединения могут использовать технологии доступа к данным, реализованные соответствующими компонентами Delphi (см. часть IV) или драйверами Rave Reports.

Основой отчетов являются элементы Region, Band и DataBand, которые обеспечивают размножение строк отчета в соответствии с записями источников данных. Набор специализированных элементов оформления позволяет отображать в отчетах все основные типы данных.


НазадСодержаниеВперед
Сайт создан в системе uCoz