Дмитрий Гусев дата публикации 11-10-2004 16:09 Direct Data View в Rave Reports – гибкий механизм для создания отчетовВ этой статье я расскажу, как использовать механизм Direct Data View из Rave Reports для создания отчетов, когда у вас нет базы данных и/или вы используете собственное представление данных. В частности я хочу рассказать, как можно включить изображение TChart'а в отчет без дополнительного сохранения его в файл или в базу данных.
Такие вопросы встречаются очень часто и, конечно, однозначного ответа на этот вопрос быть не может - существует масса способов как это сделать. На мой взгляд, использование Direct Data View предоставляет довольно гибкие возможности для решения этой проблемы.
В дополнение, я хочу рассказать об использовании XML Data Binding - довольно удобном механизме представление структурированных XML документов в виде набора интерфейсов в Delphi.
Рассмотрим использование технологии 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) Укажите типы "привязываемых" данных
Рисунок 2. Определение параметров привязки
<ак как в нашей программе мы будем использовать данные из файла только для чтения, то целесообразно указать мастеру генерировать лишь методы "только для чтения" - это сократит размер сгенерированного кода и позволит сэкономить немного памяти.
Жмем Next > и Finish.
- Сохраним полученный модуль под названием 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
ValueIndex: Integer;
public
Temperature: IXMLTemperatureType;
| |
Для определения конфигурации источников данных TRvCustomConnection необходимо написать обработчики событий OnOpen, OnGetCols, OnGetRow:
- OnOpen - возникает, когда генератор отчета пытается открыть набор данных, с целью получить информацию о количестве записей в наборе данных.
- OnGetCols - возникает, когда генератор отчета пытается получить информацию о структуре набора данных: количестве полей, их типе и т.д.
- OnGetRow - возникает, когда генератор отчета пытается получить очередную строку набора данных.
RvTemperatureData:
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;
| |
RvTemperatureChart:
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.
- Создадим новый проект отчета: File —> New
- Добавим источник данных Direct Data View: File —> New Data Object —> Direct Data View
- Выберем оба соединения, которые мы определили в приложении.
И нажимаем кнопку Finish.
Примечание:
Если у вас не отображаются эти два соединения, проверьте, запущено ли приложение, которое мы создали раньше.
В дерево источников данных должны добавиться два источника, с определенной нами конфигурацией полей:
Рисунок 4. Источники данных отчета
Теперь, когда конфигурация источников получена приложение можно закрыть, однако необходимо установить обратную связь приложения с отчетом. Сохраните отчет в файл ReportProject.rav в той же папке что и приложение (или в любой другой) и установите свойство ProjectFile компонента RvProject так, чтобы оно указывало на файл проекта, например, ReportProject.rav.
Вызовите мастер добавления простой таблицы: Tools —> Report Wizards —> Simple Table
- Выберите источник DataView2 и нажмите Next >
- Отметьте все поля источника данных и нажмите Next >
- Дальнейшие шаги мастера позволяют настроить внешний вид таблицы. Когда вы закончите у вас должен получиться шаблон страницы из двух колонок, в одной из которых будет отображаться время, а в другой соответствующее значение температуры. Можете настроить внешний вид как хотите, а можете оставить, так как есть.
Добавьте новую страницу к отчету: File —> New Report Page
На страницу отчета положите компонент 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)
Обсуждение материала [ 11-10-2012 08:48 ] 6 сообщений |