1. Создание отчёта для FastReport

Создание любого отчёта состоит из двух частей: формирование набора данных и представление оных в удобном виде для пользователя.

Создание ИА отчета возможно только в том случае, если при установке инсталлятором сервера функции отчетов была включена настройка "Разрешить редактирование словарей". В противном случае, в файле "IRReportsFSP.ini" указать "MasterServer=1".

Итак, начнём с формирования набора данных. Заходим в менеджерской программе в «Настройки --- Интерактивные отчёты --- ИА наборы данных» (см. рис. 1).

Рис. 1 - ИА Наборы данных

В открывшемся окне создадим новый датасет («New IR Data Set») в группе «Прочие наборы для отчётов» (см. рис. 2).


Рис. 2 - Создание нового датасета

Задаём «Название» и «Сист. имя» созданному набору данных (см. рис.3).


Рис. 3 - Задание названия и системного имени

Содержимое свойства «SQL запрос» (рис.4):

Рис. 4 - Содержимое свойства  «SQL запрос»

SELECT

      r.NAME AS "NAME" 

       ,ol.DATETIME AS "DATETIME"

      ,ol.PARAMETER AS "PARAMETER"

      ,e.NAME AS "OPERATOR"

      ,e2.NAME AS "MANAGER"

      ,COUNT(ORDERS00.ORDERNAME) as "CNTORDERS"

      ,r.SIFR AS "SIFR"                             

      ,r.GUIDSTRING AS "GUIDSTRING" 

  FROM OPERATIONLOG ol                 

left join VISITS v on v.SIFR=ol.VISIT and v.MIDSERVER=ol.MIDSERVER and v.ISTARTCOMMONSHIFT=ol.ICOMMONSHIFT

left join EMPLOYEES e on e.SIFR = ol.OPERATOR

left join EMPLOYEES e2 on e2.SIFR = ol.MANAGER

left join CASHES c on c.SIFR = ol.STATION

left join CASHGROUPS cg on cg.SIFR = c.CASHGROUP

left join RESTAURANTS r on r.SIFR = cg.RESTAURANT

left join ORDERS ORDERS00

  ON ORDERS00.VISIT=ol.VISIT AND ORDERS00.MIDSERVER=ol.MIDSERVER AND ORDERS00.ICOMMONSHIFT=ol.ICOMMONSHIFT AND ORDERS00.STARTSERVICE<=ol.DATETIME and ORDERS00.ENDSERVICE>=ol.DATETIME

WHERE (r.GUIDSTRING IN (:RESTAURANT2)) AND (ol.DATETIME >= :date1) AND (ol.DATETIME <= :date2) and

 OPERATION=833

group by

       ol.DATETIME

      ,ol.PARAMETER

      ,e.NAME

      ,e2.NAME

      ,r.NAME

      ,r.SIFR

      ,r.GUIDSTRING

order by ol.DATETIME

Параметры в запросе помечаются двоеточием и последующим слитным написанием имени параметра на латинице. Например:     :RESTAURANT2

Стоит учесть, что порядок полей  в SQL-выборке определит и порядок полей в экранном отчёте. Если потребуется поменять порядок полей, то, на сегодняшний день, придётся создать новый набор данных с требуемым порядком полей.

После корректного указания SQL-запроса в наборе датасета создадутся соответствующие поля. В свойствах полей можно поменять отображаемое название, включить/отключить сортировку и группировку данных (см. рис. 5).

Рис. 5 - Поля ИА набора данных

Свойства созданных параметров доступны на вкладке «Параметры ИА Набора данных». Во вкладке "Параметры ИА набора данных" с версии плагина 1.17.1 можно вносить подсказки для параметров, отображаемых в фильтре отчета. Для этого в поле "Описание" необходимо внести описание параметра (см. рис. 6).

Рис. 6 - Внесение описания параметров ИА набора данных

Начиная с версии плагина 1.23.1, для параметров: дата, дата и время, строка-  используется свойство Обязательный параметр (см. рис.6а).

Рис.6а - Свойство Обязательный параметр

Если свойство Обязательный параметр не заполнено, то при выполнении отчета появляется предупреждение (см. Рис. 6б).

Рис.6б - Предупреждение

Далее описание будет отображаться в фильтре отчета при выборе параметра (см. рис.7).

Рис. 7 - Отображение описания параметров в фильтре отчета

 

В примере для параметра RESTAURANT2 включено свойство TypeListFromSql , что означает выбор значений из набора данных полученного с помощью SQL-запроса указанного в свойстве «SQL запрос» (см. рис. 8).

 

Рис. 8 - Параметры ИА набора данных

 

Сам SQL-запрос для параметра RESTAURANT2 (см. рис. 9)

Рис. 9 - SQL-запрос для параметра RESTAURANT2


2. Создание макета печатной формы отчёта

Для создания макета печатной формы отчета необходимо выбрать меню "Расширения"-"ИА отчеты" (см. рис. 10)

Рис. 10 - "Расширения"-"ИА отчеты"

 

Для созданного отчёта необходимо указать тип вывода. Для печатной формы свойству RepType указать значение Fast Report (см. рис. 11)

Рис. 11 - Указание свойства печатной формы

После перехода в свойство "Макет", откроется окно с запросом значений параметров  имеющихся в отчёте (см. рис. 12):

Рис. 12 - Параметры, имеющиеся в отчете

После ввода параметров откроется окно редактирования печатной формы отчёта (см. рис. 13). Если не понятно как работать в этом окне, то следует обратиться к инструкции по дизайнеру отчётов FastReport 4.

Рис. 13 - Окно редактирования печатной формы отчёта

После завершения редактирования макета, можно открыть отчёт уже через пользовательский интерфейс (см. рис. 14).

Рис. 14 - Просмотр отчета через пользовательский интерфейс

 

Рис. 15 - Печатная форма отчета


3. Создание интерактивного отчёта для экранной формы

3.0. Описание действий

3.0.1. Воспользуемся ранее созданным датасетом. Т.к. датасет есть, то остаётся красиво вывести подготовленные данные на экран. Создаём новый отчёт и, дав ему название, указываем в свойстве «RepType» значение DesktopGrids (см. рис.16).

Рис. 16 - Выбор свойства отчета

3.0.2. Далее, открываем макет этого отчёта и видим абсолютно пустое текстовое поле, которое предстоит заполнить.

3.0.2.1. Описание макета придётся писать в ручную. Но для облегчения задачи можно взять за основу любой из доступных макетов экранного отчёта (см. рис. 17).

рис. 17 - Пример описания макета

3.0.2.2. Вот, что примерно должно получиться в макете:

<IR_FORM borderwidth="10"> <OBJECT type="IR_SQL" guid="{CFEACC30-A18E-4071-A0AA-69290DD6789F}" order="0"> </OBJECT>
<OBJECT type="IR_PANEL" borderwidth="10" order="0">
                <OBJECT type="IR_PANEL" order="0">                           
                               <OBJECT type="IR_BUTTON" guid="{BEE1200A-A95D-4DDB-BD28-003A1D96A286}" order="0">
                                               <TEXT>Остановка ресторана</TEXT>
                                               <ANCHORS>akLeft, akTop</ANCHORS>
                                               <IHEIGHT>35</IHEIGHT>
                                               <IHEIGHT>195</IHEIGHT>
                                               <ALIGNMENT>alRight</ALIGNMENT>
                               </OBJECT>                              
                               <ANCHORS>akLeft, akTop</ANCHORS>
                               <ALIGNMENT>alTop</ALIGNMENT>
                               <IHEIGHT>35</IHEIGHT>
                </OBJECT>               
                <OBJECT type="IR_REPORTTITLE"  order="1">
                               <TEXT>%REP_NAME%</TEXT>
                               <ANCHORS>akLeft, akTop</ANCHORS>
                               <ALIGNMENT>alTop</ALIGNMENT>
                               <IHEIGHT>30</IHEIGHT>
                               <IWIDTH>100</IWIDTH>
                </OBJECT>                
                <OBJECT type="IR_REPORTFILTER"  order="2">
                               <TEXT>Ресторан: %RESTAURANT2%
Дата: %date1% - %date2%</TEXT>
                               <ANCHORS>akLeft, akTop</ANCHORS>
                               <ALIGNMENT>alTop</ALIGNMENT>
                               <IHEIGHT>60</IHEIGHT>
                               <IWIDTH>100</IWIDTH>
                </OBJECT>          
                <ANCHORS>akRight, akTop</ANCHORS>
                <ALIGNMENT>alTop</ALIGNMENT>
                <IHEIGHT>130</IHEIGHT>
                <IWIDTH>1000</IWIDTH>
</OBJECT>
<OBJECT type="IR_PANEL" autosize="1" order="1">
  <OBJECT type="IR_DS" guid="{48B8FE07-3EAE-4D48-B8A5-6D05623F6307}" order="5">
    <ANCHORS>akLeft, akTop</ANCHORS>
    <ALIGNMENT>alTop</ALIGNMENT>
    <IHEIGHT>100</IHEIGHT>
    <IWIDTH>1000</IWIDTH>
    <COLMOVING>0</COLMOVING>
    <AUTOSIZE>1</AUTOSIZE>
    <EXPANDLEVEL>-1</EXPANDLEVEL>
                <FIELDS>
                               <FIELD sysname="NAME" alignment="taLeftJustify">
          <IMINWIDTH>150</IMINWIDTH>
                      </FIELD>
                    <FIELD sysname="DATETIME" alignment="taCenter">
          <IMINWIDTH>80</IMINWIDTH>
        </FIELD>
                    <FIELD sysname="PARAMETER" alignment="taRightJustify" allagregate="sum" format="%INTEGER%">
          <IMINWIDTH>100</IMINWIDTH>
        </FIELD>
                    <FIELD sysname="OPERATOR" alignment="taLeftJustify">
          <IMINWIDTH>150</IMINWIDTH>
        </FIELD>
                    <FIELD sysname="MANAGER" alignment="taLeftJustify">
          <IMINWIDTH>150</IMINWIDTH>
        </FIELD>
        <FIELD sysname="CNTORDERS" alignment="taRightJustify" allagregate="sum" format="%INTEGER%">
          <IMINWIDTH>100</IMINWIDTH>
        </FIELD>
                               <FIELD sysname="SIFR" colvisible="0">
          <IMINWIDTH>150</IMINWIDTH>
        </FIELD>
                               <FIELD sysname="GUIDSTRING" colvisible="0">
          <IMINWIDTH>150</IMINWIDTH>
        </FIELD>
     </FIELDS>
    <FOOTER>1</FOOTER>
  </OBJECT>
<ANCHORS>akRight, akTop</ANCHORS>
<ALIGNMENT>alTop</ALIGNMENT>
<IHEIGHT>130</IHEIGHT>
<IWIDTH>1000</IWIDTH>
<AUTOSIZE>1</AUTOSIZE>
</OBJECT>
</IR_FORM>

3.0.2.3. А теперь важное пояснение к содержанию описания макета.

В строке

<IR_FORM borderwidth="10"> <OBJECT type="IR_SQL" guid="{CFEACC30-A18E-4071-A0AA-69290DD6789F}" order="0"> </OBJECT>

оставляем всё как есть, т.к. здесь происходит технический вызов пересчёта агрегатов для отчёта.

Строка ниже описывает кнопку, при нажатии которой откроется печатная форма отчёта.

<OBJECT type="IR_BUTTON" guid="{BEE1200A-A95D-4DDB-BD28-003A1D96A286}" order="0">

значение свойства guid берём из SQL-таблицы [IR_REPORTS] для нашего отчёта «Отчёт по приостановке работы ресторана»

Далее, в строке

  <OBJECT type="IR_DS" guid="{48B8FE07-3EAE-4D48-B8A5-6D05623F6307}" order="5">

значение свойства guid берём из SQL-таблицы [IR_DATASETS] для нашего отчёта «Приостановка работы ресторана 2»

3.1. Пример создания экранной формы

Допустим необходимо сделать копию отчета "Продажи официантов" и удалить в макете поле "НСП".

Порядок действий будет следующий:

  1. В справочнике "Расширения - ИА Наборы данных" создаем новый датасет как копию предустановленного (см. рис. 18).

Рис. 18 - Копирование Датасета

  1. В свойстве "SQL запрос" меняем запрос, в результате чего будут пересозданы все поля и параметры.
SELECT
(case :USE_ALT_LANG when 0 then RESTAURANTS00.NAME else 
(case RESTAURANTS00.ALTNAME when '' then RESTAURANTS00.NAME 
else isnull(RESTAURANTS00.ALTNAME,RESTAURANTS00.NAME) 
end) 
end) AS "RESTAURANT",
(case :USE_ALT_LANG when 0 then EMPLOYEES00.NAME else 
(case EMPLOYEES00.ALTNAME when '' then EMPLOYEES00.NAME 
else isnull(EMPLOYEES00.ALTNAME,EMPLOYEES00.NAME) 
end) 
end) AS "WAITER",
CASE WHEN MENUITEMS00.CODE IS NULL THEN DISCOUNTS00.CODE ELSE MENUITEMS00.CODE END AS "CODE",
(case :USE_ALT_LANG when 0 then MENUITEMS00.NAME else 
(case MENUITEMS00.ALTNAME when '' then MENUITEMS00.NAME 
else isnull(MENUITEMS00.ALTNAME,MENUITEMS00.NAME) 
end) 
end) AS "DISH",
SUM(STAT_RK7_SHIFTS_COMPARISON.QUANTITY) AS "QUANTITY",
SUM(STAT_RK7_SHIFTS_COMPARISON.PAIDSUM) AS "PAIDSUM",
SUM(STAT_RK7_SHIFTS_COMPARISON.TAXSUM-STAT_RK7_SHIFTS_COMPARISON.TAXESADDED) AS "TAXSUM"
,SUM(STAT_RK7_SHIFTS_COMPARISON.TAXESADDED) AS "nsp"
FROM STAT_RK7_SHIFTS_COMPARISON
LEFT JOIN RESTAURANTS RESTAURANTS00
  ON (RESTAURANTS00.GUIDSTRING = STAT_RK7_SHIFTS_COMPARISON.RESTAURANTGUID)
LEFT JOIN MENUITEMS MENUITEMS00 ON MENUITEMS00.GUIDSTRING=STAT_RK7_SHIFTS_COMPARISON.DISHGUID
LEFT JOIN DISCOUNTS DISCOUNTS00 ON STAT_RK7_SHIFTS_COMPARISON.DISHGUID=DISCOUNTS00.GUIDSTRING
LEFT JOIN EMPLOYEES EMPLOYEES00 ON EMPLOYEES00.GUIDSTRING=STAT_RK7_SHIFTS_COMPARISON.WAITERGUID
WHERE (STAT_RK7_SHIFTS_COMPARISON.VOID IS NULL) AND (STAT_RK7_SHIFTS_COMPARISON.RESTAURANTGUID IN (:RESTAURANT)) AND (STAT_RK7_SHIFTS_COMPARISON.SHIFTDATE >= :date1) AND (STAT_RK7_SHIFTS_COMPARISON.SHIFTDATE <= :date2)
... и так далее

Появится окно с подтверждением. Соглашаемся ( см. рис. 19) и сохраняем изменения. В результате поле "НСП" исчезнет из структуры Датасета.

Рис. 19 -  Сохранение изменений

  1. Создаем копию ИА отчета, переименовываем его и добавляем датасет, созданный в п.1. Старый датасет удаляем.

Рис.  20 - Привязка Датасета к отчету

  1. Создаем копию Печатной формы, переименовываем её и добавляем датасет, созданный в п.1(см.рис.выше). Старый датасет удаляем. Редактируем макет - удаляем мемо-поля с сылкой на несуществующий параметр, иначе в предварительном просмотре увидим предупреждение (см. рис. 21).

Рис. 21 - Предупреждение

Рис. 22 - Редактирование макета

  1. В свойсвах печатной формы копируем гуид (guid)

Рис. 23 - Свойства печатной формы

  1. В свойстве "Макет" отчета прописываем для тега <OBJECT type="IR_BUTTON" guid="{289E795E-05B4-49A8-93F3-BB8C123BA47C}" order="0"> гуид печатной формы:

Рис.  24 - Вызов контекстного меню интерактивного отчета

Рис. 25 - Свойство Макет отчета

7. В свойстве "Макет" отчета прописываем также аналогично для тега <OBJECT type="IR_DS" guid="{48B8FE07-3EAE-4D48-B8A5-6D05623F6307}" order="5"> значение свойства guid

которое берём (копируем) из свойств ИА набора данных для этого отчёта.

3.2. Механизм ссылок в ИА отчетах

Существует возможность вызывать экранную форму связанного отчета из уже открытого ИА отчета, с автозаполнением параметров (см. рис. 26).

 

Рис. 26 – Вызов экранной формы связанного ИА отчета

Для создания экранной формы необходимо:

1. В датасете исходного отчета выбрать поле, из которого необходимо получить связанный отчет. По нажатию правой кнопки мыши вызвать выпадающее меню. Выбрать пункт «Создать новую ИА связь» (см. рис. 27).

 

Рис. 27 - Создание новой ИА связи

2. В свойстве созданной ИА связи «ИА отчет» выбрать отчет, который необходимо вызывать (см. рис. 28).

 

Рис. 28 – Выбор связанного ИА отчета

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

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

В настройках детализации ИА связи необходимо заполнить следующие свойства: «Параметр грида», «Поле источник», «Параметр источник».

«Параметр грида» - системное имя параметра фильтра, в который нужно передать значение из поля исходного отчета (см. рис. 29);

 

Рис. 29 – Системное имя параметра фильтра

«Поле источник» - это GUID поля в исходном отчете, значение из которого (поля) нужно передать в фильтр вызываемого отчета (см. рис. 30);

 

Рис. 30 - GUID поля в исходном отчете

«Параметр источник» - это системное имя параметра в исходном отчете, по аналогии с «Параметром грида» (поле, не обязательное к заполнению). Это поле, позволяющее передать значение какого-либо параметра из фильтра исходного отчета в фильтр вызываемого отчета.


4. Использование скриптов для изменения внешнего вида интерактивных отчетов (Desktop/FastCube)

Скрипт позволяет управлять форматированием как отдельной ячейки, так и всей строки. Для форматирования отдельной ячейки скрипт задается у ячейки. Для форматирования строки, скрипт задается у датасета. Список переменных, которые используются для форматирования:
 
Для обычной ячейки:
 
FONT_COLOR - цвет текста;
FONT_NAME - шрифт;
FONT_SIZE - размер шрифта;
FONT_STYLE - стиль текста;
FIELD_COLOR - цвет ячейки.
 
Для промежуточного итога:
 
FONT_COLOR_GR_SUM - цвет текста;
FONT_NAME_GR_SUM - шрифт;
FONT_SIZE_GR_SUM - размер шрифта;
FONT_STYLE_GR_SUM - стиль текста;
FIELD_COLOR_GR_SUM - цвет ячейки.
 
Для итога:
 
FONT_COLOR_SUM - цвет текста;
FONT_NAME_SUM - шрифт;
FONT_SIZE_SUM - размер шрифта;
FONT_STYLE_SUM - стиль текста;
FIELD_COLOR_SUM - цвет ячейки.
 
Для получения значения ячейки в скрипте необходимо использовать:
 
FIELD_VALUE - обычная чейка;
FIELD_VALUE_GR_SUM - промежуточный итог;
FIELD_VALUE_SUM - итог.
 
Пример простого скрипта для ячейки (см. рис. 31):
Рис. 31 - Пример скрипта для изменения параметров ячейки
 
BEGIN
  FONT_COLOR:=0;
  FONT_NAME:='Verdana';
  FONT_SIZE:=8;
  IF (FIELD_VALUE > 20) THEN BEGIN
    FONT_SIZE:=18;
    FONT_COLOR:=10485760;
    FONT_NAME:='Vijaya';
  END;
END.
где
 
FONT_COLOR - цвет шрифта;
FONT_SIZE - размер шрифта;
FONT_NAME - шрифт;
FIELD_VALUE - значние ячейки.
 
Так же в скрипте (только для простой ячейки) можно использовать значения всех полей отчета. Для этого к системному имени поля необходимо дописать "FIELD_". Аналогичным образом можно создавать скрипты для форматирования строки (обычной строки отчета).
 
Важно: в скрипте для строки нельзя использовать "FIELD_VALUE" (значение текущей ячейки), только обращение к полям отчета (см. рис. 32).
 
Рис. 32 - Использование значений другого поля отчета.
 
Так же есть возможность задавать форматирование в FastCube, используя внешние параметры. Для этого скрипт задается у датасета, но в скрипте указывается, какое поле необходимо форматировать.
 
Пример скрипта:
 
BEGIN
  IF (FIELD_NAME = 'IBASICCURRENCY') THEN BEGIN
    IF (FIELD_VALUE > FIELD_SCRPARAM) THEN BEGIN
      FIELD_COLOR := 64000;
    END;
  END;
END.
Где SCRPARAM - имя поля, которое выступает в качестве параметра скрипта,
FIELD_NAME - имя поля на котором необходимо выполнить скрипт
 
Список полей, которые передаются в виде параметров в скрипт, задаются в макете отчета. Пример макета:
 
<IR_FORM borderwidth="5">
    <OBJECT type="IR_FASTCUBE" name="IR_FASTCUBE2" guid="{642EC34D-D8E0-428D-92E2-FBBD333D280E}" order="0">
        <ANCHORS>akLeft, akTop</ANCHORS>
        <ALIGNMENT>alClient</ALIGNMENT>
        <AUTOSIZE>0</AUTOSIZE>
          <SCRIPTPARAMS>
            <PARAM name = "SCRPARAM"/>
          </SCRIPTPARAMS>
    </OBJECT>
</IR_FORM>

5. Использование скриптов для функционального изменения фильтров отчета

Изменения доступны с версии плагина 1.22.3.

Изменения не доступны для отчетов для рассылки.

Для более удобной работы с фильтрами отчета возможны следующие изменения в зависимости от выбора параметров:

 - изменение видимости параметра фильтра;

- включение свойства парметра "только для чтения";

- изменение цвета текста параметра.

Для вышеуказанных изменений необходимо в свойствах отчета в зоне "Основное" - "Скрипт фильтра" в стандартном редакторе Fast script ввести соответствующую информацию (см. рис. 33).

Рис. 33 - Свойство "Скрипт фильтра"

 В скрипте доступны переменные:

[ИМЯ_ПАРАМЕТРА]_VALUE - значение параметров из фильтра:

- значения для списков представлены в виде значений выбранных пунктов, записанных через запятую;
- значения логических параметров представлены в виде значений 0 и 1, где 0 - это false, 1 - true;
- значение параметров формата дата/время представлены в виде "yyyy-mm-ddThh:nn:ss".

[ИМЯ_ПАРАМЕТРА]_VISIBLE - видимость параметра в фильтре.

[ИМЯ_ПАРАМЕТРА]_READ_ONLY - свойство параметра "только для чтения".

[ИМЯ_ПАРАМЕТРА]_FONT_COLOR - цвет текста, задается в виде числа.

[ИМЯ_ПАРАМЕТРА] - системное имя параметра в фильтре.

Пример скрипта представлен на рис. 34.

Рис. 34 - Пример скрипта для изменения фильтра отчета

BEGIN
  if((Pos('{FB5F2F0F-C65C-45EB-8858-22037ABC2B85}',RESTAURANT_VALUE))>0) then
    DATE1_VISIBLE := true
  else DATE1_VISIBLE := false;

  if not(DATE1_VISIBLE) then
    DATE2_FONT_COLOR := 700
  else  DATE2_FONT_COLOR := 0;

  if(DATE2_FONT_COLOR = 700) then
    STATION_READ_ONLY := false
  else STATION_READ_ONLY := true;
END.