Пожалуйста, включите JavaScript для просмотра этого сайта.

Отчеты Simple-Scada

История: Примеры отчетов

Отчет из своего источника данных

Пред. Вверх След. Еще

В одном из предыдущих примеров мы рассмотрели создание простого периодического отчета. Мы создали источник данных, который берет архивные данные переменных из БД и вывели его в отчет. Но как быть, если нужно вывести в отчет не значения переменных, а какие-то другие данные? Например, данные из пользовательских таблиц БД. Также, может понадобиться вывести в отчет данные из нескольких разных СУБД. Для решения этих задач можно создать свой источник данных, который будет работать напрямую с базой данных (или другим хранилищем), независимо от Simple-Scada. 

Для примера создадим в базе данных MySQL c именем "reports_database" свою таблицу c именем "my_table" и заполним ее данными. Как и в предыдущих примерах проделаем эти действия с помощью MySQL Workbench. Таблица состоит из следующих колонок:

Колонка

Описание

id

Уникальный номер строки

employee

Имя работника

action

Действие, выполненное работником

action_id

Идентификатор действия

timestamp

Дата и время, когда было выполнено действие

Создадим таблицу:

 

Заполним ее данными:

 

Как видно на скриншоте, действия работников делятся на два типа: замена и ремонт (см. колонку "action_id"). Для примера, поставим перед собой задачу вывести в отчет все строки связанные с ремонтом за определенный пользователем интервал времени. На основе этого примера станет понятно, как можно вывести в отчет любые данные из пользовательских таблиц (из различных БД).

Интерфейс в проекте Simple-Scada будет похож на тот, который мы использовали в предыдущих примерах. Мы добавили в проект две переменные, которые определяют интервал времени для отчета. Это переменные "vrTimeBegin" и "vrTimeEnd" с типом данных "DateTime". На странице разместили два Календаря: первый связан с переменной "vrTimeBegin", второй с переменной "vrTimeEnd". Также имеется кнопка "Сформировать", по нажатию на которую отчет будет создан и передан на тот клиентский компьютер, который его запросил:

 

Перейдем к созданию шаблона отчета. Запустим редактор отчетов (Reports.exe), выберем наш проект и создадим новый отчет. Назовем его: "Пользовательский". Теперь нужно добавить новый источник данных в отчет. В предыдущих примерах мы делали это через меню "Действия" -> "Новый источник данных". Но источник созданный таким образом работает с архивными данными переменных (из таблицы "trends"). Такой вариант нам не подойдет, так как мы хотим брать данные из собственной таблицы "my_table". Переходим на вкладку "Словарь" и создаем новый источник данных.

 

Откроется окно выбора типа источника данных. Как видно на скриншоте ниже, система отчетов позволяет работать с любыми современными БД и файлами:

 

Наша таблица находится в БД MySQL, поэтому выбираем MySQL и вводим строку для подключения к БД. Чтобы не ошибиться с форматом строки, можно нажать кнопку с символом "i" (1) , тогда шаблон строки будет создан автоматически и останется только заполнить его (2). Для проверки соединения нажмите кнопку с галочкой (3):

Важно! Если для MySQL используется не порт по-умолчанию(3306), то нужный порт необходимо указать добавив в параметры подключения строку: Port=Номер_порта;

Важно! Если при построении отчета в журнале сервера появляется ошибка "Authentication to host 'localhost' for user 'root' using method 'caching_sha2_password' failed", то в параметры подключения необходимо добавить строку: SslMode=None;

 

В следующем окне выбираем данные, с которыми нужно работать в отчете. В нашем случае это таблица "my_table" и все ее колонки:

 

Теперь источник создан и соединение с БД установлено. По-умолчанию, для созданных таким образом источников данных система отчетов выбирает все данные, без каких-либо ограничений. То есть, если перетянуть наш источник в рабочую зону отчета, то будет создан бэнд данных, в котором мы увидим все строки из таблицы "my_table":

 

 

Но для нашей задачи требуется вывести в отчет только строки связанные с ремонтом ("action_id = 2") за указанный пользователем интервал времени. Для решения этой задачи необходимо ограничить выборку. Для этого добавим в отчет переменные проекта "vrTimeBegin" и "vrTimeEnd", они будут определять интервал выборки. Кликаем правой кнопкой мыши по переменной и выбираем пункт "Добавить переменную". Имя менять не будем, пусть в отчете они называются также "vrTimeBegin" и "vrTimeEnd":

 

Переменные добавлены, теперь переходим на вкладку "Словарь", делаем клик правой кнопкой мыши на нашем источнике и выбираем пункт "Изменить":

 

В окне изменения источника мы видим текст запроса: "select * from my_table". То есть, выборка всех данных из таблицы "my_table".

 

Нам нужно изменить sql-запрос так, чтобы выборка шла в пределах времени переменных "vrTimeBegin" и "vrTimeEnd" и только для строк с "action_id" = 2. Запрос получится таким:

select * from my_table
where (timestamp >= @vrTimeBegin) and (timestamp <= @vrTimeEnd)
and (action_id = 2)

Обратите внимание, что для использования переменных отчета в запросе, перед ними нужно ставить символ "@". А для проверки правильности ввода запроса можно нажать кнопку с красным восклицательным знаком. Завершаем изменение источника данных и перетягиваем его в рабочую зону отчета. Столбцы "id" и "action_id" можно не выводить в отчет, поэтому не будем их выбирать:

 

Теперь отредактируем внешний вид отчета, добавим заголовок и т.д., также, как мы это делали в предыдущих примерах. В результате, получаем такой шаблон:

 

Теперь можно сохранить отчёт, закрыть Редактор отчётов и вернуться к Редактору проекта. Напишем скрипт на событие OnClick для кнопки "Сформировать":

var
  aReport: TM_Report;
begin
  aReport := ReportBuild('Пользовательский');
  aReport.View(GetClientName);
end.

Сохраним проект и перезапустим его на сервере, чтобы изменения вступили в силу. Подключимся к проекту через клиент Simple-Scada. Введем время начала и время конца в календари и нажмем кнопку "Сформировать" - отчет открылся для просмотра. При необходимости, можно формировать отчет и сохранять его на клиентский или серверный ПК в нужном формате - подробнее см. по ссылке.

 

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