FastReport: менеджер отчетов

© 2002 Виталий Кубекин

Генератор отчетов FastReport имеет замечательную возможность изменять шаблоны документов во время исполнения программы. Использование данной возможности позволяет программисту не только ускорить разработку программы, но и сильно упростить жизнь с дальнейшей поддержкой программы, как самому себе, так и конечному пользователю программы.

Каким образом обычно происходит использование данной возможности? Если в программе используется, например двадцать отчетов, то скорее всего, будет двадцать кнопок "Печать отчета" и может быть (если программисту будет не лень или если заказчик потребует присутствия данной возможности) двадцать кнопок "Дизайн отчета". А что если пользователям необходимо не только изменить уже существующие отчеты, но и добавить пару новых отчетов? На этот вопрос сам собой напрашивается следующий ответ - необходимо написать менеджер отчетов. Что даст такой менеджер отчетов? Он позволит динамически добавлять, изменять и удалять отчеты. Написанием такого менеджера отчетов мы и займемся. Тем, кто с FastReport "на ты" и сама идея понятна, можно дальше не читать, остальным я немного опишу мелочи.


Рис.1.
  Итак, начнем по порядку. Наши отчеты надо где-то хранить, для этого нам понадобится таблица. По каждому отчету нам потребуется следующая информация- наименование отчета, ссылка на шаблон документа FastReport или сам шаблон документа FastReport. В примере находится таблица формата Paradox, где все это примерно реализовано. Дальше будет необходимо "нарисовать" окно менеджера отчетов. Как может выглядеть такое окно Вы можете увидеть на рис.1. Управляющие элементы разбиваем на две группы. Первая группа - это группа для добавления новых отчетов, изменения отчетов и удаления отчетов. Вторая группа - это группа для предварительного просмотра отчетов, печати отчетов ну и естественно отмены.

Новый отчет - это всего лишь вставка новой записи в таблицу.

Изменение отчета - код выглядит вот так:

//====================================
frReport1.LoadFromBlobField(taReportREPORT);
frReport1.DesignReport;
//====================================

Все предельно просто.
Удаление отчета - просто удаление записи из базы данных.

Предварительный просмотр:

//====================================
frReport1.LoadFromBlobField(taReportREPORT);
frReport1.ShowReport;
//====================================

Печать без предварительного просмотра:

//====================================
frReport1.LoadFromBlobField(taReportREPORT);
frReport1.PrintPreparedReportDlg;
//====================================

Функция PrintPreparedReportDlg сразу показывает диалог печати (если вдруг, кто не знает). Можно добавить кнопки печати сразу одного, двух, трех и т.д. экземпляров. Тогда код будет выглядеть вот так:

//====================================
frReport1.LoadFromBlobField(taReportREPORT);
frReport1. PrintPreparedReport('',Qnt, True, frAll);
//====================================
Где Qnt -количество экземпляров.

Так как шаблоны отчетов хранятся в Blob полях в таблице, а не в файлах, то необходимо повесить обработчик на объект TfrDesigner на событие OnSaveReport. Это необходимо для сохранения шаблона отчетов из дизайнера в Blob поле.

//====================================
taReport.edit;
frReport1.SaveToBlobField(taReportREPORT);
taReport.post;
//====================================

Можно повесить обработчик и на событие OnLoadReport, но это уже самостоятельно.

Далее нам необходима процедура для вызова менеджера отчетов:

//====================================
procedure TfrManage.PrintDoc(DocumentName: string;FormName: string);
begin
  frManage := TfrManage.create(Application);
  frManage.DocumentName := DocumentName;
  frManage.FormName := FormName;
  frManage.showmodal;
  frManage.release;
end;
//====================================

DocumentName-это наименование документа по умолчанию (можно подставить например Form.caption, чтоб не писать лишний раз). FormName- это раздел отчетов, необходим для того чтоб на каждое окно был свой список документов (можно подставить например Form.name).

Необходимо также сделать механизм заполнения объектов TfrDBDataSet. Сделать это можно просто - например, создать два таких объекта данного типа и вызове PrintDoc передавать для них DataSource.

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

Желающие могут скачать исходные тексты примера (4.48K)

По всем вопросам обращайтесь по адресу vtl@msx.ru.

Copyright© 2002 Виталий Кубекин  Специально для Delphi Plus