FastReport как средство корпоративной отчетности

Реализовать базу данных и программу для работы с ней – это только пол дела. Очень редко, когда данные должны просто где-то храниться. В большинстве случаев необходимо средство, с помощью которого пользователи смогут просматривать или даже самостоятельно создавать какие-либо отчеты, и выводить их на печать.
Реализовать базу данных и программу для работы с ней – это только пол дела. Очень редко, когда данные должны просто где-то храниться. В большинстве случаев необходимо средство, с помощью которого пользователи смогут просматривать или даже самостоятельно создавать какие-либо отчеты, и выводить их на печать.

Для нашей страны идеальным вариантом, на наш взгляд, является Fast Report российской разработки. Когда видишь, такие разработки, как FastReport, то понимаешь, что наша страна реально поднимается вверх в области ИТ и может подняться еще выше, оставив позади не только Индию. Больше всего я рад за то, что родина этого пакета мой любимый город Ростов-на-Дону в котором я родился и вырос.

Почему мы выбрали именно FastReport? Да, она достаточно мощная, удобная, простая и по своим возможностям может конкурировать с разработками более именитых компаний. И все же, у FastReport есть одно очень серьезное преимущество на нашем рынке – хороший русский язык в интерфейсе и простота для конечного пользователя. Русскоязычная поддержка также является большим плюсом. Создать отчетность – это пол беды, но с ней будете работать не вы, а конечный пользователь, который в английском языке может быть не силен. В таких случаях русский интерфейс является большим плюсом.

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

Еще одним большим плюсом является хорошая документация, которая доступна в двух версиях – для разработчиков и для программистов. В ней есть практически все, для хорошего старта и простейшие отчеты вы сможете начать создавать уже через пять минут знакомства с системой. Полный пакет документации занимает 6 мегабайт и поставляется в трех популярных форматах – chm, pdf и hlp. Остается только выбрать тот, который для вас удобнее и можно приступать к изучению. Форматы chm и hlp удобны для получения быстрой помощи, а pdf удобен для распечатывания.

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

Если вы еще не знакомы с FastReport, то мы рекомендуем вам познакомиться сейчас. Вы найдете в нем все, что вам необходимо сейчас и еще немного дополнительных функций, которые пригодятся в будущем. Мы же сегодня познакомимся с некоторыми нюансами и рекомендациями при работе с отчетностью. Я расскажу о личном опыте работы с FastReport и поделюсь личными впечатлениями. Надеюсь, что они помогут вам.

Создание отчета в FastReport
Создать отчет не так уж и сложно. Достаточно поместить на форму компонент TfrxReport, дважды щелкнуть по нему, и вы попадаете в окно визуального редактора, в котором и строиться отчет. Такая простота подталкивает на то, чтобы везде, где только можно плодить компоненты TfrxReport. Это неэффективно по двум причинам:

1. Это неэффективное расходование памяти, потому что создается несколько экземпляров компонентов отчетности. Если вы не перенесли весь код FastReport в динамические библиотеки (а это лишние затраты времени), то память будет утекать достаточно быстро.

2. Когда формы отчетности разбросаны по разным модулям проекта, с ними сложнее работать, особенно, если вы работаете в команде и используете систему совместной разработки кода, например, Visual SourceSafe.

Я бы рекомендовал создать отдельный модуль данных (DataModule) и поместить в нем только один экземпляр компонента TfrxReport. Теперь, создавая отчеты сохраняйте их в файлы. FastReport позволяет сохранять отчеты только в своем собственном формате, в файлах с расширением fr3, но этого вполне достаточно. В файл помещается вся необходимая информация, поэтому, после его загрузки все будет работоспособным.

Теперь для каждого отчета необходимо создать отдельную процедуру, которая будет иметь примерно следующий вид:


Procedure PrintSomeReport(odsMain, odsDetail: TDataSet);
begin
frxMainData.DataSet:= odsMain;
frxDetailData.DataSet:= odsDetail;
frxRepInv.LoadFromFile('Имя файла отчета.fr3',true);
frxRepInv.ShowReport;
end;

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

Кто должен создавать отчеты
То, что отчетность храниться в одном месте, дает еще одно преимущество – разделение труда. Современные средства построения отчетов достаточно сложные и обладают богатыми возможностями, в том числе и встроенными языками программирования. Пакет FastReport не исключение, и для досконального его возможностей изучения может понадобиться немало времени. Я работаю с FastReport достаточно долго, но не могу сказать, что знаю его на отлично.

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

Смена принтера
Но этого оказывается недостаточно. После установки имени необходимо вызвать еще и метод SelectPrinter. Раз уж я изменяю имя, то SelectPrinter должен вызываться автоматически. Если действительно бывает необходимость указать имя принтера, но не устанавливать его (правда я не могу себе такого представить), то можно добавить еще один метод SelectPrinter, который в качестве параметра будет получать имя принтера, и сразу будет сохранять его в PrintOptions и устанавливать

Это не упрек, а пожелание разработчикам. Надеюсь, что они прочитают эту статью и улучшат смену принтеров.

Если заглянуть в исходный код процедуры SelectPrinter, то можно заметить, что она перебирает все установленные принтеры, и если находит в списке нужный, то делает его текущим. Тут есть два недостатка:

1. Если принтер не установлен на данном компьютере, то он не будет выбран;
2. SelectPrinter – это процедура и не возвращает результата, а значит, мы не узнаем, был ли выбран запрашиваемый принтер в качестве текущего или нет.

Чтобы обойти этот недостаток, я бы рекомендовал бы выполнить следующие действия: перед установкой имени принтера вызывать метод Clear (frxRepInv.PrintOptions.Clear). Этот метод сбрасывает настройки печати и делает все по умолчанию. После установки принтера следует проверить имя выбранного для отчетов принтера, а индекс текущего можно узнать так: frxPrinters.PrinterIndex

Печать содержания
Недавно, на моей основной работе, мне пришлось делать возможность печати прайс листа. Это не такая уж и сложная задача, но проблема была в создании содержания. Эта тема почему-то плохо описана в документации, поэтому я решил показать, как я решил эту проблему, тем более, что вы тоже можете с ней столкнуться.

Для создания содержания необходимо использовать якоря (Anchor), которые устанавливаются программно, поэтому нам придется затронуть и программирование в FastReport. Помимо этого, необходимо создать два листа отчетов. По умолчанию создается только один лист, поэтому сразу же щелкаем правой кнопкой по закладкам вверху отчетов и выбираем пункт NewPage. Первая страница будет хранить форму содержания, а вторая закладка внешний вид прайс листа. Допустим, что прайс лист имеет всего два уровня – категория товара, и сам товар, который входит в категорию. В содержание должны попасть названия категорий и страницы прайса, где можно найти товар.

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

На рисунке показана примерная форма того, как может выглядеть отчет. В поле [frxGroup.”NAME”] будут выводиться названия категорий товаров. У меня это поле названо Memo1. Выделяем его и на закладке Events создаем событие OnBeforePrint. В этом событии пишем следующую строку кода:

 procedure Memo1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.AddAnchor();
end

Здесь вызывается метод AddAnchor, движка FastReport, который добавляет якорь. В качестве параметра передается имя якоря. Будет проще, если имя будет совпадать с названием категории товаров. Если вы делаете не прайс лист, то в качестве имени указывайте то название группы, которое должно попадать в содержание.

Теперь переходим на закладку с формой содержания. В моем случае, здесь три колонки – артикул, имя группы и страница. Имя группы будет браться автоматически для данного набора данных, а вот страницу определить достаточно просто. Выделяем Memo компонент, в который должен попадать номер страницы (у меня это Memo26), и создаем для него обработчик события OnBeforePrint. Здесь пишем следующий код:

 procedure Memo26OnBeforePrint(Sender: TfrxComponent);
begin
Memo26.Text:=IntToStr(Engine.GetAnchorPage());
end;

Чтобы определить номер страницы, вызывается метод GetAnchorPage, которому нужно передать имя якоря. У нас имена якорей совпадают с именами групп товара, поэтому в качестве параметра передаем frxGroup.”NAME”, где у меня находиться имя группы.

Но это еще не все. Когда движок FastRoport формирует отчет, то он один раз пробегает по всем данным и устанавливает якоря. При этом, во время формирования содержания, якорей еще не будет, поэтому номеров страниц в отчете вы не увидите. Чтобы все отобразилось корректно, необходимо включить двойной проход. Во время второго прохода все якоря уже будут расставлены и в содержании появятся номера страниц. Итак, выбираем меню Report\Options и устанавливаем галочку в Double Pass

Оптимизация

Оптимизировать что-то в самом FastReport достаточно сложно. Скорость его работы зависит в основном от скорости получения данных. Если ваш набор данных возвращает необходимые данные быстро, то и отчет появиться мгновенно. Ну а если SQL запрос, который возвращает данные – не оптимизирован, то отчет может формироваться очень и очень долго. Поэтому, первым делом стоит начать с оптимизации SQL запросов. А вот оптимизация запросов зависит от же от базы данных, которую вы используете.

Иногда отчету необходимо передать один или два параметра, которые выходят за пределы основного выходного набора данных. Допустим, что вы создаете отчет по заработной плате, и в него должны входить сотрудники определенного подразделение. Основной набор данных – это список сотрудников, но будет удобно, если в шапке отчета будет отображаться название подразделения. Из-за одного названия создавать набор данных (DataSet) неэффективно. В FastReport есть очень удобный механизм – переменные. Используйте лучше его. Эта тема очень хорошо описана в справочной системе.

На скорость отображения отчета влияют и скрипты, которые вы пишите в отчете. Не стоит перегружать отчетность лишним кодом, ведь его разбор идет во время выполнения программы. Лучше все необходимые расчеты выполнять в Delphi и передавать готовые данные через переменные или наборы данных

Итого

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

Copyright© 2009 Михаил Фленов
Источник: flenov.info

Comments are closed.