FastReport - Разработка кросс-платформенных отчетов
Автор: Михаил Филиппенко
WEB-сайт: FastReport Software
Еще со времен Ады Ловлес разработчики программного обеспечения пытаются облегчить себе жизнь. И, без сомнения, это им удается.
Собственно говоря, любое современное приложение можно условно разделить на четыре части: функциональную (она выполняет обработку информации), интерфейсную (на нее возложено общение с пользователем, к которому нас приучили продукты Microsoft), базы данных (порядка 90% приложений напрямую или косвенно используют хранение информации в более или менее сложных структурах, для которых наиболее удобными оказываются базы данных) и отчетную (несмотря на все шаги в сторону автоматизации документооборота документы на бумаге все еще считаются важными и ни одна организация не обходится без них).
Давно прошли те времена, когда разработчику каждого приложения приходилось каждый раз изобретать формат базы данных, отчет и интерфейс. Можно увидеть, как за короткий срок базы и банки данных выделились в отдельную группу, приложения и интерфейсная часть в другую, генераторы отчетов - в третью. Благодаря таким средствам разработки как MS VisualC, Visual Basic, C# и Borland Delphi разработка серьезных приложений, работающих с базами данных, сегодня превратилась в некоторое подобие детского конструктора, в котором что угодно можно собрать из отдельных "кубиков".
Такой "кубик" как генераторы отчетов выделился в отдельную и немаловажную часть в разработках относительно недавно, однако и здесь есть богатейший выбор инструментов для построения отчетных форм (именно их, зачастую, в конечном счете требует заказчик). Для того же Borland Delphi вы можете воспользоваться как встроенными средствами, идущими в комплекте c Borland Delphi и Borland Visual C++Builder - QuickReport ак и более "продвинутыми" продуктами от других разработчиков, это Crystal Reports от Seagate Software (ныне Crystal Software), представляющий собой вполне самостоятельный продукт, имеющий компоненты, дающие доступ к его возможностям из любой популярной сегодня среды разработки, будь то Borland Delphi, MS Visual C или MS Visual Basic, это и ReportBuilder от компании DigitalMetaphors (по опросу DelphiZine вот уже несколько лет признаваемый самым популярным инструментом для разработки отчетов в Delphi), это и ReportPrinter (ныне Rave) от Nevrona Design, а также FastReport (по тому же опросу поделившие второе и третье место в 2001 году и вышедший на стабильное второе место в 2002 году).
На сегодняшний день FastReport версии 2.4 - это полностью визуальный генератор отчетов, т.е. большинство отчетов можно построить, пользуясь только мышью. Вот только некоторые его возможности:
- Бэнд-ориентированный генератор отчетов.
- Встроенный мощный дизайнер, доступный и в run-time.
- WYSIWYG предварительный просмотр как в MS Word (т.е. мы можем видеть
одновременно несколько страниц отчета).
- Скорость работы сравнима с QuickReport.
- Компактность кода - без дизайнера меньше, чем QuickReport3.
- Неограниченное количество страниц сформированного отчета.
- Многостраничные отчеты; составные (композитные) отчеты; вложенные отчеты;
группы; многоколоночные отчеты; master-detail-detail отчеты; cross-tab отчеты;
двухпроходные отчеты; "живые" отчеты.
- Полный контроль над процессом печати, поддержка всех типов бумаги.
- Набор наиболее популярных компонентов: Текст, Линия, Рисунок, Фигура, OLE
объект, RichText, RX Rich 2.0, Диаграмма, Штрих-код.
- Экспорт в TXT, RTF, CSV, HTML (в RTF, HTML - с картинками).
- Поиск текста в сформированном отчете.
- Редактирование сформированного отчета.
- Встроенный интерпретатор Pascal-подобного языка для управления процессом
построения отчета.
- Набор визуальных компонентов для создания диалоговых форм;
- Набор невизуальных компонентов для создания таблиц, запросов и баз данных;
- Работа с BDE, Interbase Express (IBX), ActiveX Data Objects (ADO).
- Работа как с Database - ориентированными источниками данных, так и с любыми
данными.
- Форма отчета может храниться как в DFM, так и во внешнем файле.
- Функциональность может быть расширена за счет написания собственных
компонент - визуальных объектов, мастеров, библиотек функций.
Построение типичного отчета включает в себя следующие этапы:
1. Выборка данных
на основе которых строится отчет. Большинство отчетов, как правило, основано на данных из БД. Для доступа к таким данным Delphi предоставляет эффективные механизмы, компоненты- наследники TDataSet., которые и используются в FastReport. Это могут быть компоненты TTable и TQuery, которые используемые как источники данных для отчета. Организация доступа к данным из БД осуществляется ядром FastReport без участия программиста.
Кроме данных, хранимых в БД, FastReport может использовать практически любые источники (массив, файл, содержимое StringGrid и пр.). Но в этом случае программист должен сам позаботиться о доступе к такой информации, используя набор событий, позволяющих осуществить передачу данных в ядро FastReport.
Реализация доступа к данным примерно одинакова во всех генераторах отчетов. Все генераторы умеют обращаться с компонентами доступа к данным, расположенными на формах проекта. Кроме доступа к данным, определенным в проекте, и FastReport, и ReportBuilder, и QR+QRDesigner позволяют создавать новые компоненты в run-time. В FastReport принципы создания компонентов доступа к данным максимально приближены к тем, что используются в среде Delphi. Так же, как и в Delphi, на форму кладется компонент и в инспекторе объектов настраиваются его свойства. Компонентная идеология весьма гибкая: можно легко создавать новые компоненты для поддержки разных движков доступа к данным. На самом деле сейчас у FR уже есть компоненты для доступа практически ко всем популярным СУБД.
База данных |
Библиотека Delphi |
Библиотека для FastReport |
Adaptive Server Anywhere (4.x - 8.x) |
NativeDB |
frASAComponent |
InterBase и его клоны |
FIBSIBXIBO |
frFIBComponentsfrIBXComponentsfrIBOComponentsfrIB_Components |
Все базы которые имеют драйвера OLE-DB. |
ADO ADONISADO in Delphi |
frADNComponentsfrADOComponents |
Dbf |
Advantage |
frADSComponents |
Access |
DAO |
frDAOComponents |
DBISAM |
DBISAM |
frDBIComponents |
Oracle 8 |
NC OCI8 Library |
frOCIComponents |
TurboPower's FlashFiler |
FlashFiler |
frFFComponents |
Centura SQLBase Server 6(+),Oracle Server 7.2(+) with SQL*Net 2.2(+), IBM
DB2 Database, Interbase Server, Microsoft SQL Server 6.5, MySQL 3.23, PostgreSQL
7.1, Sybase ASE и ASA, Informix. Все базы данных которые имеют ODBC драйвера.
|
SQLDirect |
frSDComponents |
Все базы которые поддерживает BDE. |
BDE |
frBDEComponents |
Все базы для которых есть DBX драйвера. |
DBX |
frDBXComponents |
2. Ввод параметров
вносящих необходимые уточнения в готовящийся отчет. На этом этапе осуществляется запрос параметров у пользователя (например, диапазон дат, по которому необходимо вывести данные). Некоторые отчеты обходятся без этого этапа либо используют фиксированную установку параметров (без запроса их значений в диалоге).
Этот этап реализован в разных генераторах отчетов по-разному. Так, в ReportBuilderб Rave и QR+QRDesigner есть возможность запроса параметров, если отчет использует данные из запроса (Query). Для диалога с пользователем используется "штатное" диалоговое окно. Кроме того, для запроса параметров можно использовать форму, разработанную в среде Delphi. Правда, при необходимости каких-либо изменений в логике работы придется перекомпилировать проект.
FastReport, помимо этого, позволяет конечному пользователю самому разрабатывать форму диалога, причем этот диалог будет частью отчета, а не приложения. Процесс напоминает построение формы в среде Delphi: имеется набор стандартных элементов управления, которые можно располагать на форме диалога и настраивать их свойства. С помощью встроенного языка FastReport позволяет реализовать необходимую логику работы диалога и передать введенные значения ядру генератора.
Возможность создания собственных диалогов очень полезна - вкупе с остальными возможностями (автономное создание источников данных, использование встроенного языка) она позволяет создавать "самодостаточные" отчеты, т.е. отчеты, максимально отвязанные от среды Delphi. Это позволяет создавать новые отчеты и модифицировать существующие без переписывания или перекомпиляции проекта.
Пример 1 - после формирования третьей страницы отчет может вывести диалог с запросом - а надо ли строить остальные страницы?
Пример 2 - В диалоговом окне могут быть практически любые элементы, вплоть до поля даты-времени, переключателей типа "radiobutton" и "checkbox", выпадающих списков и т.д., таковые возможности не предоставляет ни один из остальных упоминавшихся генераторов!
3. Построение отчетной формы
представляющей собой набор элементов, описывающих то, как должен выглядеть готовый отчет. Для группировки элементов по их функциональному расположению в готовом отчете традиционно применяются бэнды (от англ. band - полоска). Бэнды разделяются на два вида: служебные (заголовок отчета, страницы и пр.) и бэнды, образующие повторяющуюся (многострочную) часть отчета (далее - дата-бэнды). Дата-бэнды подключаются к источникам данных, и их содержимое выводится столько раз, сколько имеется строк данных в источнике. В случае с табличным (так называемом cross-tab - отчетом) повторяться могут как строки так и столбцы отчета.
Для построения формы отчета в FastReport используется визуальная среда разработки - дизайнер отчетов. Интерфейс дизайнера подобен большинству современных приложений, работающих с документами. Расположение традиционных панелей инструментов (toolbars), можно изменять по своему вкусу. Для удобства манипуляции свойствами объектов отчета используется инспектор объектов, аналогичный встроенному в среду разработки Borland Delphi.
4. Обработка данных
подразумевающая под собой обработку входных данных, модификацию формы отчета или отдельных ее компонентов в процессе построения отчета. Простейший пример такой обработки - вывод отрицательных сумм красным цветом. Более сложный пример обработки - печать суммы, которая подсчитывается в подвале группы, в ее заголовке.
Реализовать подобную обработку можно, прибегнув к написанию обработчиков событий в Delphi - именно так и сделано во всех генераторах отчетов. Но этот способ не дает достаточной гибкости отчету, поскольку не позволяет создавать новые отчеты вне среды Delphi без переписывания и перекомпиляции проекта. Для достижения таковой универсальности в FastReport и ReportBuilder применен встроенный язык - упрощенный аналог Pascal. Скрипты, написанные на этом языке, по сути дела, являются обработчиками событий, вызывающимися перед прорисовкой объектов. Это дает возможность выполнять достаточно сложную обработку информации без написания кода в Delphi, и, соответственно, без жесткой привязки отчета к проекту.
Возможности встроенного языка FastReport довольно широки. Из скрипта доступны все свойства и методы объектов отчета, а также переменные, поля таблиц БД. В скрипте можно создавать переменные и массивы, которые будут доступны во всем отчете. О возможностях встроенного языка говорит тот факт, что такая довольно сложная задача, как печать сумм группы в ее заголовке (сама сумма считается в подвале группы) средствами языка FastReport делается элементарно.
5. Готовый отчет
представляет собой продукт деятельности ядра FastReport - то, что мы видим при нажатии кнопки "Предварительный просмотр". В отличие от остальных генераторов отчетов, которые хранят содержимое страниц отчета в виде метафайла (т.е. изображения в формате EMF), в FastReport готовый отчет представлен набором объектов, описывающих содержимое каждой страницы отчета. Это позволяет модифицировать готовый отчет, загружая нужную страницу в дизайнер. Кроме того, можно описывать реакцию на щелчок мыши на нужном объекте в режиме предварительного просмотра отчета. Это позволяет легко организовать работу приложения, при которой щелчок на объекте отчета вызывает генерацию нового отчета с более детальными сведениями по выбранному объекту.
Кроме того, ни один из существующих сегодня генераторов отчетов не поддерживает такое число сред разработки (Можно сказать, что мы заглядываем в рот Borland и стараемся выпустить генератор отчетов под любую новую версию их сред разработки :-) ). Итак, FastReport сегодня можно использовать в средах: Delphi со второй по 7ю версию, C++Builder всех версий, а также в первой визуальной среде разработки приложений под Linux - Kylix всех версий. Можем похвастаться, что это наша компания выпустила первый генератор отчетов для Kylix, Rave, который сейчас поставляется с новыми версиями продуктов Borland, в том числе и Kylix3, был выпущен примерно на полгода позже. :-)
Естественно, было бы глупо останавливаться на достигнутом. На сегодня разрабатывается принципиально новая версия генератора отчетов, который станет ядром для целого спектра продуктов, предназначенных как для профессиональных разработчиков, причем не только в средах разработки Borland, так и для конечных пользователей.
Что же еще новенького планируется?
- Формат сохранения файлов - текстовый и бинарный dfm, а также XML
- Новый объект - диагональная линия.
- Новые типы заливки для объектов.
- Текст под углом 0..360.
- Отступ параграфа.
- Возможность отключения печати объектов отчета.
- Наследование форм отчетов.
- Возможность отключить редакторы св-в и компонентов, если дизайнер не
используется.
Скрипт
- Единый скрипт для всего отчета (как unit в Delphi).
- Поддержка синтаксиса как Pascal, так и C++ в скриптовом языке
- Новые обработчики событий для объектов отчета.
- Новые возможности (try/except, with, case и т.п.)
- Увеличенная (в сравнении с FR2.4) скорость работы.
Дизайнер:
- Архитектура - компактное независимое ядро + интерфейс.
- Улучшенный интерфейс, возможность докинга вспомогательных окон.
- Улучшенный Инспектор объектов
- Масштабирование (Zoom).
- Редактирование мемо-объектов на месте.
- Более удобное рисование линий.
- Более удобная вставка бэндов.
- Бэнды, "прилипающие" друг к другу.
- Более удобный выбор поля БД для мемо-объекта.
- Возможность отображать содержимое поля БД вместо его названия.
- Сетка-миллиметровка, дюймовка, с произвольным шагом.
- Возможность построения отчетов для вывода на матричный принтер.
- Изменение левой/правой границ листа (объекты сдвигаются автоматически).
- Мастера для создания базовых типов отчетов.
- Копирование объектов в буфер обмена Windows.
- Полный откат / возврат (Undo/Redo).
Глобальный словарь
данных:
- Задание имен (алиасов) для всех таблиц и полей, содержащихся в БД проекта.
- Автоматическая подстановка алиасов во всех диалоговых окнах FR.
Предварительный просмотрщик:
- Улучшенный интерфейс.
- Редактирование на месте.
- События, генерируемые на сформированном отчете могут быть обработаны в
скрипте.
- Выделение объектов и копирование в буфер обмена.
Дополнительные объекты:
- Добавить свой объект проще, чем когда бы то ни было.
Некоторое сравнение FR 3 с существующими версиями:
Возможности |
FastReport 3 |
FastReport VCL |
FastReport CLX |
Скриптовый язык |
advanced |
+ |
+ |
Подсветка синтаксиса в редакторе скрипта |
+ |
+ |
+ |
Смена band datasource из скрипта |
+ |
+ |
+ |
Доступ из скрипта к объектам на других страницах отчета |
+ |
+ |
+ |
Функция FORMATTEXT, оператор FOR, процедуры EXIT, INC и DEC в FastReport
Pascal |
and more |
+ |
+ |
Поддержка Interbase Express (IBX), IBObjects, ActiveX Data Objects
(ADO) |
advanced and easy |
support more dbs |
support more dbs |
Delphi6 dbExpress DBXComponents |
+ |
+ |
+ |
Object Inspector |
full |
advanced |
advanced |
Cross-tab отчеты |
advanced |
advanced |
basic (yet) |
Диалоги |
+ |
+ |
+ |
Line style |
+ |
+ |
+ |
BarCode |
+ |
+ |
+ |
RTF 2.0 |
+ |
+ |
+ |
Компонент TfrPreview для создания собственного предварительного
просмотра |
+ |
+ |
+ |
Компонент TfrPrintTable |
+ |
+ |
+ |
Опции для объекта "Text": толщина линий и символов, top and left gaps,
"Скрывать повторяющиеся значения" |
+ |
+ |
+ |
Restrict object editing, moving, resizing, deleting |
+ |
+ |
+ |
Option for bands: PrintChildIfInvisible |
+ |
+ |
+ |
Свойство GroupHeader band: Master |
+ |
+ |
+ |
Словарь данных |
+ |
+ |
+ |
Свйство BandAlign для всех объектов отчета |
+ |
+ |
+ |
Свойство объекта Text: HideZeros (скрывать нулевые) |
+ |
+ |
+ |
TfrReport.OnObjectClick event |
+ |
+ |
+ |
Свойство TfrReport.MDIPreview |
+ |
+ |
+ |
Свойство TfrReport.PrintIfEmpty TfrDesigner.OpenDir, SaveDir |
+ |
+ |
+ |
Свойство TfrPage.Visible |
+ |
+ |
+ |
Фильтры экспорта |
xml, txt, etc |
txt, htm, csv, rtf, xls,etc |
txt, htm, csv, rtf, xls,etc |
Языки |
21 |
21 |
21 |
Локализация инспектора |
+ |
+ |
+ |
Поддержка нескольких языков одновременно |
+ |
+ |
Нет |
Поддержка языков "справа-налево" |
+ |
+ |
+ | |
|