Отчеты
=================================================
Общие сведения
--------------
Отчёт – средство вывода информации из базы данных в виде, пригодном для
печати. В системе Global отчеты вынесены в отдельный модуль RPT.
Построение отчётов производится на основе шаблонов, настроенных
разработчиком приложения. Система поддерживает шаблоны на основе
документов: MS Word (\*.doc), MS Excel (\*.xls, \*.xlsx, \*.xlsm), Rich Text
Format (\*.rtf), TXT (\*.txt) и FastReport (\*.frf).
Шаблон – размеченный определённым образом документ, на основе которого
происходит построение отчёта.
Версия отчёта – у каждого отчёта может быть несколько шаблонов,
отличающихся датой, начиная с которой шаблон вступает в силу.
Тэг – обрамлённый специальными символами текст, управляющий действиями
процессора отчётов.
Профиль печати – настройка, объединяющая несколько отчётов в группу для
последовательной печати нескольких документов по одному электронному
документу. Так же, профиль печати служит для автоматической связи отчёта
с классами системы Global.
Создание экземпляра отчёта
--------------------------
Вызвать интерфейс настройки отчётов можно из «Конфигуратора» (главное
меню настройки печать отчёты) или через приложение «Менеджер
отчётов».
Создайте новый отчёт (добавьте запись в верхнем списке), укажите
системное имя отчёта, модуль, которому принадлежит отчёт и наименование
отчёта.
В коллекции «версии отчёта» создайте версию отчёта и укажите дату, с
которой эта версия отчёта вступает в силу и тип шаблона отчёта.
Откройте шаблон на редактирование, с помощью операции «Редактировать
шаблон». В открывшемся диалоге можно: открыть шаблон на редактирование
или загрузить файл с созданным ранее шаблоном.
После окончания редактирования шаблона сохранить изменения.
Настройка профиля печати
------------------------
Вызвать интерфейс настройки профилей печати можно из «Конфигуратора»
(главное меню настройки печать профили печати) или через приложение
«Менеджер отчётов».
Интерфейс выполнен в виде дерева, корневые элементы которого являются
профилями печати, а элементы второго уровня – отчётами, включёнными в
профиль печати. Отчёт может быть включён в неограниченное кол-во
профилей печати.
Создайте профиль печати, укажите: системное имя, наименование и модуль.
Добавьте необходимые отчёты в профиль печати (операция «Добавить отчёт»
под операцией «Создать»).
В коллекции профиля печати укажите классы, в которых будет доступен
профиль печати.
Построение отчёта
-----------------
С помощью стандартных средств системы
_____________________________________
У каждой выборки системы Global существует операция «Печать», по
умолчанию вызывающая список профилей печати, настроенных для класса,
объекты которого отображаются этой выборкой. Из списка профилей печати
можно построить один из отчётов или все отчёты, включённые в профиль
печати.
.. attention::
Для корректной работы списка "Доступных профилей
печати" в выборке должен присутствовать атрибут "idClass", содержащий
идентификатор класса для текущей записи.
С помощью средств паскаль-операций
__________________________________
Стандартные средства паскаль-операций
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Для построения отчёта из паскаль-операции необходимо вызвать один из
следующих методов:
- :class:`InternalLibrary.TbtkScriptSelectionObject.CreateReport`
.. code-block:: pascal
:linenos:
:caption: Пример вызова
Selection.CreateReport(GetVar('sSystemName'), null, rvmShow, 0, ,fcfModal);
- :class:`InternalLibrary.TbtkScriptSelectionObject.CreateReportEx`
.. code-block:: pascal
:linenos:
:caption: Пример вызова
Selection.CreateReportEx(GetVar('sSystemName'), null, rvmShow, 0, ,fcfModal, [‘ParamName’], [‘ParamValue’]);
О допустимых параметрах читайте ниже. Для каждого из типов шаблона они свои. Но есть общие параметры:
+---------------------+-------------------------------------------------------------------------------+
| Название параметра | Описание |
+=====================+===============================================================================+
| **ShowPrintDialog** | Управляет диалогом выбора принтера перед выводом на |
| | печать. Если параметр имеет значение «0», диалог выбора принтера отображаться |
| | не будет. Печать будет произведена на принтере по умолчанию |
+---------------------+-------------------------------------------------------------------------------+
| **PrinterName** | Определяет принтер, на котором следует печатать |
+---------------------+-------------------------------------------------------------------------------+
| **CopiesCount** | Параметр управляет количеством копий отчёта, |
| | которые будут напечатаны. Этот параметр имеет смысл только при печати без |
| | просмотра (режим rvmPrint) |
+---------------------+-------------------------------------------------------------------------------+
| **Collate** | Разобрать по копиям. (по умолчанию = 1). При печати |
| | нескольких копий многостраничного документа сначала будут напечатаны все |
| | страницы первого экземпляра потом второго и т.д. |
+---------------------+-------------------------------------------------------------------------------+
Расширенные средства паскаль-операций
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
При желании заняться шаманством, или, если вам очень нужно указать
источник шаблона самостоятельно (это может быть как выборка с полем
Blob, в котором находится шаблон, так и файл на жестком диске), можно
использовать метод:
:class:`InternalLibrary.CreateReportForm`
.. code-block:: sql
:linenos:
[OUT idPVer, sMasterSelection, sMastSelRepresent]
BEGIN
idPVer:=RPT_REPORTVERSIONAPI.GetReportVersion('TestReport2',:sMasterSelection, :sMastSelRepresent);
END;
SQL блок возвращает ID версии отчёта, системное имя и отображение
главной выборки мастера отчётов, по системному имени отчёта и дате (если
дата не задана, берётся системная дата). Если вы не используете мастер,
просто не используйте вернувшиеся значения: sMasterSelection и
sMastSelRepresent
.. code-block:: pascal
:linenos:
{Если шаблон отчёта хранится в базе данных, то необходимо открыть выборку, которая вернёт этот шаблон. Для этого необходимо найти ID актуальной версии отчёта}
V:=ExecSQLEX('GetVer','idpVer;sMasterSelection;sMastSelRepresent',[ftFloat,ftString,ftString],[0,,]);
C:=CreateSelection; C.EntityName:='RPT_CurrentReportVersion';
C.Representation:='List'; C.AddVar('idpReportVer#',V[0],ftFloat);
C.Master:=Selection; C.Active:=true; {Вызываем генерацию отчёта}
CreateReportForm(C, 'blobDocument', C.GetVar('sDocType'), , rvmShow, ,fcfModal);
Если шаблон отчёта хранится в базе данных, то необходимо открыть
выборку, которая вернёт этот шаблон. Для этого необходимо найти ID
актуальной версии отчёта
Настройка шаблона отчёта
------------------------
Откройте список отчётов системы. Выберите или создайте отчёт. Выберите
или создайте версию отчёта. Нажмите на кнопку «Редактировать шаблон». В
открывшемся диалоге выберите необходимое действие: «Открыть на
редактирование» или «Загрузить новый файл». При выборе «Открыть на
редактирование» будет открыт редактор шаблона, согласно типу шаблона,
указанному в настройках версии отчёта.
Шаблон 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» и откроёте шаблон на редактирование. Перед вами
появится окно редактора отчёта.
.. image:: reports\fastReport.jpg
О том, что да как читайте в хелпе ФастРепорта. Он лежит тут:
//VSS/Application/Reporter/DOC/Fruser.hlp
Так же на многие вопросы можно найти ответы на сайте FastReport’a, в
разделе FAQ для FastReport 2.XX VCL.
Ниже – краткое описание техники создания отчёта (с предположением того,
что терминология уже известна).
Для доступа к данным СУБД Oracle, в палитру компонентов диалоговых форм,
были добавлены компоненты:
* «База данных» - подключение к БД
* «Запрос» - доступ к данным
Поскольку отчёты будут открываться из клиентского приложения,
использовать компонент «База данных» не нужно. У отчёта есть подключение
к БД по умолчанию «Default». Это база, к которой в данный момент
подключено приложение.
В список источников данных для секции «Master data», добавлен источник
**frSelection** Этот источник будет подцеплен к выборке, из которой
был вызван отчёт.
Доступные параметры:
~~~~~~~~~~~~~~~~~~~~
+----------------------+------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Имя параметра | Возможные значения | Описание |
+======================+==========================================+================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+
| **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 | Запрещает открытие шаблона отчета для редактирования из предпросмотра. По умолчанию разрешено. |
+----------------------+------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
.. code-block:: pascal
:linenos:
:caption: Пример использования:
Selection.CreateReportEx('FPT_FRDemoReport', null, rvmSave, 1, '', fcfModal, ['FileName', 'ShowExportDialog'], ['V::raw-latex:`\FRSaveFileNameNoDialog`.txt', 0]);
Скриптовые методы
~~~~~~~~~~~~~~~~~
Отчёты 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 | Возвращает второй аргумент, если первый не Null, третий - если первый = Null |
+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| **NumberToStrRUS** (<число>): string; | Возвращает число прописью на русском |
+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| **GetFIODeclension** (<строка(ФИО)>,<строка(род)>,<число(#падежа)>): string | Возвращает строкой результат склонения фамилии, имени и отчества, записанных одной строкой, заданного рода в указанный падеж. |
+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| **GetIFDeclension** (<строка(ИФ)>,<строка(род)>,<число(#падежа)>) : string | Возвращает строкой результат склонения имени и фамилии, записанных одной строкой, заданного рода в указанный падеж. |
+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| **ShowMessage** (<строка>); | Показывает текстовое сообщение |
+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| **CloseFormOk** | Закрывает диалоговое окно с результатом *mrOk* (может использоваться только в скриптах диалоговых форм) |
+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| **CloseFormCancel** | Закрывает диалоговое окно с результатом *mrCancel* (может использоваться только в скриптах диалоговых форм) |
+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+
| **GetVar** | возвращает значение атрибута (параметра) выборки, из которой был вызван отчёт (префикс Super$ - работает) |
+-----------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------+
Отчёт без использования запросов (по результатам открытой выборки)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Нарисуйте шаблон отчёта. В качестве источника данных для бэнда «MasterData» укажите frSelection. Для доступа к данным выборки возможны
2 способа:
- прямое обращение к атрибуту датасета: [“{имя атрибута}”] например: [“sSystemName”]
- используя метод GetVar. Скрипт текстового элемента при этом будет выглядеть, например, так:
.. code-block:: pascal
:linenos:
Begin
Memo1.memo := GetVar(sSystemName);
End
или
.. code-block:: pascal
:linenos:
Begin
Memo1.memo := GetVar(‘sSystemName’);
End
Имя параметра может быть как в кавычках, так и без них. При обращении к
параметру фильтра или параметру выборки мастера, кавычки обязательны,
поскольку имя параметра будет содержать символ «$».
Отчёт с использованием запросов FastReport’a.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Создайте форму диалога, бросьте на форму компонент «Запрос», напишите
SQL запрос в свойстве SQL компонента. Если в SQL запросе были
использованы параметры, например:
*Select :sSystemName from dual*
В текст скрипта OnActivate формы будет добавлен блок кода, запрашивающий
значение параметра у выборки:
.. code-block:: pascal
:linenos:
//
Query1.ParamValueByName['sSystemName'] := [GetVar(sSystemName)];
//
Если на форме находиться несколько компонентов «Запрос», то после
изменения свойства SQL у любого из них произойдет изменение скрипта
OnActivate формы. Вы может писать собственный код скрипта OnActivate, причём, как до, так и после блока AutoGenerate>.
При использовании связки Мастер-Деталь (когда второй «запрос» смотрит на первый), а в детальном запросе будет присутствовать
параметр, смотрящий на запрос-мастер, в скрипт OnActivate так же будет
добавлен код, однако, это не страшно: если атрибут с таким именем
присутствует в запросе-мастере, то будет взято его значение, а не
значение из выборки.
При использовании двух запросов FR в связке мастер-деталь, параметры в
запросе-детали должны быть без приставки super$
Пример:
.. code-block:: sql
:caption: Запрос-мастер:
Select id, sSystemName, sCaption from SomeTable1
.. code-block:: sql
:caption: Запрос-деталь:
Select id, dDate, fSumm from SomeTable2 where id = :id
Наложение условий фильтрации и сортировка в запросах FR.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Для динамической подстановки условий фильтрации и порядка сортировки в
запросы FR (далее просто “запрос”) из внешнего мира, необходимо
использовать макросы (аналогично макросам, используемым в GetSQLText
выборок).
С помощью макроса в запрос можно подставить выражение стандартного или
универсального фильтров, порядок сортировки, или любой другой текст, не
противоречащий правилам SQL.
.. code-block:: sql
:linenos:
:caption: Пример:
Select id, sSystemName, dDate
From SomeTable
Where &DefUniFltMacros AND &DefFltMacros
&AnyMacros
Перед началом построения отчёта значения макросов будут взяты из:
- Выборки, вызвавшей построение отчёта.
- Параметров, переданных в процедуру CreateReportEx().
.. code-block:: pascal
:linenos:
:caption: Например, так:
Selection.CreateReportEx('MacrosTest', null, rvmShow, 1, '', fcfModal, ['Query1.AnyMacros'], [' ORDER BY sSystemName ']);''
В процедуру передаётся имя макроса с указанием имени запроса, в котором
этот макрос использован, в формате [{имя запроса}.{имя макроса}] В
текущий момент зарезервированы следующие имена макросов:
**DefUniFltMacros** – вместо него будет подставлено выражение
универсального фильтра, наложенного на выборку, из которой был вызван
отчёт. Если универсальный фильтр не применён, то макрос будет заменён на
выражение ‘ (3 = 3) ‘.
**SortOrder** – **вместо него будет подставлен текст “ ORDER BY ”+ {имена
полей, по которым выполнена сортировка выборки}. Если выборка не была
отсортирована, макрос будет просто удалён.**
Если через параметр было
передано значение макроса существующего в выборке, то в запросе будет
использовано значение, переданное через параметр.
Если в запросе был использован макрос, значение которого не было
передано через параметр, и макроса с таким именем нет в выборке, макросу
будет присвоено значение ‘ (3 = 3) ‘. Исключением является макрос *SortOrder*
Подстановка условий стандартного фильтра
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Для подстановки условий стандартного фильтра в запрос, необходимо, что
бы в тексте запроса присутствовал макрос, имя которого совпадает с
макросом стандартного фильтра в выборке. Так, для фильтра по умолчанию,
необходимо использовать макрос *DefFltMacros.* Запрос в этом случае
будет иметь следующий вид:
.. code-block:: sql
:linenos:
Select id, sSystemName, dDocDate
From SomeTable
Where &DefFltMacros
После замены макроса условием, запрос примет такой вид:
.. code-block:: sql
:linenos:
Select id, sSystemName, dDocDate
From SomeTable
Where (DDOCDATE = :FLT_DDOCDATE AND SSYSTEMNAME = :FLT_SSYSTEMNAME)
Значения параметров будут подтянуты автоматически
Подстановка условий универсального фильтра
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Для подстановки условий универсального фильтра в запрос, необходимо, что
бы в тексте запроса присутствовал макрос **DefUniFltMacros**.
Запрос в этом случае будет иметь следующий вид:
.. code-block:: sql
:linenos:
Select id, sSystemName, dDocDate
From SomeTable
Where &DefUniFltMacros
После замены макроса условием, запрос примет такой вид:
.. code-block:: sql
:linenos:
Select id, sSystemName, dDocDate
From SomeTable
Where (DDOCDATE = ’12.25.2005’ AND Upper(SSYSTEMNAME) = Upper(‘Example’))
Подстановка текущего порядка сортировки выборки в запрос FR
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Для подстановки текущего порядка сортировки выборки используйте макрос **SortOrder**
.. code-block:: sql
:linenos:
:caption: Например так:
Select id, sSystemName, dDocDate
From SomeTable
Where &DefUniFltMacros
&SortOrder#
Если выборка, из которой было вызвано создание отчёта была отсортирована
пользователем запрос примет следующий вид:
.. code-block:: sql
:linenos:
Select id, sSystemName, dDocDate
From SomeTable
Where (DDOCDATE = ’12.25.2005’ AND Upper(SSYSTEMNAME) = Upper(‘Example’))
ORDER BY sSystemName
Подстановка произвольного SQL кода в запрос
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Имена макросов используемых в запросе могут быть произвольными. Как было
написано ранее, значения макросов возможно передавать в качестве
параметров через CreateReportEx вызов. По-этому написав, например, такой
запрос:
.. code-block:: sql
Select &AnyMacros
From AnyTable
и передав значение макроса:
*Selection.CreateReportEx('MacrosTest', null, rvmShow, 1, '', fcfModal, ['Query1.AnyMacros'], [ 'id', 'sSystemName']);*
в результате получится запрос
.. code-block:: sql
Select id, sSystemName
From AnyTablre
В качестве экстремального решения, возможно просто написать в запросе
имя макроса *&AnyMacros*, а через параметры передать SQL-запрос:
.. code-block:: pascal
:linenos:
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]);
Однако, в этом случае значение макроса, передаваемое через параметр, не
должно содержать вложенных макросов, поскольку их значения не будут
подставлены. Параметры присутствовать в передаваемом значении макроса
могут.
Использование параметров frSelection (или другого источника данных) в хидере и футере FR-отчетов
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Почему-то сложилось мнение, что: "в хидере и футере FR-отчетовможно
использовать только переменные, предварительно добавленные AddVar при
открытии отчета."
Это есть огромное заблуждение!
В мемках расположенных на хидере и футере можно замечательно обращаться
к параметрам, как выборки, так и параметрам "запросов".
**Для frSelection:**
Необходимо использовать метод *GetVar({имя атрибута или параметра}).*
.. code-block:: pascal
:caption: Например:
Memo1.Memo := GetVar('sCaption');
Так же можно обращаться к параметрам frSelection по их полному имени.
Так же как это делается для полей "запроса" FR. [frSelection."{имя параметра}"]
Пример::
[frSelection."sCaption"]
Перед началом построения отчёта, все тэги типа [frSelection."{имя
параметра}"] будут заменены на значения параметров из выборки.
.. attention::
Подстановка значений производится только 1 раз перед началом построения
отчета. По-этому, если вы используете тэг [frSelection."{имя параметра}"] в тексте Memo, находящемся, например, в секции MasterData,
значение параметра не будет запрашиваться для каждой строки.
**Для запросов FR**
Необходимо просто обратиться к филду "запроса"
находящегося на форме отчёта FR, точно так же как это делается в секции
MasterData, только необходимо указать полное имя филда. Это делается с
помощью следующего кода, в тексте Memo, например::
[Form1.Query1."sCaption"]
Код состоит из:: [{имя формы}.{имя запроса}."{имя поля}"]
Особенности вывода текстовой информации с помощью TfmMemoView
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Компонент TfrMemoView (текстовое поле) предназначен для вывода информации на бланк
отчёта. Этот компонент обладает двумя свойствами «Текст» (оно же
“frMemoView.Memo”) и «Скрипт». Эти два свойства редактируются через
диалог, открывающийся по двойному клику на компоненте.
При построении отчёта то, что находится в свойстве «Текст» подвергается
разбору, дабы произвести подстановку значений полей и (или) вызвать
необходимые функции. По этой причине, если свойство «Текст» было
присвоено из скрипта, например так:
.. code-block:: pascal
:linenos:
Begin
Memo1.Memo := GetVar(‘sCaption’);
End;
могут возникать ошибки печати. Причиной этих ошибок может быть наличие в
значении поля «sCaption» спецсимволов или имён функций, воспринимаемых
парсером FR, как выражение.
Например, если атрибут «sCaption» будет иметь значение::
[1/2”] Гайка ГОСТ 5968
после присвоения этого значения в скрипте свойству «Текст», парсер
выдаст ошибку «значение ”2] Гайка ГОСТ 5968” не может быть преобразовано
в число».
Для того, что бы избежать разбора парсером свойства «Текст», а значит и
предотвратить ошибку, у компонента Memo необходимо выставить свойство
**«Только текст»**. Это свойство находится в контекстном меню
компонента (клик правой кнопкой мыши на компоненте).
Будьте осторожнее с использованием символов “[“ и “]” в свойстве
«Текст». Эти символы обозначают начало и конец выражения, которые
обрабатывает парсер FR.
Возможность присоединения "запросов" к выборке frSelection
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Все "Запрос"ы FR, у который не проставлено свойство DataSource считаются
деталями к выборке frSelection и подцепляются к ней. Вследствии этого,
при переходе frSelection с записи на запись, будет происходить перезапрос
детальных "Запрос"'ов (если конечно эти запросы обладают параметрами
смотрящими на мастера).
.. attention::
Для того, что бы из "запрос"а FR обратиться к frSelection необходимо использовать параметры без *super$*
.. code-block:: sql
:linenos:
:caption: Например:
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.
Создание отчётов типа мастер-деталь
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Для создания отчёта мастер-деталь необходимо иметь 2 набора данных,
связанных между собой. Этими наборами могут быть «выборка + запрос FR»
или «Запрос FR + Запрос FR». При этом в первом случае наборы данных
будут связаны автоматически (см. пункт выше), во втором случае наборы
данных необходимо связать, указав у детали в качестве DataSource
- запрос-мастер.
Изменение порядка обхода записей в выборке frSelection
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
При построении отчёта FR по выборке frSelection, возможны 2 варианта
обхода записей. Записи выводятся на печать в порядке:
0. как они были отсортированы пользователем, т.е. в том порядке, как они
отбражаются на экране (по умолчанию)
1. как они были возвращены запросом
Управлять этим можно с помощью параметра **"PassByDataSet"**
Возможные значния:
0. \- обход в порядке пользовательской сортировки
1. \- обход в порядке, возвращённом запросом
.. code-block:: pascal
:linenos:
:caption: Пример:
Selection.CreateReportEx('FR_PassbyDataSet', null, rvmShow, 1, '', fcfModal , ['PassByDataSet'], [1]);
Кросс отчёты
~~~~~~~~~~~~
.. attention::
При построении кросс отчёта используйте короткие имена атрибутов (не более 10 символов).
Если в левую группировку включается более 2-ух атрибутов и хотя бы один
из них имеет имя более 10 символов, возникает ошибка:
*Документ: frReportC*
*Объект: CrossMemo_0Cross1*
*List index out of bounds (17)*
То есть, запрос, возвращающий данные для отчёта, должен выглядеть,
например, так:
.. code-block:: sql
:linenos:
Select
t.FirstLeftGroupAttribute as FstLGAttr,
t.SecondtLeftGroupAttribute as SndLGAttr,
t.ThirdLeftGroupAttribute as TrdLGAttr,
t.RightGroupAttrirute as RGAttr,
t.sValue
From SomeTable t
Изменение порядка вывода страниц отчёта
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Если шаблон отчета имеет несколько страниц, то FastReport печатает
сначала все записи первой страницы, потом все записи второй, и т.д.
Чтобы поменять это, в источнике данных TftSelection должно быть столько
записей, сколько раз надо повторить печать страниц, и передать в
CreateReportEx(..) параметр *Multiple = 1.*
Шаблон FastReport.Mono
______________________
Общие положения
~~~~~~~~~~~~~~~
Сервер отчётов FastReport.Mono является Asp.Net приложением, которое
может выполняться на сервере IIS (Windows) или XPS (Linux).
Шаблоны отчётов
~~~~~~~~~~~~~~~
Шаблонам отчётов FastReport.Mono соответствует тип шаблонов отчётов: frx
- FastReport.Mono (\*.frx). Шаблоны отчётов хранятся в таблицах схемы
BTK, аналогично другим типам отчётов Системы Глобал.
Редактирование шаблонов
~~~~~~~~~~~~~~~~~~~~~~~
Создание и редактирование шаблонов отчётов производится с помощью
десктоп-утилиты FastReportMonoDesigner.exe. Дизайнер доступен для
скачивания с ftp по адресу ftp://ftp.bitec.ru/pub/#Global/Global3/FastReportMonoDesigner/.
После скачивания его необходимо расположить в той же папке что и Global
или зарегистрировать расширение frx и сопоставить ему FastReportMonoDesigner.exe.
.. attention::
Необходимо лицензирование рабочих мест дизайнера
отчётов. При передаче дизайнера отчётов заказчикам необходимо покупать
лицензии для разработчиков заказчика.
Доступные параметры:
~~~~~~~~~~~~~~~~~~~~
+-------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Имя параметра** | **Возможные значения** | **Описание** |
+-------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **FileName** | {имя_файла.расширение}, {\*.расширение}, {.расширение}, {расширение}| При построении отчета с типом действия **rvmSave**, определяет формат файла с результатом построения и пользовательское имя для файла. По умолчанию отчёт экспортируется в Html и отображается в браузере. Поддерживаемые форматы экспорта html, pdf, xls, doc, odf, rtf, xml |
+-------------------+---------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Отчеты по диаграммам
____________________
Для создания отчетов с выводом TbtkCustomAdvDiagram или TbtkGantt
необходимо использовать тип шаблона Diagram Report(\*.dgr). Diagram
Report являются отчетами FastReport4. В редакторе шаблона Diagram Report
доступен новый элемент на панели инструментов TbtkFrxPictureView
Элемент TbtkFrxPictureView, размещенный на отчете, является контейнером
для изображения диаграммы. Источником данных для TbtkFrxPictureView
является frxDiagramVirtSel. frxDiagramVirtSel хранит записи с
изображениями. Записи создаются автоматически при построении отчета. По
умолчанию frxDiagramVirtSel недоступен, потому необходимо открыть в Меню
Отчеты->Данные и отметить галочкой frxDiagramVirtSel. После этого, его
можно будет указать в свойстве TbtkFrxPictureView.DataSet, а в свойстве
TbtkFrxPictureView.DataField выбрать поле "blobDiagram".
При выводе диаграм в отчете важно свойство
TbtkFrxPictureView.CutByPages. Свойство позволяет включить режим, при
котором большое изображение будет разрезано на несколько страниц. При
этом изображение будет выводится в оригинальном масштабе. Такой режим
позволяет распечатать изображения, например, размером A1 на восьми
страницах формата A4.
Объекты классов :class:`InternalLibrary.TbtkAdvDiagram` и :class:`InternalLibrary.TbtkGantt` паскаль скрипта
содержат методы, вызывающие создание отчета FR4 с выводом изображения
диаграм.
Таким образом для печати диаграммы Ганта или AdvDiagram необходимо
создать шаблон отчета Diagram Report(\*.dgr), задейстовать в нем
frxDiagramVirtSel и задать свойство DataField у компонента контейнера
изображений. В операции выборки фрейма диаграммы написать вызов метода
CreateReport (либо CreateReportEX) передав в него имя шаблона и
дополнительные параметры.
.. code-block:: pascal
:linenos:
:caption: Пример операции для ADV диграмм:
Sel := FindSelectionEx('SEL_BTD_DIAGRAM', ['Representation'], ['Diagram']);
Sel.Diagram.CreateReport('FR4_PrintBTDDiagram',nil,rvmShow,0,,fcfMDI);
Обратите внимание, что обратиться к Diagram можно только из выборки
лежащей на фрейме TbtkLookupAdvDiagramFrame.
.. code-block:: pascal
:linenos:
:caption: Пример операции для диграммы Ганта:
Selection.Gantt.CreateReportEx('FR4_PrintBTDDiagram',nil,rvmShow,0,,fcfMDI, ['StartDate','StopDate'],[DateTimeToStr(Selection.Gantt.StartDate), DateTimeToStr(Selection.Gantt.StopDate)] );
Общие положения по разметке шаблонов MS Word (\*.doc), MS Excel(\*.xls, \*.xlsx, \*.xlsm), Rich Text Format (\*.rtf), TXT (\*.txt)
__________________________________________________________________________________________________________________________________
[#sAttributeName#] – таким образом обозначаются места, которые
должны быть заполнены данными из выборки (выборок). Если в выборке не
будет найден параметр или атрибут с именем sAttributeName, текст
будет заменён на пустоту. В именах тегов допускается обращение к
мастер-выборке через super$. В этом случае тег будет выглядеть
следующим образом::
[#super$sAttributeName#]
Для заполнения переменных частей (например: Список позиций в накладной)
допускается использование связки мастер-деталь. Для осуществления такой
связки можно использовать как GetSQLText существующих выборок (при этом
в шаблоне указываются системное имя и отображение выборки), так и
обычный SQL запрос. В обоих случая будет открыта дополнительная выборка,
являющаяся деталью к выборке, из которой было вызвано создание отчёта,
или к выборке переменной части более высокого уровня. Если необходимо,
что бы в переменную часть попали данные выборки, из которой был вызван
Selection.CreateReport, укажите имя и отображение этой выборки.
**Открывающий тэг переменной части будет выглядеть следующиим образом:**
[#&{Системное имя выборки}.{Отображение}#], если вы используете
GetSQLTest выборки или [#&MainSelect= Select 1 as id from dual#], если
вы пишете SQL запрос. В этом случае слово "MainSelect" является
уникальным именем переменной части в текущем шаблоне.
**Закрывающий тэг переменной части**
[#/SelectionName.Representation#] или [#/MainSelect#] – соответственно
.. hint::
Располагайте открывающие и закрывающие тэги на отдельных строчках.
Шаблон MS Word (\*.doc)
_______________________
Доступные параметры:
~~~~~~~~~~~~~~~~~~~~
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Имя параметра | Возможные значения | Описание |
+====================+==============================+======================================================================================================================================================================================================================================================+
| **CurrentSession** | 0,1 | По умолчанию, построение отчёта происходит в новой сессии. Это не всегда удобно для печати каких-то сиюминутных данных. Используйте данный параметр для построения отчёта в текущей сессии (без сохранения данных перед печатью). |
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **FileName** | строка, содержащая имя файла | Указывает имя файла, куда будет сохранён отчет после построения. |
| | | |
| | | *Параметр FileName не указан:* |
| | | Уникальное имя файла будет сформировано автоматически. |
| | | При отображении построенного отчёта, в заголовке приложения будет автосформированное имя файла.Перед сохранением построенного отчёта, имя файла будет запрошено у пользователя. |
| | | |
| | | *Параметр FileName указан:* |
| | | Если на диске уже существует файл, с указанным именем, и он не занят другим приложением, файл будет перезаписан. |
| | | Если на диске уже существует файл, с указанным именем, и он занят другим приложением, к указанному имени файла будет добавляться окончание «_#», где # - целое число, до тех пор, пока не будет получено имя не занятого или не существующего файла. |
| | | При отображении построенного отчёта, в заголовке приложения будет указанное имя файла (если файл был занят, имя файла с окончанием «_#») |
| | | Если указано имя файла в несуществующем каталоге, будет произведена попытка создания каталога с заданным именем. В случае неудачи, будет выдана ошибка. |
| | | Имя файла может быть указано как полностью (с указанием диска и каталога), так и частично (только имя файла), в последнем случае в качестве каталога будет использоваться каталог для временных файлов, указанный в ОС Windows. |
| | | Если имя файла указано с расширением не *.doc, то файл будет сохранён в соответствующем расширению формате. Поддерживаются следующие форматы экспорта: |
| | | |
| | | * Microsoft Windows текст (*.txt) |
| | | * Rich text format (.rtf) |
| | | * Standard HTML (*.htm; *.html) |
| | | * Extensible Markup Language format(*.xml) |
| | | * DOCX (*.docx) |
| | | * PDF (*.pdf) (поддерживается начиная с MS Office 2007) |
| | | * Формат виртуального принтера Windows (*.xps) (поддерживается начиная с MS Office 2007) |
| | | * OpenDocument текст (.odt) |
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Limit** | Целое число | Указывает, какое максимальное кол-во записей может быть выведено в отчёт. Если кол-во суммарное кол-во записей, выведенных в отчёт, превысит заданное значение, пользователю будет задан вопрос о продолжении печати. |
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **ShowProcess** | 0,1 | По умолчанию, построение отчёта скрыто от пользователя (разработчика), но иногда необходимо видеть процесс построения отчёта (например: для отладки). Для визуализации построения отчёта необходимо указать сей параметр. |
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Пример шаблона
~~~~~~~~~~~~~~
.. code-block:: sql
Наименование [#sCaption#] номер: [#nDocNum#] дата [#dDocDate#]
[#&SEL_DemoReportCollection.CLList_IDDemoReport#]
Наименование - [#sName#]
Количество - [#nCount#]
Сумма - [#fSumma#]
[#/SEL_DemoReportCollection.CLList_IDDemoReport#]
[#&MainSelect=select t.ID , t.dDocDate , t.nDocNum , t.sCaption ,
t.idClass from DemoReport t Where id = :super$id #]
Наименование [#sCaption#] номер: [#nDocNum#] дата [#dDocDate#]
[#&ChildSelect= select t.ID , t.IDDemoReport,
DemoReportCollectionAPI.GetIDDemoReport_HL(t.IDDemoReport) as
IDDemoReport_HL , t.sName , t.nCount , t.fSumma , t.idClass from
DemoReportCollection t where t.IDDemoReport = :super$id#]
Наименование - [#sName#]
Количество - [#nCount#]
Сумма - [#fSumma#]
[#/ChildSelect#]
[#/MainSelect#]
Ограничения
~~~~~~~~~~~
Существует ограничение на длину значения строкового параметра,
выводимого в отчёт. Максимальная длина строки может составлять 254
символа.
Шаблоны Excel
_____________
Шаблоном Excel является документ MS Excel, размеченный специальным
образом. В системе Global существуют 2 способа построения отчетов на
основе шаблона Excel:
* Заполнение шаблона с помощью MS Excel через OLE Automation Object (OLE)
* Прямое заполнение шаблона, без использования OLE
Из-за различий в методах заполнения существуют различия в их
возможностях:
+---------------------------------------------------------------+--------------------------+-------------------------------------------------------------------------------------+
| **Характеристика** | **Заполнение через OLE** | **Заполнение без использования OLE** |
+---------------------------------------------------------------+--------------------------+-------------------------------------------------------------------------------------+
| Скорость | Низкая | Высокая (При больших объёмах данных (> 100 записей) на порядок выше, чем через OLE) |
+---------------------------------------------------------------+--------------------------+-------------------------------------------------------------------------------------+
| Использование функций MS Excel | Да | Нет |
+---------------------------------------------------------------+--------------------------+-------------------------------------------------------------------------------------+
| Использование встроенных функций | Нет | Да (Аналогично отчётам TXT и RFT ) |
+---------------------------------------------------------------+--------------------------+-------------------------------------------------------------------------------------+
| Возможность выполнения макроса «FinalMacros» после заполнения | Да | Да |
+---------------------------------------------------------------+--------------------------+-------------------------------------------------------------------------------------+
| Построение диаграмм, сводных таблиц | Да | Да (с ограничениями, читайте в описании шаблона) |
+---------------------------------------------------------------+--------------------------+-------------------------------------------------------------------------------------+
| Ограничение на длину запроса переменной части. | 1024 символа | 65 000* символов |
+---------------------------------------------------------------+--------------------------+-------------------------------------------------------------------------------------+
Шаблон Excel (\*.xls) – Заполнение через OLE
____________________________________________
Для шаблона Excel применяется та же разметка, что и для документа Word,
но с небольшими особенностями:
* Тэг должен полностью находиться в одной ячейке (при этом в одной ячейке может находиться несколько тэгов).
* Открывающий тэг переменой части должен находиться в ячейке над левой верхней ячейкой переменной части, а закрывающий под правой нижней ячейкой.
* Если документ состоит из нескольких страниц, эти страницы должны быль расположены одна под другой или на разных листах, но ни как ни рядом!!!!!
* У MS Excel существует ограничение на длину текста в ячейке = 1024 символа. Поэтому, длинные запросы необходимо помещать в GetSQLText выборки.
Доступные параметры:
~~~~~~~~~~~~~~~~~~~~
+--------------------+------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Имя параметра | Возможные значения | Описание |
+====================+==============================+=====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+
| **CurrentSession** | 0,1 | По умолчанию, построение отчёта происходит в новой сессии. Это не всегда удобно для печати каких-то сиюминутных данных. Используйте данный параметр для построения отчёта в текущей сессии (без сохранения данных перед печатью). |
+--------------------+------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **FileName** | строка, содержащая имя файла |Указывает имя файла, куда будет сохранён отчет после построения. |
| | | |
| | |Параметр FileName не указан: Уникальное имя файла будет сформировано автоматически.При отображении построенного отчёта, в заголовке приложения будет автосформированное имя файла.Перед сохранением построенного отчёта, имя файла будет запрошено у пользователя. |
| | | |
| | |Параметр FileName указан:Если на диске уже существует файл, с указанным именем, и он не занят другим приложением, файл будет перезаписан.Если на диске уже существует файл, с указанным именем, и он занят другим приложением, к указанному имени файла будет добавляться окончание «_#», где # - целое число, до тех пор, пока не будет получено имя не занятого или не существующего файла.При отображении построенного отчёта, в заголовке приложения будет указанное имя файла (если файл был занят, имя файла с окончанием «_#») Если указано имя файла в несуществующем каталоге, будет произведена попытка создания каталога с заданным именем. В случае неудачи, будет выдана ошибка. |
| | | |
| | |Имя файла может быть указано как полностью (с указанием диска и каталога), так и частично (только имя файла), в последнем случае в качестве каталога будет использоваться каталог для временных файлов, указанный в ОС Windows. Если имя файла указано с расширением не \*.xls, то файл будет сохранён в соответствующем расширению формате. Поддерживаются следующие форматы экспорта: |
| | | * Microsoft Windows текст (*.txt) |
| | | * Rich text format (.rtf) |
| | | * Standard HTML (\*.htm; *.html) |
| | | * XML Spreadsheet(*.xml) |
| | | * Open XML Workbook (*.xlsx) |
| | | * Open XML Workbook Macro Enabled(*.xlsm) |
| | | * Portable Document Format file (*.pdf) (поддерживается начиная с MS Office 2007) |
| | | * Формат виртуального принтера Windows (*.xps) (поддерживается начиная с MS Office 2007) |
| | | * OpenDocument Spreadsheet(*.ods) |
| | | * Таблицы SYLK (*.slk) |
| | | * Текстовая таблицы с разделителями (*.csv) |
| | | * DBF4 (*.dbf) |
| | | * Printer Text(*.prn) |
| | | * Web Archive(*.mht) (формат поддерживается IE) |
| | | * (*.dif) |
+--------------------+------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Limit** | Целое число | Указывает, какое максимальное кол-во записей может быть выведено в отчёт. Если кол-во суммарное кол-во записей, выведенных в отчёт, превысит заданное значение, пользователю будет задан вопрос о продолжении печати. |
+--------------------+------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **ShowProcess** | 0,1 | По умолчанию, построение отчёта скрыто от пользователя (разработчика), но иногда необходимо видеть процесс построения отчёта (например: для отладки). Для визуализации построения отчёта необходимо указать сей параметр. |
+--------------------+------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Дополнительные возможности
~~~~~~~~~~~~~~~~~~~~~~~~~~
Иногда возникает необходимость после построения отчёта выполнить
какой-либо VBA макрос шаблона. Для этих целей необходимо создать макрос
с именем *FinalMacros*. Если в шаблоне будет присутствовать макрос с
таким именем, он будет выполнен.
.. attention::
Макрос должен быть оформлен в виде модуля. Если макрос будет принадлежать книге или Листу, он не будет выполнен.
.. image:: reports\FinalMacros.jpg
Построение сводных таблиц (MS Excel 2007 и выше)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Для построения сводных таблиц в MS Excel необходимо:
1. Вывести данные на один из листов в виде таблицы, например, с помощью такого шаблона:
.. image:: reports\template.jpg
2. Поставить активную ячейку в таблицу с исзходными данными и на вкладке **"ВСТАВКА"** нажать кнопку **"Сводная таблица"**.
.. image:: reports\pivotTable1.jpg
3. В диалоге, в качестве диапазона указываем область, куда будут выведены данные.
.. image:: reports\pivotTable2.png
Для приведённого выше шаблона эта область будет следующей::
Лист1!$A$1:$D$4
Обратите внимание, что в область данных попали открывающий и закрывающий
тэги переменной части. Это необходимо, чтобы при заполнении таблицы
данных происходило автоматическое расширение области данных сводной
таблицы.
4. Из списка полей сводной таблицы перетаскиваем поля на сводную таблицу, размещая в необходимых ячейках
.. image:: reports\pivotTable3.jpg
5. В результате получаем следующую картину:
.. image:: reports\pivotTable4.jpg
Как видно, в сводной таблице присутствуют ячейки с содержимым «пусто»
(так же могут быть ячейки с открывающим или закрывающим тэгом), от них
необходимо избавится. Для этого, нажимаем на стрелочку (обведено красным
кругом), и в появившемся диалоге снимаем галочки не нужных нам
элементов.
.. image:: reports\pivotTable5.jpg
6. Наша сводная таблица содержит ячейки, в которых в качестве значения хранятся тэги [#....#], это очень отрицательно сказывается на построении отчёта. При заполнении шаблона будет произведена попытка заполнения этих ячеек, что приведёт к ошибке. Для того, что бы этого избежать, необходимо удалить тэги из ячеек сводной таблицы, после чего сохранить шаблон. Сводная таблица не перестраивается после изменения области данных, поэтому, после заполнения шаблона необходимо перестроить сводную таблицу. Для этого необходимо создать макрос с именем FinalMacros, с, например, следующим текстом:
.. code-block:: pascal
:linenos:
Sub FinalMacros()
ActiveWindow.SelectedSheets.Visible = False
ActiveSheet.PivotTables("СводнаяТаблица2").PivotCache.Refresh
Range("A1").Select
End Sub
или таким:
.. code-block:: pascal
:linenos:
Sub FinalMacros()
Application.Sheets(1).PivotTables("СводнаяТаблица2").PivotCache.Refresh
End Sub
В случае второго макроса, необходимо указать номер листа, на котором
находится сводная таблица. Нумерация листов начинается с 1 (единицы).
В вашем случае имя сводной таблицы может отличаться. Узнать имя таблицы
можно в параметрах таблицы.
Шаблоны Excel (\*.xls, \*.xlsx, \*.xlsm) – Заполнение с помощью прямой записи в файл
____________________________________________________________________________________
Прямое заполнение шаблона Excel намного быстрее, чем заполнение через MS
Excel OLE Automation Object, поэтому такой метод заполнения
предпочтительнее при выводе в отчёт больших объемов данных (более 100
записей).
Виды шаблонов Excel
~~~~~~~~~~~~~~~~~~~
+-------------------------------------------+---------+------------------------+------------------------+
| | xls | xlsx | xlsm |
+===========================================+=========+========================+========================+
| Поддержка макросов | Да | Нет | Да |
+-------------------------------------------+---------+------------------------+------------------------+
| Максимальное количество строк | 65536 | 1048576 | 1048576 |
+-------------------------------------------+---------+------------------------+------------------------+
| Максимальное количество колонок | 256 | 16384 | 16384 |
+-------------------------------------------+---------+------------------------+------------------------+
| Допущение нескольких тегов в одной ячейке | Нет | Да, кроме размножаемых | Да, кроме размножаемых |
+-------------------------------------------+---------+------------------------+------------------------+
| Поддержка всплывающих подсказок к ячейкам | Нет | Да | Да |
+-------------------------------------------+---------+------------------------+------------------------+
Разметка шаблона для прямого заполнения аналогична разметке для
заполнения через OLE с небольшими ограничениями и дополнениями:
**Ограничения**
* Невозможно настроить заранее сводную таблицу или график. (Для построения сводной таблицы или графика на основе выведенных данных необходимо записать макрос «FinalMacros», выполнение которого приведёт к созданию необходимых графиков и таблиц)
**Дополнения**
* Поддержка встроенных функций
* Стили раскарски записей. Для каждого уровня узлов можно задать стиль раскраски. Наименование стиля раскраски для уровней дерева должно соответствовать шаблону ReportTreeLevel_[НомерУровня] , т.е. например, ReportTreeLevel_0, ReportTreeLevel_1.
**Доступные параметры:**
+------------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Имя параметра | Возможные значения | Возможные значения |
+========================+==============================+========================================================================================================================================================================================================================================================================================================================================================================================================================+
| **PassByDataSet** | 0,1 | При построении отчёта по открытой выборке, по умолчанию, обход записей происходит в том порядке, как записи отображаются на экране, с учётом клиентских фильтров и сортировок. Используйте этот параметр, если необходимо обойти записи в том порядке, как они находятся в таблице, без учёта клиентских сортировок и фильтров. Обход записей по таблице быстрее, чем обход с учётом клиентских сортировок и фильтров. |
+------------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **CurrentSession** | 0,1 | По умолчанию, построение отчёта происходит в новой сессии. Это не всегда удобно для печати каких-то сиюминутных данных. Используйте данный параметр для построения отчёта в текущей сессии (без сохранения данных перед печатью). |
+------------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **FileName** | строка, содержащая имя файла | Указывает имя файла, куда будет сохранён отчет после построения. |
| | | |
| | | *Параметр имеет смысл только при построении отчёта с типом действия* **rvmSave**. |
| | | |
| | | По расширению имени файла определяется формат, в который необходимо сохранить отчёт.Например, если будет задано имя файла C:\testsave.txt, отчёт будет сохранён в текстовом формате. C:\testsave.xls – в формате Excel. |
+------------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **VerticalGrouping** | 0,1 | Включает вертикальную группировку строк, по уровням записей. Работает когда PassByDataSet = 0 |
+------------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **HorizontalGrouping** | 0,1 | Включает горизонтальную группировку столбцов, по свойству TbtkScriptFieldPrintInfo. HorizGroup Работает при PassByDataSet = 0 |
+------------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **LevelIndent** | целочисленное значение | Для древовидных списков вывод записей сделан с отступом, для имитации дерева. Каждый потомок узла имеет отступ относительно родительского узла от начала ячейки, и расчитывается по формуле RecordLevel * LevelIntend. Можно регулировать величену отступа с помощью свойства отчета "LevelIndent". По умолчанию значение отступа 3. Максимальный возможный отступ в 15 единиц. |
+------------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Встроенные функции
~~~~~~~~~~~~~~~~~~
Встроенные функции позволяют производить различные действия над
значениями атрибутов перед их выводом в шаблон.
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Метод | Описание |
+=======================================================================================================================+============================================================================================================================================================================================================================================================================================================================================================================================================================================+
| **NVL** (<имя атрибута>,<строка>): string | Возвращает второй аргумент, если значение атрибута = Null |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **FNUM** (<имя атрибута>, <число>): string | Округляет числовое значение атрибута до указанного разряда |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **LPAD** (<имя атрибута>, <число>): string | Добавляет пробелы к значению атрибута слева, для получения в результате строки заданной длинны. |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **RPAD** (<имя атрибута>, <число>): string | Добавляет пробелы к значению атрибута справа, для получения в результате строки заданной длинны. |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **NumberToStrRUS** (<имя атрибута>): string | Возвращает число прописью на русском |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **ParamValueByName** (< имя параметра>): string | Возвращает значение параметра, переданного в метод CreateReportEx(); |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **RowNum()** :string | Возвращает номер текущей записи в выборке переменной части |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **RowCount()** :string | Возвращает количество записей в выборке переменной части |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Date()** :string | Возвращает текущую дату |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Time()** :string | Возвращает текущее время |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **DateTime()** :string | Возвращает текущую дату со временем |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **SUM** (<имя атрибута>, <имя параметра>) | Метод считает сумму значений атрибута выборки переменной части, и полученное значение записывает в параметр. Для хранения значения используются внутренние переменные отчёта, объявлять параметр заранее не нужно, он будет создан автоматически. Обращение к параметру аналогично обращению к атрибуту выборки. Параметры являются глобальными для всего отчёта, поэтому однажды записанное значение будет доступно в любой части отчёта. |
| | |
| .. Attention:: Метод не возвращает результата, и может быть использован только в закрывающем тэге переменной части. | |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Set** (<имя атрибута>, <имя параметра>) | Устанавливает внутреннему параметру отчёта <имя параметра> значение параметра или результат вложенного метода. Данный метод, как и метод SUM можно использовать внутри закрывающего тэга переменной части. |
| | |
| **Set** (<имя метода>(), <имя параметра>) | Пример: [#/ChildSelect Sum(fSumma, ResultSumma);Set(RowCount(),DetRowCount)#] |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Multiply** (<имя атрибута>, <имя атрибута>) | Произведение двух атрибутов |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Divide** (<имя атрибута>, <имя атрибута>) | Деление первого атрибута на второй |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Minus** (<имя атрибута>, <имя атрибута>) | Разность |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Plus** (<имя атрибута>, <имя атрибута>) | Сумма двух атрибутов |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Percent** (<имя атрибута>, <число>) | Процент от значения атрибута |
| | |
| | Пример: [# Percent(Multiply(nPrice, nQuantity), 20)#] |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **GetCaption** (FieldName: string) | Выводит наименование обычной колонки из структуры Selection.PrintInfos |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
При использовании методов, у которых нет входных параметров, круглые
скобки после имени метода писать обязательно! Если круглых скобок не
будет, эта строка будет считаться именем атрибута.
Об использовании встроенных функций читайте в разделе "Шаблон TXT" :ref:`txt-template-inline-func-ref`
Пример шаблона
~~~~~~~~~~~~~~
.. image:: reports/CreateReports_NativeXLS_Example.PNG
Вывод размножаемых атрибутов
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[#GetCaption(Имя колонки)#] - выводит наименование обычной колонки из структуры Selection.PrintInfos
[#GetCaption(БазовоеИмяРазмножаемогоАтрибута[\*]")#] - выводит наименования всех динамических колонок, имена которых подпадают под шаблон "DynColName[\*]" с учётом свойства
TbtkScriptFieldPrintInfo .Order. Размножаемые колонки вставляются в тело
отчета сдвигая все остальные ячейки вправо.
Мета-данные по размножаемым атрибутам можно заполнить до вызова
CreateReport.Для этих целей реализована коллекция объевтов класс
TbtkScriptFieldPrintInfo, объект класса хранит информацию о полях
выборки которую можно использовать при печати отчета.Доступ к объектам
класса можно получить через свойство **Selection.PrintInfos[FieldName:
string]: TbtkScriptFieldPrintInfo**
.. code-block:: pascal
TbtkScriptFieldPrintInfo = class
Caption: String; - Наименование которое можно вывести в отчет используя команду GetCaption (см. ниже).
Order: Integer; - Порядок, учитывается при выводе в отчёт размножаемых атрибутов. Порядок влияет только на вывод в рамках размножаемых атрибутов.
HorizGroup: String; - Горизонтальная группа объединения столбцов.
Style: String; - Системное имя стиля из списка "стилей раскраски", используемого для колонки. Данный стиль перекрывает стиль уровня записи.
end;
Коллекция создается перед вызовом AfterOpen операции выборки. Разработчик должен сам заполнить структуру до вызова CreateReport.
Пример заполнения коллеции:
.. code-block:: pascal
:linenos:
:caption: Пример работы с Printinfos в операции AfterOpen:
Selection.ExecOpScript("#AfterOpen");
Selection.PrintInfos["sCaption"].Caption := "КАПШЕН";
Selection.PrintInfos["nPrice[0]"].Caption := "ПРАЙС 0";
Selection.PrintInfos["nPrice[1]"].Caption := "ПРАЙС 1";
Selection.PrintInfos["nPrice[1]"].Style := "Test_ForReadOnlyFld";
Selection.PrintInfos["nPrice[0]"].HorizGroup := "Group1";
Selection.PrintInfos["nPrice[1]"].HorizGroup := "Group1";
Selection.PrintInfos["nLevel"].HorizGroup := "Group2";
Selection.PrintInfos["nCount"].HorizGroup := "Group2";
Selection.PrintInfos["sCaption"].HorizGroup := "Group2";
Selection.PrintInfos["nPrice[1]"].Order := 0;
Selection.PrintInfos["nPrice"].Order := 2;
Пример шаблона с размножаемыми атрибутами:
.. image:: reports/ExcelReport_DynFieldsExample.PNG
.. image:: reports/PrintInfoReport.png
Ошибки и особенности
~~~~~~~~~~~~~~~~~~~~
+------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| Проблема | Вероятная причина | Решение |
+==============================================================================================================================+=========================================================================================================================================+=====================================================================================================================================+
| Сообщение "система Office обнаружила проблему с этим файлом. Чтобы обеспечить защиту компьютера, этот файл не будет открыт". | В файле XLS-шаблона используются всплывающие подсказки к ячейкам. Данная возможность не реализована в используемом компоненте TXLSFile. | Отказаться от использования всплывающих подсказок, или использовать XLSX и XLSM отчеты, реализованные на основе компонента OExport. |
+------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+
Шаблон TXT (\*.txt) – текстовый файл
____________________________________
Для быстрой печати на матричных принтерах наиболее целесообразно
использовать именно текстовые файлы, поскольку печать текста происходит
на много быстрее, чем печать графики или векторных шрифтов, используемых
в MS Word, MS Excel и FastReport. Так же одним из преимуществ текстового
шаблона – это скорость его заполнения.
Разметка шаблона TXT аналогична шаблону документа Word. С некоторыми
дополнениями:
* Встроенные функции.
* Возможность подсчёта суммы значений атрибута выборки.
Доступные параметры
~~~~~~~~~~~~~~~~~~~
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Имя параметра | Возможные значения | Описание |
+====================+==============================+========================================================================================================================================================================================================================================================================================================================================================================================================================+
| **CurrentSession** | 0,1 | По умолчанию, построение отчёта происходит в новой сессии. Это не всегда удобно для печати каких-то сиюминутных данных. Используйте данный параметр для построения отчёта в текущей сессии (без сохранения данных перед печатью). |
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **PassByDataSet** | 0,1 | При построении отчёта по открытой выборке, по умолчанию, обход записей происходит в том порядке, как записи отображаются на экране, с учётом клиентских фильтров и сортировок. Используйте этот параметр, если необходимо обойти записи в том порядке, как они находятся в таблице, без учёта клиентских сортировок и фильтров. Обход записей по таблице быстрее, чем обход с учётом клиентских сортировок и фильтров. |
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **FileName** | строка, содержащая имя файла | Указывает имя файла, куда будет сохранён отчет после построения. |
| | | *Параметр имеет смысл только при построении отчёта с типом действия* **rvmSave**. |
| | | По расширению имени файла определяется формат, в который необходимо сохранить отчёт.Например, если будет задано имя файла C:\testsave.txt, отчёт будет сохранён в текстовом формате. C:\testsave.xls – в формате Excel. |
+--------------------+------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
.. _txt-template-inline-func-ref:
Встроенные функции
~~~~~~~~~~~~~~~~~~
В отчётах Word и Excel над значениями атрибутов, выводимыми в отчёт,
нельзя совершать никаких манипуляций (в Excel можно задать формат
ячейки). В отчёте TXT для форматирования данных реализованы встроенные
функции. Об использовании функций читайте ниже, в описании шаблона.
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Метод | Описание |
+=======================================================================================================================+============================================================================================================================================================================================================================================================================================================================================================================================================================================+
| **NVL** (<имя атрибута>,<строка>): string | Возвращает второй аргумент, если значение атрибута = Null |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **FNUM** (<имя атрибута>, <число>): string | Округляет числовое значение атрибута до указанного разряда |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **LPAD** (<имя атрибута>, <число>): string | Добавляет пробелы к значению атрибута слева, для получения в результате строки заданной длинны. |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **RPAD** (<имя атрибута>, <число>): string | Добавляет пробелы к значению атрибута справа, для получения в результате строки заданной длинны. |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **NumberToStrRUS** (<имя атрибута>): string | Возвращает число прописью на русском |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **ParamValueByName** (< имя параметра>): string | Возвращает значение параметра, переданного в метод CreateReportEx(); |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **RowNum()** : string | Возвращает номер текущей записи в выборке переменной части |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **RowCount()** : string | Возвращает количество записей в выборке переменной части |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Date()** : string | Возвращает текущую дату |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Time()** : string | Возвращает текущее время |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **DateTime()** : string | Возвращает текущую дату со временем |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **SUM** (<имя атрибута>, <имя параметра>) | Метод считает сумму значений атрибута выборки переменной части, и полученное значение записывает в параметр. Для хранения значения используются внутренние переменные отчёта, объявлять параметр заранее не нужно, он будет создан автоматически. Обращение к параметру аналогично обращению к атрибуту выборки. Параметры являются глобальными для всего отчёта, поэтому однажды записанное значение будет доступно в любой части отчёта. |
| | |
| .. attention:: Метод не возвращает результата, и может быть использован только в закрывающем тэге переменной части. | |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Set** (<имя атрибута>, <имя параметра>) | Устанавливает внутреннему параметру отчёта <имя параметра> значение параметра или результат вложенного метода. Данный метод, как и метод SUM можно использовать внутри закрывающего тэга переменной части. |
| | |
| **Set** (<имя метода>(), <имя параметра>) | Пример: [#/ChildSelect Sum(fSumma, ResultSumma);Set(RowCount(),DetRowCount)#] |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Multiply** (<имя атрибута>, <имя атрибута>) | Произведение двух атрибутов |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Divide** (<имя атрибута>, <имя атрибута>) | Деление первого атрибута на второй |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Minus** (<имя атрибута>, <имя атрибута>) | Разность |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Plus** (<имя атрибута>, <имя атрибута>) | Сумма двух атрибутов |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| **Percent** (<имя атрибута>, <число>) | Процент от значения атрибута |
| | |
| | Пример: [# Percent(Multiply(nPrice, nQuantity), 20)#] |
+-----------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
При использовании методов, у которых нет входных параметров, круглые
скобки после имени метода писать обязательно! Если круглых скобок не
будет, эта строка будет считаться именем атрибута.
Пример шаблона
~~~~~~~~~~~~~~
.. code-block:: sql
[#&MainSelect = select t.ID, t.dDocDate, t.fSumm, t.nDocNum, t.sCaption, t.sContras, t.idClass from DemoReport t#]
[#sCaption#] от [#dDocDate#]
Контрагент: [#sContras#]
Позиции документа:
|Товар | Количество | Сумма |
[#&ChildSelect = 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 = :super$id#]
| [#RPad(sName,25)#] | [#LPad(FNum(nCount,2),14)#] | [#LPad(fSumma,14)#] |
[#/ChildSelect Sum(nCount, ResultCount); Sum(fSumma, ResultSumma)#]
ИТОГО: [#FNum(ResultSumma, 2)#] ([#NumberToStrRUS(ResultSumma)#])
[#/MainSelect#]
Как видно, шаблон имеет стандартный вид, единственное его
отличие заключается в использовании встроенных функций (они отмечены
зелёным цветом). При использовании функций действуют следующие правила:
* Функции могут быть использованы только внутри тэгов *[#RPad(sName,25)#]*, функции вне тэгов будут считаться обычным текстом, и обработаны не будут.
* Функции работают со значениями атрибутов, внутренних параметров или результатом вложенной функции.
* Функции могут быть вложенными ''[#LPad(FNum(nCount,2),14)#]''. Т.е. первая функция работает со значением, вычисленным второй функцией.
* В функцию, кроме имени атрибута или внутреннего параметра, может быть передан только один параметр. Например::
[# RPad(sName,25)#] – *в функцию* RPad *переданы: имя атрибута и числовой параметр*. Внутренние параметры выделены фиолетовым цветом.
В описании функции Sum было сказано, что она может быть использована
только в закрывающем тэге переменной части, поэтому её синтаксис
несколько отличается от остальных функций:
* Имя функции должно следовать за именем закрывающего тэга и отделяться пробелом [#/ChildSelect Sum(nCount, ResultCount)#]
* Возможно использование нескольких функций Sum для вычисления сумм нескольких атрибутов. Функции должны быть написаны друг за другом и разделены точкой с запятой ''[#/ChildSelect Sum(nCount, ResultCount)''';'''Sum(fSumma, ResultSumma)#]'''
* Значение, записанное функцией Sum во внутренний параметр, доступно в любом последующем месте отчёта.
Настройки текстового шаблона
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Для изменения настроек текстового шаблона откройте его на
редактирование. В открывшемся дизайнере нажмите кнопку «Настройки» на
панели управления.
Доступные настройки:
*«Конвертировать отчёт в DOS кодировку»* - по умолчанию построение
отчёта происходит в кодировке Windows, для печати на старых матричных
принтерах необходимо конвертировать отчёт в DOS кодировку.
Шаблон RTF (\*.rtf) – текстовый файл с форматированием
______________________________________________________
По своей идеологии шаблон RTF аналогичен шаблону TXT, поэтому, все
правила описанные для шаблона TXT правомерны для шаблона RTF. Скорость
заполнения шаблона RTF сопоставима со скоростью заполнения шаблона TXT.
Редактирование шаблона RTF производится с помощью приложения, указанного
в Windows, как редактор файлов \*.rtf. Обычно им является MS Word или
WordPad.
Мастер отчётов
______________
Мастер отчётов предназначен для создания многошаговых диалогов между
пользователем и системой (например: при инсталляции программ). Мастером
отчётов является фреймом (класс – **TbtkReportWizardFrame)**
аналогичный фреймам c детальной частью, поэтому работа с ним аналогична
работе со стандартными фреймами.
У каждой из версий отчёта существуют атрибуты «Главная выборка» и
«Отображение гл. выборки». Эти два атрибута указывают на выборку,
которая будет являться главной выборкой мастера, т.е. при вызове метода
Selection.CreateReport, указанная выборка автоматически откроется.
Главная выборка мастера содержит список системных имён и отображений
детальных выборок, указанных при настройке версии шаблона, а так же
заголовки страниц. Так же, «параметры отчёта», которые были указаны при
настройке версии отчёта, будут автоматически созданы в выборке мастере.
Все главные выборки мастера отчётов, должны быть наследниками выборки
**SEL_RPT_MasterSelection**.
.. attention::
Категорически не рекомендуется перекрывать в выборках наследниках GetSQLText.
Детальные выборки рекомендуется располагать под выборкой **SEL_RPT_Selection**.
О сессиях
_________
Как обычно, все отчёты создаются в отдельной ReadOnly сессии,
открываемой при вызове CreateReport. Если вы используете мастер отчётов,
он будет находиться в той же сессии, что и все выборки, которые будут
открыты при заполнении отчёта.
Для построения отчёта в текущей сессии (без сохранения данных перед
печатью) укажите параметр “**CurrentSession**” (возможные значения [0,1]).
.. code-block:: pascal
:linenos:
:caption: Пример использования:
Selection.CreateReportEx('ExcelTest', null, rvmShow, 1, '', fcfModal, ['CurrentSession'], [1]);
FAQ
___
1. Что произойдёт, если атрибут, указанный в тэге не будет найден?
*Тэг будет удалён.*
2. Что происходит со строками, содержащими открывающие и закрывающие тэги?
*После заполнения шаблона, строки, на которых находятся открывающие и закрывающие тэги, удаляются, поэтому не рекомендуется размещать на этих строках информацию.*
3. Обязательно настраивать и использовать мастер отчётов?
*Нет, мастер отчётов использовать не обязательно, Мало того, если для версии отчёта указан мастер, то при вызове метода Selection.CreateReport, можно указать, что бы мастер не показывался.*
4. В шаблоне MS Word при использовании в тексте запроса переменной части строк, обрамлённых кавычками, происходит ошибка ORA
*При использовании кавычек, вводите их не с клавиатуры, а через диалог вставки символа (главное меню вставка символ). Или скопируйте SQL запрос в текстовый редактор NotePad, и вставьте обратно в Word*.
5. Начиная со второй строки переменной части в начале строки появляется лишний пробел?
*Удалите пробел перед закрывающим тэгом переменной части из шаблона.*
Печать на принтере
------------------
Так же имеет возможность непосредственно отправки кодов драйверу
принтера, например отправка кодов на языке `ZPL или ZPL II `__ фирмы `Zebra Technologies `__ .