Информация о шаблонах средствами FastReport

Когда над проектом работают большое количество людей, и в момент работы персонал меняется, то трудно уследить за тем какие изменения и нововведения добавлялись в проект. Если проект финансовый, то в проекте также присутствует большое количество отчётов, которые также имеют место быть изменены. С моментом, количество отчётов разрастается до такой степени, что просто становится неудобно с ними работать.

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

Не секрет, что в FastReport есть возможность хранить информацию об отчёте в самом fr3 файле. При сохранении отчёта, можно записать информацию о файле, для этого необходимо выбрать из меню Вид->Опции, в открывшемся окне, перейти на вкладку Описание (Description), на этой вкладке и записывается вся информация о файле (отчёте).

GetInfoFR-1

На этой вкладке можно описать следующие характеристики файла:

– название отчёта
– автор отчёта
– описание отчёта
– указать изображение
– информация о версии файла
– дата создания файла и дата последнего изменения формируются автоматически

Отлично, информацию о файле для себя или будущего разработчика, который будет работать с данным отчём мы внесли, но неудобно ведь каждый раз открывать отчёт и просматривать информацию о нём… как же быть, спросите Вы??? Да очень просто, никому не секрет, что файл отчёт (fr3) – это самый обычный XML документ с набором тегов. В поставке с FastReport поставляется движок FastScript, в котором присутствует модуль fs_XML, для работы с данным типом файлов, а именно их чтения (парсинга). Вот этим то мы и воспользуемся.

Для того чтобы начать работу, создадим проект VCL Forms Apllication, на форме разместим ListBox, frxReport, frxUserDataSet, Label и кнопку по клинку на которой будет строиться отчёт.

GetInfoFR-2

Label1 переименуем в Discription, в неё у нас будет отображаться информация о файле при нажатии позиции в ListBox.

И так, подготовка формы завершена.

Для того чтобы прочесть информацию, которую мы сохранили в файле отчёта, я написал небольшую функцию, под названием GetInfoFR. Эта функция использует TfsXMLDocument и TfsXMLItem из модуля fs_XML, парсит документ, т.е. файл отчёта и достаёт необходимую нам информацию. Код этой функции следующий

function GetInfoFR(const FileName: String): String;
var
Xml: TfsXMLDocument;
Root: TfsXMLItem;
Ext: String;
begin
Result := '';
Ext := Copy(FileName, Length(FileName) - 2, 3);
if CompareText(Ext, 'fr3') = 0 then
begin
Xml := TfsXMLDocument.Create;
try
Xml.LoadFromFile(FileName);
Root := Xml.Root;
DopInfo[0] := Root.Prop['Version']; // Версия FastReport
DopInfo[1] := ConvertDate(Root.Prop['ReportOptions.CreateDate']); // Когда создан
DopInfo[2] := ConvertDate(Root.Prop['ReportOptions.LastChange']); // Последнее изменение
DopInfo[3] := Root.Prop['ReportOptions.VersionMajor'] + '.' +
Root.Prop['ReportOptions.VersionMinor'] + '.' +
Root.Prop['ReportOptions.VersionRelease'] + '.' +
Root.Prop['ReportOptions.VersionBuild']; // Версия
DopInfo[4] := Root.Prop['ReportOptions.Name']; // Название отчёта
DopInfo[5] := Root.Prop['ReportOptions.Description.Text']; // Описание
DopInfo[6] := Root.Prop['ReportOptions.Author']; // Автор
Result := 'FastReport: ' + DopInfo[0] + #13#10 +
'Когда создан: ' + DopInfo[1] + #13#10 +
'Последние изменение: ' + DopInfo[2] + #13#10 +
'Версия: ' + DopInfo[3] + #13#10 +
'Название отчёта: ' + DopInfo[4] + #13#10 +
'Описание: ' + DopInfo[5] + #13#10 +
'Автор: ' + DopInfo[6]
finally
Xml.Free;
end;
end;
end;

вот в принципе и вся хитрость задуманного.

Но возникает опять же вопрос: если большое количество файлов к примеру в директории RPT (хранилище наших шаблонов отчётов), то как прочитать информацию о всех файлах и вывести всё это в отчёт?

Опять же очень просто. Для того чтобы прочитать информацию о всех шаблонах отчётов в директории, будет использоваться рекурсия, для этого есть TSearchRec и методы FindFirst, FindNext и FindClose. Как ими пользоваться думаю не стоит объяснять, да и рассмотрение этих методов не входит в границы данной статьи, я просто приведу пример того как я это реализовал это в своём примере.

Код следующий

Var
sr:TSearchRec;
dir : string = 'C:\Program Files\FastReports\FastReport 4\Demos\Main\';
//*****
begin
if FindFirst(dir+'*.fr3',faAnyFile,sr) = 0 then
begin
repeat;
listbox.Items.Add(sr.Name);
until
FindNext(sr) <>0;
FindClose(sr);
end;

т.е. в ListBox у нас добавятся все файлы которые есть в директории. Для данного примера, я взял отчёты из демонстрационного примера FastReport.

Так, файлы шаблонов мы нашли, теперь необходимо разобраться с самим шаблоном отчёта, для этого воспользуемся frxReport и frxUserDataSet. frxUserDataSet переименовал в DSUser. После дважды нажимаем на frxReport, добавляем бэнд MasterData и на нем располагаем мемку в которой пишем [file], это необходимо для того чтобы передать информацию в отчёт через frxUserDataSet. Для того чтобы наш frxUserDataSet использовался в отчёте, необходимо его подключить к отчёту, для этого в меню Отчёт->Данные отмечаем галочкой наш DataSet.

GetInfoFR-3
После дважды кликаем по бэнду MasterData и выбираем наш UserDataSet.
GetInfoFR-4

С подготовкой шаблона отчёта мы тоже закончили.
Осталось добавить выполнение отчёта. Для этого в frxReport на событии OnGetValue напишем следующий код

var
i : integer;
begin
if CompareText(VarName, 'file') = 0 then
begin
for i := 0 to ListBox.Count - 1 do
begin
Value := 'Название файла: ' + listbox.Items[DSUser.RecNo] + #13#10 +
GetInfoFR(dir+listbox.Items[DSUser.RecNo]);
end;
end;

Окончательный вариант выполненных всех действий выглядит вот так
Внешний вид:

GetInfoFR-5

Ну и собственно сам отчёт, ради чего и была проделана вся эта работа

GetInfoFR-6

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

Copyright© 2010 Савельев Андрей aka dron-s
Специально для reportingfor.info

Comments are closed.