# Организация отчетов в 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