ГЛАВНАЯ СТРАНИЦА

Генератор отчетов Fast Report

10.2

История переиздания
04.10.2021

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

Узнать, что может Fast Report и как с ним работать можно в его документации.

Как открыть окно дизайнера макета печатных представлений?

Это можно сделать по команде «Дизайн» контекстного меню панели «Печать».

Рисунок 279. Открытие окна дизайнера печатных представлений

Открытие окна дизайнера печатных представлений

Какие дополнительные возможности работы с данными отчета доступны пользователю?

Данные отчета выводятся на дата-бендах (компоненты MasterData, DetailData и SubdetailData). В печатных представлениях отчетов и форматов печати программных модулей записи на дата-бендах обычно выводятся в том порядке, который определен запросом. А в печатных представлениях форматов печати экранных форм - в том же порядке, что и в таблице элементов экранной формы.

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

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

Чтобы выполнить эти операции нужно указать необходимые значения для атрибутов дата-бенда. Какие атрибуты необходимы для выполнения этих операций можно узнать из таблицы.

ОперацияАтрибуты дата-бендаТип вводимых данных
СортировкаDataFileldOrderСтрочный (список полей, разделенных запятыми)
ФильтрацияDataFilterСтрочный (выражение)
Управление видимостью в печатном представленииVisibleConditionСтрочный (выражение)
Формирование древовидного спискаDataFieldTreeKey, DataFieldTreeParentСтрочный (названия ключевого поля и поля родителя, соответственно)

Как отсортировать данные дата-бенда?

Для сортировки данных дата-бенда используется свойство FieldOrder. Для него нужно указать названия полей, по которым выполняется сортировка. Поля в списке разделяются запятыми.

Для каждого из полей дополнительно можно указать порядок сортировки (по возрастанию ASC или по убыванию DESC). По умолчанию выполняется сортировка по возрастанию значений.

Как отфильтровать данные дата-бенда?

Фильтрация данных позволяет вывести в печатном представлении не все данные из таблицы элементов или возвращенные запросом, а только те, которые удовлетворяют заданным условиям.

Подсказка

Условие фильтрации должно соответствовать требованиям языка Transact SQL.

Для фильтрации данных укажите условие фильтрации в атрибуте DataFilter.

Рисунок 280. Задание условия для фильтрации данных потока

Задание условия для фильтрации данных потока

Для фильтрации данных потока можно использовать локальные SQL-запросы. Для выполнения локального запроса необходимо создать новый обработчик событий или использовать ранее созданный.

Для локального запроса необходимо использовать компонент TssFastReportDataSet.

//Пример локального запроса для фильтрации данных
TssFastReportDataSet(MasterData1.DataSet).LocalSQL := 'SELECT FROM Main WHERE <условие фильтрации>'
    

Как управлять видимостью данных потока?

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

Для управления видимостью данных необходимо указать условие видимости в значении атрибута VisibleCondition.

С помощью атрибута VisibleCondition можно связать дата-бенды MasterData и DetailData. Например, в дата-бенде MasterData будут выводиться атрибуты актов списания, а в дата-бенде DetailData - элементы спецификаций этих документов.

Рисунок 281. Задание условия видимости данных потока

Задание условия видимости данных потока

Как вывести древовидный список?

В некоторых отчетах может возникнуть необходимость вывести некоторые данные в виде древовидного списка, например, при выводе рецепта составного продукта.

Чтобы правильно отобразить древовидный список, нужно указать значения двух атрибутов: DataFieldTreeKey и DataFieldTreeParent. Для атрибута DataFieldTreeKey нужно указать название ключевого поля, а для атрибута DataFieldTreeParent – название поля родительского элемента.

Для текстового объекта необходимо указать величину отступа от левой границы (атрибут TreeLevelMargin) и, при необходимости, текст, выводимый перед значением (атрибут TreeText).

Рисунок 282. Задание условия для вывода древовидного списка данных потока

Задание условия для вывода древовидного списка данных потока

Как управлять заголовками страниц в печатных представлениях?

Для вывода отчетов в стандартном стиле Tillypad в генератор отчетов включен компонент TssPageHeader ().

В заголовке такого печатного представления выводятся:

  • информация о печатном представлении: название печатного представления (отчета, документа и т.п.), сведения об организациях, выбранные значения фильтров.

  • служебная информация: номер текущей страницы и общее количество страниц, фамилия сотрудника, который вывел печатное представление на печать, дату и время вывода на печать.

  • логотип Tillypad.

Вид заголовка первой страницы отличается от вида заголовка на последующих страницах.

Рисунок 283. Заголовок первой страницы

Заголовок первой страницы

В заголовке первой страницы выводятся:

  • Название печатного представления.

  • Сведения об организациях.

    Если данные отчета относятся к разным организациям, то выводится информация обо всех этих организациях.

  • Значения фильтров.

    Выводятся все выбранные значения всех фильтров. Вывод значений каждого из фильтров начинается с новой строки.

Высота заголовка первой страницы позволяет вывести все значения.

В заголовках последующих страниц выводятся:

  • Название печатного представления.

    Для вывода используется меньший размер шрифта, чем на первой странице.

  • Сведения об организациях.

    Если данные отчета относятся к одной организации, то выводится информация о ней. А если данные отчета относятся к разным организациям, то выводится сообщение <разные организации> или <different organizations>.

  • Значения фильтров.

    Выводятся значения всех фильтров на одной строке, через запятую.

Высота заголовка последующих страниц ограничена высотой блока служебной информации.

Рисунок 284. Заголовок последующих страниц

Заголовок последующих страниц

Примечание

При использовании компонента TssPageHeader можно управлять только выводом информации о печатном представлении и служебной информацией.

Изменение дизайна заголовка страницы невозможно.

Какие атрибуты у компонента TssPageHeader?

Примечание

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

  • DifferentOrganizationText – сообщение, выводимое на второй и последующих страницах печатного представления, если данные в нем относятся к различным организациям.

    Для русскоязычных печатных представлений нужно выбрать значение <разные организации>, а для англоязычных – значение <different organizations>. Выбор вариантов значений для печатных представлениях на других языках не предусмотрен.

  • FilterNCaption – заголовок фильтра.

    Примечание

    В заголовке печатного представления можно указать до 9 фильтров. Для каждого из фильтров в названиях полей FilterNCaption, FilterNDataSet, FilterNFieldName и FilterNFromCurrentRecord вместо символа N выводится порядковый номер фильтра от 1 до 9.

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

  • FilterNDataSet – поток данных, из которого будут выводиться значения фильтра.

    Выбор производится из списка поля. В него включаются все доступные потоки данных.

  • FilterNFieldName – имя поля, данные из которого будут выведены в заголовке печатного представления.

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

  • FilterNFromCurrentRecord – признак необходимости вывода значений поля только из текущей записи.

    Выбор значений производится из фиксированного списка True или False.

    Если выбрано значение False, то в заголовке будут выведены все значения указанного поля, а если выбрано значение True, то только значение поля, относящееся к текущей записи.

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

  • OrganizationCurrentRecord – признак необходимости вывода значений поля только из текущей записи.

    Выбор значений производится из фиксированного списка True или False.

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

  • OrganizationDataSet – поток данных, из которого будут выводиться сведения об организациях, к которым относятся данные печатного представления.

    Выбор производится из списка поля. В него включаются все доступные потоки данных.

  • OrganizationFieldName – поле, из которого будут выводиться сведения об организациях, к которым относятся данные печатного представления.

  • PageNumeration – способ нумерации страниц в печатном представлении.

    В поле можно выбрать значения pnAbsolutePageNo или pnLogicalPageNo. Если выбрано значение pnAbsolutePageNo, то в печатном представлении будет использована сквозная нумерация страниц. При этом на каждой странице печатного представления будут выводиться ее порядковый номер и общее число страниц. А если было выбрано значение pnLogicalPageNo – то будет использована логическая нумерация страниц, при которой для каждой группы нумерация начинается заново. В этом случае на каждой странице будут выводиться номер странице в группе и общее количество страниц в этой же группе.

    Внимание

    Чтобы использовать логическую нумерацию нужно:

    1. Использовать двухпроходный отчет. Для этого необходимо присвоить значение True атрибуту DoublePass объекта Engine.

    2. У заголовка группы (компонент GroupHeader), в которой нумерация должна начинаться заново, необходимо присвоить значение True атрибутам StartNewPage и ResetPageNumber.

  • PageTextFormat – формат сообщения для вывода номера текущей страницы и общего количества страниц в заголовке печатного представления.

    Для русскоязычных печатных представлений необходимо выбрать значение Страница: %u из %u, а для англоязычных - значение Page: %u from %u. Выбор вариантов значений для печатных представлениях на других языках не предусмотрен

  • ReportCaption – заголовок печатного представления, выводимый на его первой и последующих страницах.

  • StretchMode – режим изменения высоты компонента в зависимости от его содержания.

    Выбор значений производится из списка: smActualHeight, smDontStretch или smMaxHeight.

    Для правильного отображения заголовка печатного представления необходимо выбрать значение smMaxHeight.

  • UserDataSet – поток данных, из которого будут выводиться фамилия и инициалы сотрудника, который вывел печатное представление на печать.

    Выбор производится из списка поля. В него включаются все доступные потоки данных.

  • UserFieldName – поле, из которого будут выводиться фамилия и инициалы сотрудника, который вывел печатное представление на печать.

Как управлять заголовками в группированных отчетах?

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

Внимание

Для формирования такого печатного представления требуется:

  1. Сделать печатное представление двухпроходным, присвоив значение True атрибуту DoublePass объекта Engine. Это требуется сделать для логической нумерации страниц.

  2. У заголовка группы (компонент GroupHeader), в которой нумерация должна начинаться заново, значение True необходимо присвоить атрибутам StartNewPage и ResetPageNumber.

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

Если значения фильтров можно получить из основного потока, то для формирования группированного печатного представления достаточно:

  • в атрибуте FilterNDataSet указать название потока,

  • в атрибуте FilterNFieldName указать название поля, из которого будут получены значения фильтра.

  • атрибуту FilterNFromCurrentRecord присвоить значение True,

  • атрибуту FilterNCaption присвоить, если необходимо, значение для заголовка фильтра.

При использовании специального потока со значениями фильтра требуется на вкладке Code:

  • Создать глобальную переменную, например, FilterString, и обработчик события OnBeforePrint для компонента TssPageHeader.

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

var FilterString: String ='';

procedure TssPageHeader2OnBeforePrint(Sender: TfrxComponent);                                              
begin
  if TssFastReportDataSet(MasterData1.DataSet).DisplayText('stor_ID') <> FilterStore then begin
     FilterStore := TssFastReportDataSet(MasterData1.DataSet).DisplayText('stor_ID');
// Фильтрация складов                                                      
     TssFastReportDataSet(Report.GetDataSet('Stores')) := 'SELECT FROM Main WHERE stor_ID='+FilterStore;
// Фильтрация юридических лиц                                                                      
     TssFastReportDataSet(Report.GetDataSet('OwnFirms')) := 'SELECT FROM Main WHERE stor_ID='+FilterStore;  
// Обновление данных в компоненте заголовка страниц
     TssPageHeader2.ReloadData;
  end;            
end;
          
          

Как вывести видео в печатном представлении?

В генератор отчетов включен компонент TfrxVideoFrame (), позволяющий выводить видео в печатных представлениях.

Чтобы получить возможность воспроизводить видео в печатном представлении, откройте окно дизайнера, поместите компонент TfrxVideoFrame на форму и укажите путь к файлу с видео в свойстве FileName.

Рисунок 285. Компонент для вывода видео в печатном представлении

Компонент для вывода видео в печатном представлении

Какие дополнительные функции можно использовать в Fast Report?

BarcodeCommand

Формирование QR-кода.

BarcodeCommand(const Text:String='';
               BarcodeType:string='QR';
               PrintText:Boolean=false;
               const Overlay:string='';
               Alingment:string='center';
               Scale:Integer=1;
               Height:Integer=3):String;    

FormatDateRange

Преобразование диапазона дат в строку.

FormatDateRange(DateBegin,DateEnd:TDateTime;
                Language:Integer=LANG_NEUTRAL):String;     
   

LicenseKeyToString

Преобразование кода лицензии в строку.

LicenseKeyToString(Value: TGUID):String;      
    

MoneyToVerbal

Преобразование суммы в строку.

MoneyToVerbal(Value:Extended;
              Options:Integer=MTVO_NONE;
              CurrencyType:Integer=CURRENCY_DEFAULT;
              Language:Integer=LANG_NEUTRAL):String;