Версия для печати


Direct Data View в Rave Reports – гибкий механизм для создания отчетов
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1065

Дмитрий Гусев
дата публикации 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

Рассмотрим использование технологии 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 процесс разработки приложения будет состоять из нескольких этапов:
  1. Описание источника данных средствами Delphi;
  2. Когда мы опишем источник данных необходимо запустить приложение, чтобы редактор Rave Reports смог найти созданный нами источник и получить из него необходимую информацию об его структуре.
  3. Компонент TRvProject связать со вновь созданным файлом отчета.

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

Теперь, когда мы получили некоторое представление о предстоящей работе, следует уделить внимание формату данных, в котором хранится информация о котировках валют. Этот формат может быть любым, но раз уж было решено использовать в качестве такового - XML, давайте посмотрим, какие средства предлагает Delphi для работы с XML, в частности - XML Data Binding.

XML Data Binding - это механизм "привязки" элементов документа XML к интерфейсам Delphi, преследующий цель облегчить работу программиста с данными в формате XML и повысить качество программирования, а также позволяющего выявить некоторые типичные ошибки приведения типов еще на этапе компиляции.

Создайте новый проект приложения: File —> New… —> Application

Создание привязки к данным:

  1. File а New… —> Other… —> XML Data Binding

    Рисунок 1. Создание привязки к данным XML
  2. Укажите наш файл Data.Xml, Next >
  3. 3) Укажите типы "привязываемых" данных

    Рисунок 2. Определение параметров привязки
    <ак как в нашей программе мы будем использовать данные из файла только для чтения, то целесообразно указать мастеру генерировать лишь методы "только для чтения" - это сократит размер сгенерированного кода и позволит сэкономить немного памяти. Жмем Next > и Finish.
  4. Сохраним полученный модуль под названием 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, для этого:

  1. С закладки Rave поместим на форму компоненты:
    • TRvProject —> RvProject - для связывания с нужным файлом бланка отчета;
    • TRvCustomConnection —> RvTemperatureChartConnection - будет предоставлять изображение трендов TChart;
    • TRvCustomConnection —> RvTemperatureDataConnection - будет предоставлять данные для детального отчета о значениях температуры во времени.
  2. C закладки Additional поместим на форму:
    TChart —> TemperatureChart - для отображения изменения температуры во времени;
  3. С закладки Standard положим на форму меню TMainMenu и создадим элементы меню, как показано на рисунке:

    Рисунок 3. Внешний вид главной формы в Delphi
  4. Сохраним проект под именем DDV_Example.dpr, главный модуль под именем Main.pas.

В классе TfrmMain - классе главного окна приложения добавим следующие поля:

private
    { Private declarations }
    //  Указывает на очередное значение данных температуры
    ValueIndex: Integer;
  public
    { Public declarations }
    //  Содержит загруженные из файла данные о температуре
    Temperature: IXMLTemperatureType;

Для определения конфигурации источников данных TRvCustomConnection необходимо написать обработчики событий 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.
  1. Создадим новый проект отчета: File —> New
  2. Добавим источник данных Direct Data View: File —> New Data Object —> Direct Data View
  3. Выберем оба соединения, которые мы определили в приложении.
И нажимаем кнопку Finish.

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

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


Рисунок 4. Источники данных отчета

Теперь, когда конфигурация источников получена приложение можно закрыть, однако необходимо установить обратную связь приложения с отчетом. Сохраните отчет в файл ReportProject.rav в той же папке что и приложение (или в любой другой) и установите свойство ProjectFile компонента RvProject так, чтобы оно указывало на файл проекта, например, ReportProject.rav.

Вызовите мастер добавления простой таблицы: Tools —> Report Wizards —> Simple Table
  1. Выберите источник DataView2 и нажмите Next >
  2. Отметьте все поля источника данных и нажмите Next >
  3. Дальнейшие шаги мастера позволяют настроить внешний вид таблицы. Когда вы закончите у вас должен получиться шаблон страницы из двух колонок, в одной из которых будет отображаться время, а в другой соответствующее значение температуры. Можете настроить внешний вид как хотите, а можете оставить, так как есть.
Добавьте новую страницу к отчету: 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)