Организация отчетов в VSQ

Добавление отчета:


В объект WorkPlace (VisTabs) добавляем новую страницу (VisLayoutPage) в нее вкладываем VisReportPage, который и есть сам отчет.
VisReportPage содержит всего один параметр reports. Это текст вида имя отчета знак равно и путь до xml файла. В имени возможно использовать знак / для организации подразделов.

Например: Тесты/Тест1=d:\vsq_report\1\report2.xml

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

Структура файла отчета:


<?xml version="1.0" encoding="UTF-8"?>
<object class="Report" name="MyReport">
    <property propname="maxPageCount">500</property>

    Объекты отчета...
</object>


Имя отчета выбираем любое, главное что бы не повторялось больше нигде, аналогично со всеми другими именами объектов.

maxPageCount – если число страниц превышает это значение, то список страниц обнуляется выдается ошибка (значение по дефолту 100).

Объекты отчета:

Отчет может содержать объекты (потомки ILSFilterClass):
RpPrmDate – форма ввода даты
RpPrmTime – форма ввода времени
RpDataSetSql – SQL запрос
RpPage – сама отображаемая страница отчета

Теперь каждый объект подробнее...

Объект отчета RpPrmDate

    <object class="RpPrmDate" name="DateFrom">
        <property propname="date">08.11.2016</property>
        <property propname="format">yyyyMMdd</property>
    </object>
Отображает форму и с установленной датой свойства date (по дефолту 01.01.2016). В результате в отчете появляется переменная [DateFrom] которая содержит введенное значение в формате указанном в свойства format.

Объект отчета RpPrmTime

    <object class="RpPrmTime" name="TimeFrom">
        <property propname="time">10:00</property>
        <property propname="format">hhmmss</property>
    </object>
Отображает форму и с установленным значением свойства time (по дефолту полность). В результате в отчете появляется переменная [TimeFrom] которая содержит введенное значение в формате указанном в свойства format.

Объект отчета RpDataSetSql - Запрос

    <object class="RpDataSetSql" name="Query1">
        <property propname="hostName">192.168.2.9</property>
        <property propname="databaseName">F:\DataBase\PRWES\PRPR2WES.FDB</property>
        <property propname="userName">SYSDBA</property>
        <property propname="password">masterkey</property>
        <property propname="query">
select
    main.dtbeg,
    main.wes * modules.wmul wes,
    main.wnum,
    main.outwes * modules.wmul outwes,
    main.pertype,
    modules.name mname,
    modules.descr mdescr
from modules
   inner join mgroupmod on (modules.idm = mgroupmod.idm)
   inner join mgroup on (mgroupmod.idgroup = mgroup.idgroup)
   inner join main on (modules.idm = main.idm)
where
   mgroup.code = 4
         </property>
    </object>
Параметры hostName, databaseName, userName и password – понятны и так, это параметры соединения с БД. Дефолтных значений нет, так что эти параметры надо указывать всегда !!!

Свойство query содержит сам запрос. В нем можно указывать переменные [DateFrom] и [TimeFrom], созданные объектами выше.

Объект отчета RpPage - страница отчета:

    <object class="RpPage" name="Page1">
        <property propname="height">1069</property>
        <property propname="width">630</property>

        Объекты страницы...

    </object>


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

Страница может содержать объекты RpPageHeader или RpMainData

Объект страницы RpPageHeader:


RpPageHeader – заголовок страницы. Максимум, один на отчет! В фастрепорте аналогичных элементов два: это и заголовок страницы и заголовок запроса.
        <object class="RpPageHeader" name="PH">
               <property propname="height">203</property>
               Объекты RpMemo…
        </object>


Важное свойство height определяет его высоту заголовка, необходимо, что бы объекты, находящиеся внутри, попали в это окно по высоте, что не попадет, то обрежется (если создали объект, а он не отображается, то может он как раз находится выше этого значения). Данная высота будет заниматься на каждой странице отчета.

Объект страницы RpMainData:


RpMainData – сами данные. Этот элемент копируется столько раз, сколько строк выдал запрос.
       <object class="RpMainData" name="MD">
           <property propname="height">43</property>
           <property propname="dataSetName">Query1</property>

           Объекты RpMemo…
       </object>

Содержит высоту height, определяющую высоту каждой строки и ссылку на датасет (RpDataSetSql). Внимание!!! Важно не перепутать имя dataSetName, в противном случае VSQ может не запускаться и виснуть.

Ну и последний и самый главный объект RpMemo. Содержит сами текстовые блоки, отображаемые в RpPageHeader и RpMainData.

Объекты RpMemo

            <object class="RpMemo" name="Memo7">
                <property propname="data">  [Query1.MDESCR]  </property>
                <property propname="pos">
                    <x>10</x>
                    <y>0</y>
                </property>
                <property propname="size">
                    <width>212</width>
                    <height>44</height>
                </property>
                <property propname="option">[Left, Right, Top, Bottom]</property>
                <property propname="font">
                    <family>Arial</family>
                    <size>10</size>
                    <bold/>
                </property>
                <property propname="alignment">[AlignLeft, AlignVCenter]</property>
            </object>


Свойство data - это данные внутри блока. Может быть как текст, так и переменная. Переменные находятся внутри квадратных скобок. Помимо созданных выше переменных [DateFrom] и [TimeFrom], доступны переменные [data] и [time] возвращающие время формирования отчета.
Результаты запросов передаются через переменные, состоящие из имени датасета и поля в запросе, например: [Query1.MDESCR].

Возможно использование настройки отображения, например:
[Query1.DTBEG #d%dd.MM.yyyy hh:mm:ss] - вывод даты в указанном формате
[Query1.OUTWES #f%3] – вещественное число, три знака после запятой

Допускаются арифметические операции, в том числе со скобками и отрицательные значения:
[Query1.PERTYPE - 10]
[Query1.OUTWES / 1000]
[TestDS.T3 / (TestDS.T3 + TestDS.T4 + TestDS.T5) * 100]

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

Параметры pos и size определяют позицию RpMemo, ничего особенного, главное не выйти за границы т.е. что бы pos.y + size.height было меньше чем height RpPageHeader или RpMainData в котором они содержатся.

Параметр option определяет какие линии границ отображать. Например: Left – левая вертикальная граница отображается и так далее. Если границы не надо отображать, тогда ставим просто
<property propname="option">[]</property>

Параметры шрифта свойство font содержит название, размер, жирность.

Свойство alignment определяет выравнивание текста внутри RpMemo. Первое значение это выравнивание по горизонтали, второе по вертикали. Доступны следующие значения:

Для горизонтального
AlignRight
AlignHCenter
AlignLeft

Для вертикального
AlignVCenter
AlignBottom
AlignTop