Создание отчетов
Настройка соединения с базой данных Подключение отчета к программе |
Излишне говорить, что бухгалтерии без отчетов не бывает. Какой универсальный язык программирования не использовался бы при создании бухгалтерских программ, почти всегда возникает потребность в отдельном дополнительном средстве — генераторе отчетов. Генератор отчетов может быть в большей или меньшей степени интегрирован со средой разработки основного приложения: он может поставляться в виде отдельного приложения или в виде набора компонентов. Правильный выбор генератора на этапе создания приложения будет определять не только важные эргономические качества приложения для конечного пользователя, но и удобство создания, подключения новых отчетов и оперативной модификации существующих. Качество программы только повысится, если эти действия могут быть выполнены не только разработчиком, но и силами службы сопровождения заказчика. В этой статье я хочу показать, как создавать отчеты для любых сред разработки, совместимых с технологией COM, с помощью FastReport Studio.
Рассмотрим данную задачу на примере списка платежей абонентов за услуги ЖКХ. Пусть необходимо создать отчеты «Список платежей за период» и «Расшифровка по видам платежей». Для того чтобы конечный пользователь увидел готовый отчет, разработчик должен выполнить следующие шаги:
Традиционный путь — для каждого из отчетов нарисовать свой шаблон. Но зачем делать лишнюю работу, если есть возможность использовать наследование отчетов. Начнем с создания универсального базового отчета, на основе которого будем строить остальные отчеты-потомки. Создаем новый отчет и расставляем на нем компоненты, как показано на рисунке:
Пользователь должен иметь возможность где-то задавать ограничения, например период прихода платежа. Для этого в FastReport Studio есть диалоговые формы. Нажмем на кнопку «Добавить форму в отчет», этим мы добавим в отчет страницу с диалоговой формой. На форму базового отчета поместим только самое важное — период, а остальные ограничения будем добавлять по мере необходимости в отчетах-потомках.
Теперь для базового отчета создадим соединение с базой данных. Добавим на форму компоненты «База данных ADO» и «Запрос ADO».
Свяжем «Запрос ADO» с «База данных ADO» через свойство ConnectionName. А свойству ConnectionString компонента «База данных ADO» присвоим значение:
FILE NAME=test_fb.udl |
Это означает, что строка ADO-соединения не указана непосредственно в отчете, а будет при каждом запуске читаться из конфигурационного файла специальной структуры. Файл test_fb.udl должен находиться в текущем каталоге программы. Преимущества от использования в базовом классе udl-файла очевидны. Во-первых, не придется выполнять настройку соединения для всех отчетов-потомков. Во-вторых, описанная в отдельном udl-файле строка позволит распространять заказчикам отчеты в неизменном виде. Подробно настройку строки соединения я описала в следующем разделе статьи.
Остается сохранить базовый отчет с именем BaseRepSt.fr3. Теперь можно приступить к созданию отчетов-потомков. Начну с отчета «Список платежей за период».
Для того чтобы создать отчет-наследник базового отчета, его необходимо положить в каталог ..FastReport Studio\Bin. После этого, выбрав «файл»-«новый…», увидим следующее окно:
Для отчета «Список платежей» на диалоговой форме достаточно вписать наименование отчета, которое будем передавать в отчет при нажатии на кнопку «Печать».
procedure bPrintOnClick(Sender: TfrxComponent); begin //записываем название отчета и период формированя mNameReport.Text := lNameReport.Caption; mPeriod.Text := ' за ' + MonthTitle(cbMonth.ItemIndex+1) + ' '+ edYear.Text + ' года'; end; |
В наследованный отчет добавим элементы «заголовок страницы» и «данные 1 уровня». Отчет будет выглядеть следующим образом:
В свойстве SQL «Запроса ADO» напишем текст запроса, который из двух таблиц выберет нам список платежей абонентов за указанный месяц;
В свойстве Params опишем значения параметров таким образом, чтобы запрос получал их значения из диалоговой формы отчета.
Теперь наш отчет готов.
Вторым отчетом-наследником базового отчета BaseRepSt.fr3 будет «Расшифровка по видам платежей». Поскольку отчет будет формироваться по видам платежей, то на диалоговую форму я добавилю два TfrxCheckBoxControl, которые позволят формировать отчет по каждому из виду платежей вместе или раздельно.
Добавим на наш отчет-потомок следующие элементы: «заголовок страницы» и «данные 1 уровня», «заголовок группы» и «подвал группы». Отчет будет иметь следующий вид:
В отличие от примера №1, в данном случае необходимо изменять условие запроса в зависимости от параметров, выбранных на диалоговой форме. Создадим обработчик нажатия на кнопку «Печать» и впишем в него такой код:
//дописываем ограничение в запрос //банк if (cbBank.Checked) and not(cbTill.Checked) then frxMainQuery.SQL[5] := 'AND D.PL_CODE_SERVCHARGE = 1'; //касса if not(cbBank.Checked) and (cbTill.Checked) then frxMainQuery.SQL[5] := 'AND D.PL_CODE_SERVCHARGE = 2'; //все, без группировки if not(cbBank.Checked) and not(cbTill.Checked) then begin GroupHeader1.Visible := false; GroupFooter1.Visible := false; end; |
Для подключения к базе данных в FastReport Studio используется технология OLE DB. Чтобы создать соединение, необходим установленный в системе OLE DB Provider для баз Interbase/Firebird. Для лучшего понимания сути выполняемых действий, я сделаю небольшое теоретическое отступление.
Технология OLE DB допускает два варианта подключения:
Для создания подключения в FastReport Studio можно использовать любой из этих способов. Я буду создавать соединение с использованием IBProvider. Почему я сделала такой выбор, а также подробно о достоинствах и недостатках технологий ODBC и OLE DB можно узнать здесь http://www.ibprovider.com/rus/documentation/firebird_interbase_odbc_drivers.html
Параметры строки соединения задают способом подключения к БД. Строка подключения хранится в udl-файле. Файлы «Microsoft Data Link» (*.udl) создаются и редактируются с помощью специального редактора «Data Link Properties». Основная задача этого редактора — построить строку соединения. Параметры строки зависят от OLE DB-провайдера, поэтому для некоторых OLE DB-провайдеров внешний вид редактора может отличаться от стандартного. Создать udl-файл легко. В системах типа Windows 2000 и более новых надо создать пустой файл с расширением udl, а редактор «Data Link Properties» открывается автоматически при попытке открыть файл.
Вернемся к примеру. Создадим и откроем файл test_fb.udl. На странице «Поставщик данных» выберем OLE DB Provider for InterBase:
На странице «Подключение» введем путь к базе данных (можно вводить как абсолютный, так и относительный путь), имя, пароль, кодовую страницу, уровень изоляции, как показано на рисунке:
На странице «Дополнительно» введем тип клиента:
На этом настройка завершена. Перед нажатием «Ok» есть возможность протестировать соединение с помощью кнопки «Проверить подключение» на странице «Подключение».
Для использования отчетов на компьютерах конечных пользователей следует выполнить регистрацию компонента. Документация предлагает два способа регистрации: либо с помощью вызова экспортируемой функции DllRegisterServer из библиотеки Redist\FastReport3.dll, либо командной строкой:
regsvr32.exe FastReport3.dll. |
В примере я использовала способ с вызовом экспортируемой функции. Обработчик bbRegisterServerClick — регистрация компонента, обработчик bbUnregisterServerClick — удаление компонента.
Для распространения отчетов конечным пользователям кроме файла FastReport3.dll понадобится файл Bin\Russian.frc — это русские ресурсы для окна предварительного просмотра. Готовый метод для печати отчета выглядит так:
procedure TfmFRStudioDelphi.bbReport1 (Sender: TObject); var VReport : Variant; VRepName: WideString; begin //отчет "Список платежей" VRepName:= 'FRep\Report1.fr3'; VReport:= CreateOleObject('FastReport.TfrxReport'); //создание компонента TfrxReport VReport.Resources.LoadLanguageResourcesFromFile('Russian.frc'); //руссификация просмотра отчета VReport.LoadReportFromFile(VRepName); //загрузка отчета VReport.ShowReport; //построение и показ отчета end; |
На языке С++ метод для печати отчета будет иметь вид:
//отчет "Список платежей" IfrxReportPtr VReport(__uuidof(TfrxReport)); //создание компонента TfrxReport VReport->Resources->LoadLanguageResourcesFromFile('Russian.frc'); //руссификация просмотра отчета VReport->LoadReportFromFile('FRep\Report1.fr3’); //загрузка отчета VReport->ShowReport; //построение и показ отчета |
Нажав на кнопку печати отчета «Список платежей», получим следующий результат:
Вид готового отчета «Расшифровка по видам платежей»:
Как видно из примеров, получить требуемый результат совсем не сложно.
Статья и примеры к ней наглядно показывают основные преимущества FastReport Studio:
К статье приложен архив example.zip с примерами, описанными в статье.