Версия для печати
Direct Data View в Rave Reports – гибкий механизм для создания отчетов
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1065Дмитрий Гусев
дата публикации 11-10-2004 16:09Direct Data View в Rave Reports – гибкий механизм для создания отчетов В этой статье я расскажу, как использовать механизм Direct Data View из Rave Reports для создания отчетов, когда у вас нет базы данных и/или вы используете собственное представление данных. В частности я хочу рассказать, как можно включить изображение TChart'а в отчет без дополнительного сохранения его в файл или в базу данных.
Такие вопросы встречаются очень часто и, конечно, однозначного ответа на этот вопрос быть не может - существует масса способов как это сделать. На мой взгляд, использование Direct Data View предоставляет довольно гибкие возможности для решения этой проблемы.
В дополнение, я хочу рассказать об использовании XML Data Binding - довольно удобном механизме представление структурированных XML документов в виде набора интерфейсов в Delphi.
Применение Direct Data View
Рассмотрим использование технологии Direct Data View на примере простой задачи. Допустим, нам нужно сделать программу, которая умела бы создавать отчет на основании данных температуры от времени. Пусть у нас есть некий файл с данными об изменении температуры, и мы хотим создать такой отчет:
- На первой странице будет график изменения температуры во времени;
- На второй и последующих страницах - точные значения температуры, представленные в виде списка значений.
Пусть данные изменения температуры во времени хранятся не в БД, а в XML документе. В нашем случае можно предложить такую структуру XML документа (файл Data.Xml):
<Temperature> <Value> <Timestamp>01.05.2004 12:00:00</Timestamp> <Data>+13</Data> </Value> <Value> <Timestamp>01.06.2004 12:00:00</Timestamp> <Data>+22</Data> </Value> <Value> <Timestamp>01.07.2004 12:00:00</Timestamp> <Data>+27</Data> </Value> <Value> <Timestamp>01.08.2004 12:00:00</Timestamp> <Data>+20</Data> </Value> <Value> <Timestamp>01.09.2004 12:00:00</Timestamp> <Data>+21,5</Data> </Value> </Temperature>Инструменты
Нам понадобится Delphi 7 Enterprise или Architect - для поддержки работы с XML Data Binding с установленным пакетом Rave Reports, который включен в поставку Delphi начиная с седьмой версии.
С чего начать…
В случае использования Direct Data View процесс разработки приложения будет состоять из нескольких этапов:
- Описание источника данных средствами Delphi;
- Когда мы опишем источник данных необходимо запустить приложение, чтобы редактор Rave Reports смог найти созданный нами источник и получить из него необходимую информацию об его структуре.
- Компонент TRvProject связать со вновь созданным файлом отчета.
После того, как Rave Reports получил необходимую информацию, можно закрыть приложение, в котором описан источник данных, и продолжать разработку бланка отчета независимо от самого приложения.
Теперь, когда мы получили некоторое представление о предстоящей работе, следует уделить внимание формату данных, в котором хранится информация о котировках валют. Этот формат может быть любым, но раз уж было решено использовать в качестве такового - XML, давайте посмотрим, какие средства предлагает Delphi для работы с XML, в частности - XML Data Binding.
XML Data Binding - это механизм "привязки" элементов документа XML к интерфейсам Delphi, преследующий цель облегчить работу программиста с данными в формате XML и повысить качество программирования, а также позволяющего выявить некоторые типичные ошибки приведения типов еще на этапе компиляции.
Создайте новый проект приложения: File —> New… —> ApplicationСоздание привязки к данным:
- File а New… —> Other… —> XML Data Binding
Рисунок 1. Создание привязки к данным XML- Укажите наш файл Data.Xml, Next >
- 3) Укажите типы "привязываемых" данных
<ак как в нашей программе мы будем использовать данные из файла только для чтения, то целесообразно указать мастеру генерировать лишь методы "только для чтения" - это сократит размер сгенерированного кода и позволит сэкономить немного памяти. Жмем Next > и Finish.
Рисунок 2. Определение параметров привязки- Сохраним полученный модуль под названием DataBindingUnit.pas.
Примечание:
Значения всех элементов XML документа имеют тип Variant. Устанавливая на шаге 3 типы привязываемых данных, мы, тем самым, говорим генератору интерфейсов к какому тику нужно приводить тип Variants. Например, для элемента Timestamp нужно выполнить преобразование VarToDateTime. Мастер использует эту функцию преобразования типа, однако он не подключает модуль, в котором эта функция располагается. Возможно это недочет, который будет исправлен в следующих версиях. В любом случае мы должны руками прописать в секцию uses модуль Variants.Посмотрев сгенерированный код можно заметить помимо интерфейсов привязки к XML данным три глобальные функции:
function GetTemperature(Doc: IXMLDocument): IXMLTemperatureType; function LoadTemperature(const FileName: WideString): IXMLTemperatureType; function NewTemperature: IXMLTemperatureType;Именно ими, а точнее функцией LoadTemperature мы будем пользоваться для загрузки данных о температуре. Остальные функции применяются, когда мы хотим создать новый XML документ определенной структуры - NewTemperature или получить нужную ветвь из дерева XML документа - GetTemperature.
Следует также обратить внимание, что для повторяющихся элементов документа, в нашем случае это элементы Value, генерируются методы унаследованные от TXMLNodeCollection - такие как Count, Add, Insert и т.п., которые позволяют работать с определенными нами данными как с типизированным списком.
После того, как мы получили привязку к нашим данным о температуре, приступим к описанию источника данных Rave Reports, для этого:
- С закладки Rave поместим на форму компоненты:
- TRvProject —> RvProject - для связывания с нужным файлом бланка отчета;
- TRvCustomConnection —> RvTemperatureChartConnection - будет предоставлять изображение трендов TChart;
- TRvCustomConnection —> RvTemperatureDataConnection - будет предоставлять данные для детального отчета о значениях температуры во времени.
- C закладки Additional поместим на форму:
TChart —> TemperatureChart - для отображения изменения температуры во времени;- С закладки Standard положим на форму меню TMainMenu и создадим элементы меню, как показано на рисунке:
Рисунок 3. Внешний вид главной формы в Delphi- Сохраним проект под именем DDV_Example.dpr, главный модуль под именем Main.pas.
В классе TfrmMain - классе главного окна приложения добавим следующие поля:
private { Private declarations } // Указывает на очередное значение данных температуры ValueIndex: Integer; public { Public declarations } // Содержит загруженные из файла данные о температуре Temperature: IXMLTemperatureType;Для определения конфигурации источников данных TRvCustomConnection необходимо написать обработчики событий OnOpen, OnGetCols, OnGetRow:
RvTemperatureData:
- OnOpen - возникает, когда генератор отчета пытается открыть набор данных, с целью получить информацию о количестве записей в наборе данных.
- OnGetCols - возникает, когда генератор отчета пытается получить информацию о структуре набора данных: количестве полей, их типе и т.д.
- OnGetRow - возникает, когда генератор отчета пытается получить очередную строку набора данных.
RvTemperatureChart:
procedure TfrmMain.RvTemperatureDataConnectionOpen( Connection: TRvCustomConnection); begin // Количество записей в наборе данных if Temperature <> nil then Connection.DataRows := Temperature.Count else Connection.DataRows := 0; // Индекс первой записи в наборе данных ValueIndex := 0; end; procedure TfrmMain.RvTemperatureDataConnectionGetCols( Connection: TRvCustomConnection); begin // Описание структуры набора данных Connection.WriteField('Timestamp', dtDateTime, 0, 'Дата и время', ''); Connection.WriteField('Data', dtFloat, 0, 't, *C', ''); end; procedure TfrmMain.RvTemperatureDataConnectionGetRow( Connection: TRvCustomConnection); begin // Заполнение описанной структурой очередным значением Connection.WriteDateTimeData ('', Temperature.Value[ValueIndex].Timestamp); Connection.WriteFloatData ('', Temperature.Value[ValueIndex].Data); Inc(ValueIndex); end;
procedure TfrmMain.RvTemperatureChartConnectionOpen( Connection: TRvCustomConnection); begin // Всегда одно изображение графика Connection.DataRows := 1; end; procedure TfrmMain.RvTemperatureChartConnectionGetCols( Connection: TRvCustomConnection); begin Connection.WriteField('Img', dtGraphic, 0, 'Снимок графика изменения температуры', ''); end; procedure TfrmMain.RvTemperatureChartConnectionGetRow( Connection: TRvCustomConnection); var PrevColor: TColor; PrevParentColor: Boolean; begin PrevColor := TemperatureChart.Color; PrevParentColor := TemperatureChart.ParentColor; // Печать графиков на белом фоне TemperatureChart.Color := clWhite; try WriteChartData(Connection, TemperatureChart); finally TemperatureChart.Color := PrevColor; TemperatureChart.ParentColor := PrevParentColor; end; end;Примечание:
Для записи изображения TChart в набор данных соединения используется процедура WriteChartData из модуля RPTChart; не забудьте добавить его в секцию uses модуля Main.pas.Теперь мы определили конфигурацию источников данных и все готово для того чтобы приступить к созданию бланка отчета:
Редактор отчетов Rave Designer можно вызвать из меню Tools —> Rave Designer.И нажимаем кнопку Finish.
- Создадим новый проект отчета: File —> New
- Добавим источник данных Direct Data View: File —> New Data Object —> Direct Data View
- Выберем оба соединения, которые мы определили в приложении.
Примечание:
Если у вас не отображаются эти два соединения, проверьте, запущено ли приложение, которое мы создали раньше.В дерево источников данных должны добавиться два источника, с определенной нами конфигурацией полей:
Рисунок 4. Источники данных отчетаТеперь, когда конфигурация источников получена приложение можно закрыть, однако необходимо установить обратную связь приложения с отчетом. Сохраните отчет в файл ReportProject.rav в той же папке что и приложение (или в любой другой) и установите свойство ProjectFile компонента RvProject так, чтобы оно указывало на файл проекта, например, ReportProject.rav.
Вызовите мастер добавления простой таблицы: Tools —> Report Wizards —> Simple TableДобавьте новую страницу к отчету: File —> New Report Page
- Выберите источник DataView2 и нажмите Next >
- Отметьте все поля источника данных и нажмите Next >
- Дальнейшие шаги мастера позволяют настроить внешний вид таблицы. Когда вы закончите у вас должен получиться шаблон страницы из двух колонок, в одной из которых будет отображаться время, а в другой соответствующее значение температуры. Можете настроить внешний вид как хотите, а можете оставить, так как есть.
На страницу отчета положите компонент MetaFile, он находится на закладке Standard и установите значения его свойств DataField и DataView как показано на рисунке:
Рисунок 5. Настройка источника данных для изображенияБланк отчета готов. Можно оставить его как есть или видоизменить на свое усмотрение.
В свойствах проекта выберите поле PageList и отметьте все страницы, которые должны быть включены в отчет. Там же можно указать порядок расположения страниц в отчете: в нашем случае страница Page1 будет первой, MainPage - второй.
Рисунок 6. Свойства проектаСохраните файл проекта отчета, с ним мы закончили. Осталось написать всего несколько строчек кода, чтобы загружать данные в приложение и отправлять и на печать. Для этого напишем следующие обработчики для пунктов меню:
procedure TfrmMain.mi_FileLoadClick(Sender: TObject); var I: Integer; begin if OpenDialog1.Execute then Temperature := LoadTemperature(OpenDialog1.FileName); if Temperature <> nil then begin TemperatureChart.Series[0].Clear; for I := 0 to Temperature.Count - 1 do TemperatureChart.Series[0].AddXY (Temperature.Value[I].Timestamp, Temperature.Value[I].Data); end; end; procedure TfrmMain.mi_FilePrintClick(Sender: TObject); begin RvProject.Execute; end;Конечно, предварительно необходимо добавить компонент TOpenDialog а OpenDialog1 с закладки Dialogs. Теперь все готово, можно запускать.
И вот что у нас получилось в результате:
Рисунок 7. Внешний вид программы
Рисунок 8. Готовый отчет - предварительный просмотрЗаключение
Rave Reports - довольно мощный, но в тоже время простой в работе, пакет для создания отчетов. Direct Data View - лишь маленькая часть от того, что умеет Rave Reports. Среди всех особенностей Rave Reports хочется отметить одну - возможность изменения внешнего вида и, в общем случае, структуры отчета без перекомпиляции или внесения каких-либо изменений в работающую программу.
Скачать проект DRave.zip (9K)