3.4.1. Шаблон FastReport

В клиентское приложение системы Global встроен построитель отчётов «FastReport ©», предоставляющий более широкие возможности, чем отчёты на основе шаблонов Word и Excel.

Доступны 3 версии отчетов FastReport:
  • FastReport 2
  • FastReport 4
  • FastReport 5

Attention

FastReport 5 использует тот же формат файла, что и FastReport 4, но добавляет в него ряд новых объектов (2D штрихкоды). Если отчет, сохраненный в FR5, открыть в FR4, то объекты, о которых FR4 не знает, исчезнут. Если такой отчет сохранить в FR4, то он будет поврежден. Для того, чтобы этого избежать, на целевую базу необходимо установить обновление модуля RPT (если это еще не сделано, то при попытке открыть отчет на редактирование клиент об этом напомнит).

Создайте отчёт и версию отчёта (как, смотри выше), укажите тип шаблона «Отчёт FastReport» и откроёте шаблон на редактирование. Перед вами появится окно редактора отчёта.

../../../_images/fastReport.jpg

О том, что да как читайте в хелпе ФастРепорта. Он лежит тут:

//VSS/Application/Reporter/DOC/Fruser.hlp Также на многие вопросы можно найти ответы на сайте FastReport’a, в разделе FAQ для FastReport 2.XX VCL.

Ниже – краткое описание техники создания отчёта (с предположением того, что терминология уже известна).

Для доступа к данным СУБД Oracle, в палитру компонентов диалоговых форм, были добавлены компоненты:

  • «База данных» - подключение к БД
  • «Запрос» - доступ к данным

Поскольку отчёты будут открываться из клиентского приложения, использовать компонент «База данных» не нужно. У отчёта есть подключение к БД по умолчанию «Default». Это база, к которой в данный момент подключено приложение.

В список источников данных для секции «Master data», добавлен источник frSelection Этот источник будет подцеплен к выборке, из которой был вызван отчёт.

3.4.1.1. Доступные параметры:

Имя параметра Возможные значения Описание
TextMode 0,1 Указывает отчёту, что печать должна производиться в текстовом режиме. Параметр предназначен для быстрой печати на матричных принтерах.
CurrentSession 0,1 По умолчанию, построение отчёта происходит в новой сессии. Это не всегда удобно для печати каких-то сиюминутных данных. Используйте данный параметр для построения отчёта в текущей сессии (без сохранения данных перед печатью).
PassByDataSet 0,1 При построении отчёта по открытой выборке, по умолчанию, обход записей происходит в том порядке, как записи отображаются на экране, с учётом клиентских фильтров и сортировок. Используйте этот параметр, если необходимо обойти записи в том порядке, как они находятся в таблице, без учёта клиентских сортировок и фильтров. Обход записей по таблице быстрее, чем обход с учётом клиентских сортировок и фильтров.
FileName Строка, содержащая имя файла Указывает имя файла, куда будет сохранён отчет после построения, либо имя HTML файла в почтовом клиенте. Параметр имеет смысл только при построении отчёта с типом действия rvmSave и rvmShow.По расширению имени файла определяется формат, в который необходимо сохранить отчёт. Например, если будет задано имя файла C:testsave.txt, отчёт будет сохранён в текстовом формате. C:testsave.xls – в формате Excel.В случае если параметр используется с действием rvmShow то необходимо указывает короткое имя файла с расширением, например “Report.html”. После открытия файла на просмотр можно по нажатию на кнопку «Создать E-mail(HTML)…», на панели инструментов, сформировать электронное письмо в почтовом клиенте в HTML формате, поддерживающем интерфейс Simple MAPI, который должен являться клиентом по умолчанию.
ShowExportDialog 0,1 Указывает на необходимость отображения диалога экспорта при сохранении построенного отчёта. По умолчанию диалоги экспорта отображаются. Параметр имеет смысл только при построении отчёта с типом действия rvmSave.
Multiple 0,1 По умолчанию страницы отчёта выводятся в порядке 1,1,1,2,2,2. Укажите этот параметр со значением «1», если необходимо изменить порядок вывода на 1,2,1,2,1,2. Более подробно читайте ниже, в пункте «Изменение порядка вывода страниц отчёта»
DoublePass 0,1 Двухпроходный отчёт. При DoublePass = 1, Отчёт будет строится за 2 прохода. Это необходимо, например, для подсчёта количества страниц.
EmailMessage Строка, содержит текст письма Содержит текст сообщения электронного письма. Параметр имеет смысл только при построении отчёта с типом действия rvmShow.После открытия файла на просмотр можно по нажатию на кнопку «Создать E-mail(HTML)…», на панели инструментов, сформировать электронное письмо в почтовом клиенте в HTML формате, поддерживающем интерфейс Simple MAPI, который должен являться клиентом по умолчанию. Если EmailMessage будет пустая строка, и если используется клиент MS OutLook (Express), то отчет будет вложен в текст письма, а не прикреплен файлом. Почтовый клиент The Bat прикрепляет файл независимо от наполнения EmailMessage.
EmailAddress Строка, содержит адрес получателя письма Содержит адрес получателя электронного письма. Параметр имеет смысл только при построении отчёта с типом действия rvmShow.После открытия файла на просмотр можно по нажатию на кнопку «Создать E-mail(HTML)…», на панели инструментов, сформировать электронное письмо в почтовом клиенте в HTML формате, поддерживающем интерфейс Simple MAPI, который должен являться клиентом по умолчанию.
EmailSubject Строка, содержит тему письма Содержит содержит тему электронного письма. Параметр имеет смысл только при построении отчёта с типом действия rvmShow.После открытия файла на просмотр можно по нажатию на кнопку «Создать E-mail(HTML)…», на панели инструментов, сформировать электронное письмо в почтовом клиенте в HTML формате, поддерживающем интерфейс Simple MAPI, который должен являться клиентом по умолчанию.
ReadOnlyPreview 0,1 Запрещает открытие шаблона отчета для редактирования из предпросмотра. По умолчанию разрешено.
PreviewButtons Строка, содержит названия кнопок отображаемых на панели окна просмотра отчета

Доступны следующие значения (в скобках указаны названия отображаемых кнопок):

Print (Печать)
Диалог вывода на печать.
Load (Открыть)
Диалог загрузки отчета.
Save (Сохранить)
Диалог сохранения в формате FastReport
Export (Сохранить)
Диалог сохранения в сторонних форматах (PDF, HTML, Excel, Word, BMP, JPEG, TIFF, Gif и CSV)
QuickExport (Сохранить в PDF)
Диалог сохранения в PDF.
Email (Отослать по E-mail)
Диалог отправки отчета по электронной почте. Игнорируется если не указан QuickExport
Zoom (Увеличить, Уменьшить, Выпадающее меню с выбором масштаба)
Кнопки управления масштабом.
FullScreen (Во весь экран)
Открытие окна превью во весь экран. Скрывает панель инструментов и границы окна. Игнорируется если не указан Zoom.
Find (Найти)
Диалог текстового поиска.
Outline (Дерево отчета, Миниатюры)
Навигация по структуре отчета.
PageSetup (Свойства страницы)
Диалог настройки размеров, ориентации и полей страниц.
Edit (Редактировать страницу)
Редактор отчета. Если используется режим запрещающий редатирование (ReadOnlyPreview), кнопка будет отображаться как заблокированная.
Navigator (На первую страницу, На предыдущую страницу, Номер страницы, На следующую страницу, На последнюю страницу)
Навигатор по страницам отчета.
Close (Закрыть)
Закрытие окна превью.

Если в качестве значения будет передана пустая строка, не отобразится ни одной кнопки. Если в качестве значения будет передан Null, будет использовано значение по умолчанию. По умолчанию отображаются все кнопки.

New in version Global: 5.8.0_ms8

Пример использования:
<PASCAL>
  Selection.CreateReportEx('FPT_FRDemoReport', null, rvmSave, 1, '', fcfModal, ['FileName', 'ShowExportDialog'], ['V\FRSaveFileNameNoDialog.txt', 0]);
</PASCAL>

3.4.1.2. Скриптовые методы

Отчёты FastReport поддерживают собственный скриптовый язык, о котором опять-таки можно прочитать в справочной системе FastReport’a. Ниже приведены добавленные нами методы.

Метод Описание
ParamCount Возвращает количество параметров отчета.
ParamValue (<число>) Возвращает значение параметра отчета по номеру, нумерация от 0.
ParamName (<число>) Возвращает имя параметра отчета по номеру, нумерация от 0.
ParamValueByName (<строка>) Возвращает параметр отчета по имени (регистр имени не имеет значения).
ParamText (<число>) Возвращает текст (т.е. не вычисленное выражение) параметра отчета по номеру, нумерация с 0.
ParamTextByName (<строка>) Возвращает текст (т.е. не вычисленное выражение) параметра отчета по имени (регистр имени не имеет значения).
Quote Возвращает кавычку.
ParamExist (<строка>) Если параметр отчета с именем <строка> существует, то возвращает true (регистр имени не имеет значения).
LPad (<строка>,<число>,<строка>): string Добавляет подстроку к строке слева до заданной длины
RPad (<строка>,<число>,<строка>): string Добавляет подстроку к строке справа до заданной длины
NVL (< Variant>,< Variant>): Variant; Возвращает второй аргумент, если первый = Null
NVL2 (<Variant>,<Variant>,<Variant>): Variant Возвращает второй аргумент, если первый не Null, третий - если первый = Null
NumberToStrRUS (<число>): string; Возвращает число прописью на русском
GetFIODeclension (<строка(ФИО)>,<строка(род)>,<число(#падежа)>): string Возвращает строкой результат склонения фамилии, имени и отчества, записанных одной строкой, заданного рода в указанный падеж.
GetIFDeclension (<строка(ИФ)>,<строка(род)>,<число(#падежа)>) : string Возвращает строкой результат склонения имени и фамилии, записанных одной строкой, заданного рода в указанный падеж.
ShowMessage (<строка>); Показывает текстовое сообщение
CloseFormOk Закрывает диалоговое окно с результатом mrOk (может использоваться только в скриптах диалоговых форм)
CloseFormCancel Закрывает диалоговое окно с результатом mrCancel (может использоваться только в скриптах диалоговых форм)
GetVar возвращает значение атрибута (параметра) выборки, из которой был вызван отчёт (префикс Super$ - работает)

3.4.1.3. Отчёт без использования запросов (по результатам открытой выборки)

Нарисуйте шаблон отчёта. В качестве источника данных для бэнда «MasterData» укажите frSelection. Для доступа к данным выборки возможны 2 способа:

  • прямое обращение к атрибуту датасета: [“{имя атрибута}”] например: [“sSystemName”]
  • используя метод GetVar. Скрипт текстового элемента при этом будет выглядеть, например, так:
<pascal>
  Memo1.memo := GetVar(sSystemName);
</pascal>

или

<pascal>
  Memo1.memo := GetVar('sSystemName');
</pascal>

Имя параметра может быть как в кавычках, так и без них. При обращении к параметру фильтра или параметру выборки мастера, кавычки обязательны, поскольку имя параметра будет содержать символ «$».

3.4.1.4. Отчёт с использованием запросов FastReport’a.

Создайте форму диалога, бросьте на форму компонент «Запрос», напишите SQL запрос в свойстве SQL компонента. Если в SQL запросе были использованы параметры, например:

Select :sSystemName from dual

В текст скрипта OnActivate формы будет добавлен блок кода, запрашивающий значение параметра у выборки:

//<AutoGenerate>
  Query1.ParamValueByName['sSystemName'] := [GetVar(sSystemName)];
//</AutoGenerate>

Если на форме находиться несколько компонентов «Запрос», то после изменения свойства SQL у любого из них произойдет изменение скрипта OnActivate формы. Вы может писать собственный код скрипта OnActivate, причём, как до, так и после блока <AutoGenerate> </ AutoGenerate>. При использовании связки Мастер-Деталь (когда второй «запрос» смотрит на первый), а в детальном запросе будет присутствовать параметр, смотрящий на запрос-мастер, в скрипт OnActivate также будет добавлен код, однако, это не страшно: если атрибут с таким именем присутствует в запросе-мастере, то будет взято его значение, а не значение из выборки.

При использовании двух запросов FR в связке мастер-деталь, параметры в запросе-детали должны быть без приставки super$

Пример:

Запрос-мастер:
Select id, sSystemName, sCaption from SomeTable1
Запрос-деталь:
Select id, dDate, fSumm from SomeTable2 where id = :id

3.4.1.5. Наложение условий фильтрации и сортировка в запросах FR.

Для динамической подстановки условий фильтрации и порядка сортировки в запросы FR (далее просто “запрос”) из внешнего мира, необходимо использовать макросы (аналогично макросам, используемым в GetSQLText выборок).

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

Пример:
Select id, sSystemName, dDate
From SomeTable
Where &DefUniFltMacros AND &DefFltMacros
&AnyMacros

Перед началом построения отчёта значения макросов будут взяты из:

  • Выборки, вызвавшей построение отчёта.
  • Параметров, переданных в процедуру CreateReportEx().
Например, так:
<PASCAL>
  Selection.CreateReportEx('MacrosTest', null, rvmShow, 1, '', fcfModal, ['Query1.AnyMacros'], [' ORDER BY sSystemName ']);''
</PASCAL>

В процедуру передаётся имя макроса с указанием имени запроса, в котором этот макрос использован, в формате [{имя запроса}.{имя макроса}] В текущий момент зарезервированы следующие имена макросов:

DefUniFltMacros – вместо него будет подставлено выражение универсального фильтра, наложенного на выборку, из которой был вызван отчёт. Если универсальный фильтр не применён, то макрос будет заменён на выражение ‘ (3 = 3) ‘.

SortOrderвместо него будет подставлен текст “ ORDER BY ”+ {имена полей, по которым выполнена сортировка выборки}. Если выборка не была отсортирована, макрос будет просто удалён. Если через параметр было передано значение макроса существующего в выборке, то в запросе будет использовано значение, переданное через параметр.

Если в запросе был использован макрос, значение которого не было передано через параметр, и макроса с таким именем нет в выборке, макросу будет присвоено значение ‘ (3 = 3) ‘. Исключением является макрос SortOrder

3.4.1.6. Подстановка условий стандартного фильтра

Для подстановки условий стандартного фильтра в запрос, необходимо, что бы в тексте запроса присутствовал макрос, имя которого совпадает с макросом стандартного фильтра в выборке. Так, для фильтра по умолчанию, необходимо использовать макрос DefFltMacros. Запрос в этом случае будет иметь следующий вид:

Select id, sSystemName, dDocDate
From SomeTable
Where &DefFltMacros

После замены макроса условием, запрос примет такой вид:

Select id, sSystemName, dDocDate
From SomeTable
Where (DDOCDATE = :FLT_DDOCDATE AND SSYSTEMNAME = :FLT_SSYSTEMNAME)

Значения параметров будут подтянуты автоматически

3.4.1.7. Подстановка условий универсального фильтра

Для подстановки условий универсального фильтра в запрос, необходимо, что бы в тексте запроса присутствовал макрос DefUniFltMacros. Запрос в этом случае будет иметь следующий вид:

Select id, sSystemName, dDocDate
From SomeTable
Where &DefUniFltMacros

После замены макроса условием, запрос примет такой вид:

Select id, sSystemName, dDocDate
From SomeTable
Where (DDOCDATE = '12.25.2005' AND Upper(SSYSTEMNAME) = Upper('Example'))

3.4.1.8. Подстановка текущего порядка сортировки выборки в запрос FR

Для подстановки текущего порядка сортировки выборки используйте макрос SortOrder

Например так:
Select id, sSystemName, dDocDate
From SomeTable
Where &DefUniFltMacros
&SortOrder#

Если выборка, из которой было вызвано создание отчёта была отсортирована пользователем запрос примет следующий вид:

Select id, sSystemName, dDocDate
From SomeTable
Where (DDOCDATE = '12.25.2005' AND Upper(SSYSTEMNAME) = Upper('Example'))
ORDER BY sSystemName

3.4.1.9. Подстановка произвольного SQL кода в запрос

Имена макросов используемых в запросе могут быть произвольными. Как было написано ранее, значения макросов возможно передавать в качестве параметров через CreateReportEx вызов. По-этому написав, например, такой запрос:

Select &AnyMacros
From AnyTable

и передав значение макроса:

Selection.CreateReportEx(‘MacrosTest’, null, rvmShow, 1, ‘’, fcfModal, [‘Query1.AnyMacros’], [ ‘id’, ‘sSystemName’]); в результате получится запрос

Select id, sSystemName
From AnyTablre

В качестве экстремального решения, возможно просто написать в запросе имя макроса &AnyMacros, а через параметры передать SQL-запрос:

<PASCAL>
  MacroValue := 'select t.ID, t.dDocDate, t.nDocNum, t.sCaption, t.sContras, t.idClass, :fSumm as fSumm from DemoReport t';

  Selection.CreateReportEx('MacrosTest', null, rvmShow, 1, '', fcfModal, ['Query1.AnyMacros'], [MacroValue]);
</PASCAL>

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

3.4.1.10. Использование параметров frSelection (или другого источника данных) в хидере и футере FR-отчетов

Почему-то сложилось мнение, что “в хидере и футере FR-отчетов можно использовать только переменные, предварительно добавленные AddVar при открытии отчета”.

Это есть огромное заблуждение!

В мемках, расположенных на хидере и футере, можно замечательно обращаться к параметрам, как выборки, так и параметрам “запросов”.

Для frSelection:

Необходимо использовать метод GetVar({имя атрибута или параметра}).

Например:
Memo1.Memo := GetVar('sCaption');

Также можно обращаться к параметрам frSelection по их полному имени. Так же, как это делается для полей “запроса” FR. [frSelection.”{имя параметра}”]

Пример:

[frSelection."sCaption"]

Перед началом построения отчёта, все тэги типа [frSelection.”{имя параметра}”] будут заменены на значения параметров из выборки.

Attention

Подстановка значений производится только 1 раз перед началом построения отчета. По-этому, если вы используете тэг [frSelection.”{имя параметра}”] в тексте Memo, находящемся, например, в секции MasterData, значение параметра не будет запрашиваться для каждой строки.

Для запросов FR

Необходимо просто обратиться к филду “запроса” находящегося на форме отчёта FR, точно так же, как это делается в секции MasterData, только необходимо указать полное имя филда. Это делается с помощью следующего кода, в тексте Memo, например:

[Form1.Query1."sCaption"]

Код состоит из:: [{имя формы}.{имя запроса}.”{имя поля}”]

3.4.1.11. Особенности вывода текстовой информации с помощью TfmMemoView

Компонент TfrMemoView (текстовое поле) предназначен для вывода информации на бланк отчёта. Этот компонент обладает двумя свойствами «Текст» (оно же “frMemoView.Memo”) и «Скрипт». Эти два свойства редактируются через диалог, открывающийся по двойному клику на компоненте.

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

<pascal>
  Memo1.Memo := GetVar('sCaption');
</pascal>

могут возникать ошибки печати. Причиной этих ошибок может быть наличие в значении поля «sCaption» спецсимволов или имён функций, воспринимаемых парсером FR, как выражение.

Например, если атрибут «sCaption» будет иметь значение:

[1/2”] Гайка ГОСТ 5968

после присвоения этого значения в скрипте свойству «Текст», парсер выдаст ошибку «значение ”2] Гайка ГОСТ 5968” не может быть преобразовано в число».

Для того чтобы избежать разбора парсером свойства «Текст», а значит и предотвратить ошибку, у компонента Memo необходимо выставить свойство «Только текст». Это свойство находится в контекстном меню компонента (клик правой кнопкой мыши на компоненте).

Будьте осторожнее с использованием символов “[“ и “]” в свойстве «Текст». Эти символы обозначают начало и конец выражения, которые обрабатывает парсер FR.

3.4.1.12. Возможность присоединения “запросов” к выборке frSelection

Все “Запрос”ы FR, у которых не проставлено свойство DataSource, считаются деталями к выборке frSelection и подцепляются к ней. Вследствии этого, при переходе frSelection с записи на запись, будет происходить перезапрос детальных “Запрос“‘ов (если конечно эти запросы обладают параметрами смотрящими на мастера).

Attention

Для того, чтобы из “запрос”а FR обратиться к frSelection необходимо использовать параметры без super$

Например:
select t.ID, t.IDDemoReport,
DemoReportCollectionAPI.GetIDDemoReport_HL(t.IDDemoReport) as IDDemoReport_HL,
t.fSumma, t.nCount, t.sName, t.idClass
from DemoReportCollection t
where  t.IDDemoReport = :id

Использование параметров содержащих префикс super$ допустимо, если вам необходимо обратиться к выборке, являющейся мастером для выборки frSelection.

3.4.1.13. Создание отчётов типа мастер-деталь

Для создания отчёта мастер-деталь необходимо иметь 2 набора данных, связанных между собой. Этими наборами могут быть «выборка + запрос FR» или «Запрос FR + Запрос FR». При этом в первом случае наборы данных будут связаны автоматически (см. пункт выше), во втором случае наборы данных необходимо связать, указав у детали в качестве DataSource - запрос-мастер.

3.4.1.14. Изменение порядка обхода записей в выборке frSelection

При построении отчёта FR по выборке frSelection, возможны 2 варианта обхода записей. Записи выводятся на печать в порядке:

  1. как они были отсортированы пользователем, т.е. в том порядке, как они отбражаются на экране (по умолчанию)
  2. как они были возвращены запросом

Управлять этим можно с помощью параметра “PassByDataSet”

Возможные значния:

  1. - обход в порядке пользовательской сортировки
  2. - обход в порядке, возвращённом запросом
Пример:
<PASCAL>
  Selection.CreateReportEx('FR_PassbyDataSet', null, rvmShow, 1, '', fcfModal , ['PassByDataSet'], [1]);
</PASCAL>

3.4.1.15. Кросс отчёты

Attention

При построении кросс отчёта используйте короткие имена атрибутов (не более 10 символов).

Если в левую группировку включается более 2-ух атрибутов и хотя бы один из них имеет имя более 10 символов, возникает ошибка:

Документ: frReportC

Объект: CrossMemo_0Cross1

List index out of bounds (17)

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

Select
t.FirstLeftGroupAttribute as FstLGAttr,
t.SecondtLeftGroupAttribute as SndLGAttr,
t.ThirdLeftGroupAttribute as TrdLGAttr,
t.RightGroupAttrirute as RGAttr,
t.sValue
From SomeTable t

3.4.1.16. Изменение порядка вывода страниц отчёта

Если шаблон отчета имеет несколько страниц, то FastReport печатает сначала все записи первой страницы, потом все записи второй, и т.д. Чтобы поменять это, в источнике данных TftSelection должно быть столько записей, сколько раз надо повторить печать страниц, и передать в CreateReportEx(..) параметр Multiple = 1.