Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Добавление сообщений/алармов в отчет  (Прочитано 20444 раз)

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Добавление сообщений/алармов в отчет
« Ответ #15 : 01 Августа 2019, 10:10:23 »
Еще один вопрос - как связать данные из таблиц trends_data и messages_data и вывести их в один отчет? Например, из trends_data в отчет выводится простой линии более 10 мин., а из messages_data в эту строку надо вывести записанную оператором причину простоя.
trends_data и messages_data это таблицы с разными структурами, поэтому просто объединить их в одну таблицу будет проблематично. Можно создать пользовательских источник данных и описать собственные выборки в которых можно попытаться объединить таблицы примерно как описано здесь, но скорее всего нужный Вам результат получить не удастся, ведь строки в разных таблицах нужно соотносить по времени и это превратится в сложнейшую задачу.

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Добавление сообщений/алармов в отчет
« Ответ #16 : 05 Августа 2019, 17:02:26 »
Здравствуйте.
Второй день бьюсь над проблемой соединения таблиц trends_data и messages_data и записи полученных данных в пользовательскую таблицу idle_data. Проблема в том, что созданный запрос работает в MySQL Workbench, но ни в какую не хочет в проекте. Ошибок никаких при компиляции и в журнале нет. Вот текст скрипта:   
Код: (delphi)
var
  aQuery: string;                 // сам запрос
  aFrom, aTo: TDateTime;          // интервал времени в формате TDateTime
  aFromStr, aToStr: string;       // интервал времени в виде строки
begin
   RunSQL('TRUNCATE idle_data', nil, 100);
   aFrom := vrTimeBegin.Value;
   aTo := vrTimeEnd.Value;
   aFromStr := MySQLDateTime(aFrom, dttFull);
   aToStr := MySQLDateTime(aTo, dttFull);
   aQuery := 'REPLACE INTO idle_data (timestamp, value, message) ' +
             'SELECT a.timestamp, a.value, b.text FROM trends_data a ' +
             'LEFT JOIN messages_data b ' +
             'ON DATE_FORMAT(a.timestamp, "%Y %m %d %H %i %S") = ' +
             'DATE_FORMAT(b.timestamp, "%Y %m %d %H %i %S") ' +
             'WHERE (a.timestamp >= ' + aFromStr + ') AND (a.timestamp <= ' + aToStr + ') ' +
             'AND (a.ID = 31);';
    RunSQL(aQuery, nil, 30);
end.
Подскажите, плз, в чем моя ошибка?
« Изменён: 06 Августа 2019, 10:04:42 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Добавление сообщений/алармов в отчет
« Ответ #17 : 06 Августа 2019, 10:19:36 »
Здравствуйте.
Для компилятора и для скады SQL-запросы представляют собой текст, поэтому на этапе компиляции ошибки никогда не будут выдаваться, скада просто передаёт текст SQL-запроса в СУБД в неизменном виде. Компиляцию и проверку SQL-запросов выполняет СУБД (в разных СУБД используется разный синтаксис). В случае успешного выполнения запроса в скаду передаётся результат и скада выполняет скрипты с типом события "Выполнен SQL-запрос". В случае ошибки, текст ошибки также передаётся в скаду и скада выполняет скрипты с типом события "Ошибка SQL-запроса". Поэтому, чтобы вывести на мнемосхему сообщение об ошибке, нужно использовать скрипт с типом события "Ошибка SQL-запроса". Либо второй вариант: выполнить SQL-запрос от имени таблицы например: "Table1.RunSQL(aQuery, tsAll);", тогда в случае ошибки скада автоматически отобразит текст ошибки в области ячеек таблицы.