Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: azrael454 от 06 Сентября 2019, 14:50:46

Название: Работа с таблицей и БД
Отправлено: azrael454 от 06 Сентября 2019, 14:50:46
Добрый день.

Стоит задача вести статистику по установке. Данные в таблицу должны заноситься тогда, когда установка закончит свой цикл, т.е. есть условие, по которому происходит запись в таблицу БД, которая была отдельно создана в самой БД (т.е. это не trends_data итд). Данные должны заносится автоматически, без участия кнопок и прочего.
Как может выглядеть скрипт для внесения в базу данных одной записи и последующем чтении этой записи из нее в таблицу? Получилось сделать чтение по кнопке, но это немного не то. А запись вообще не получается.

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

Немного не понимаю синтаксис записи SQL запросов из скады.
Код
tblStat.RunSQL('SELECT * FROM `statp1` WHERE(`timestamp_p1` >= ' + aFromStr + ') AND (`timestamp_p1` <= ' + aToStr + ')', tsSaveFixRow);   

когда нужно заносить в ``? когда нужно ставить '' ? зачем ставятся ++?

Прошу не ругаться, раньше работал с WinCC, пока привычка осталась к той среде.
Название: Re: Работа с таблицей и БД
Отправлено: pan2000 от 07 Сентября 2019, 07:19:06
    Здравствуйте!

Цитировать
Данные в таблицу должны заноситься тогда, когда установка закончит свой цикл, т.е. есть условие

Условие окончания цикла установки, заключающееся в достижении переменной определенного значения, можно обрабатывать в скрипте "Изменились переменные":
Код: (delphi)
var aStr: string;
begin
// проверка условия
  if Variable.Value <условие> <значение> then begin
    . . .
// запись в таблицу метки времени и сопутствующих данных
  aStr := 'INSERT INTO `statp1` (`timestamp`, `param1`, `param2`, <другие имена заполняемых столбцов> ) VALUES ('
        + MySQLDateTime(Now, dttFull) + .', '    // время-дата Simple-Scada
        + varParav1.asStr + ', '                 // числовой параметр
        + QuotedStr(varParav2.asStr) + ', '      // строковый параметр - текст в одинарных кавычках
        +  ... + ');';
        RunSQL(aStr, nil, 0);

Text1.Text := aStr;  // контроль запроса RunSQL на время отладки
  end;
end.

Для контроля ошибок запросов можно использовать событие "Ошибка SQL-запроса":
Код
begin
  ShowMessageAll('ОШИБКА!', Msg, clNone);
end.
     

Цитировать
когда нужно заносить в ``? когда нужно ставить '' ? зачем ставятся ++?

Первый параметр процедуры RunSQL - строка состоящая из строковых констант и выражений. Константы заключаются в одиночные кавычки.
++ это простое объедение составляющих строки.
`` окаймляют имена столбцов и таблиц БД.
Для выражения, которое по правилам для MySQL необходимо заключить в одинарные кавычки, можно использовать функцию QuotedStr или пары одинарных кавычек, интерпретируемых внутри строки как одинарные.

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

Подготовить два календаря, с привязанными виртуальными переменными TimeFrom и TimeTo типа DataTime:
Код: (delphi)
  Table1.RunSQL('SELECT timestamp, text FROM `statp1` '
    + 'WHERE(`timestamp` >= ' + MySQLDateTime(TimeFrom.AsDateTime,  dttFull) + ') '
    + 'AND (`timestamp` <= ' + MySQLDateTime(TimeTo.AsDateTime,  dttFull) + ');', tsSaveFixRow);

Если предоставите более полную информацию о "проблемной" части задачи, то постараюсь ответить с примерами.
Название: Re: Работа с таблицей и БД
Отправлено: Simple-Scada от 07 Сентября 2019, 09:29:26
Здравствуйте.

Прочтите эту статью (https://simple-scada.com/help/script/querytodb.html), в ней полностью описан принцип выполнения SQL-запросов. В ней же есть пример (https://simple-scada.com/help/script/index.html?querytodb.html#sqlcomp) как после выполнения запроса проделать какие-либо действия. Вы можете сделать также как описано в статье, только подставить свои SQL-запросы. Например вызывать запрос на вставку новой строки в таблицу БД и по событию "Выполнен SQL-запрос" обновлять таблицу на мнемосхеме запросом "SELECT * ...", чтобы все строки из БД отобразились в таблице на мнемосхеме.
Название: Re: Работа с таблицей и БД
Отправлено: azrael454 от 10 Сентября 2019, 14:49:32
Всем спасибо. Все получилось.

По поводу SQL.
 Я же могу так составлять запросы?
Код
tblStat.RunSQL('SELECT * FROM `statp1` WHERE(`timestamp_p1` >= ' + aFromStr + ') AND (`timestamp_p1` <= ' + aToStr + ')', tsSaveFixRow);
Название: Re: Работа с таблицей и БД
Отправлено: Stranger от 19 Ноября 2019, 15:57:09
Добрый день. Никак не могу разобраться в синтаксе запросов.
Код: (delphi)
  Table1.RunSQL('SELECT timestamp, text FROM `statp1` ' +
    'WHERE (`timestamp` >= ' + MySQLDateTime(TimeFrom.AsDateTime,  dttFull) + ') ' +
    'AND   (`timestamp` <= ' + MySQLDateTime(TimeTo.AsDateTime,  dttFull) + ');', tsSaveFixRow);
Зачем  плюс со скобкой в кавычках  dttFull) + ') '.
Название: Re: Работа с таблицей и БД
Отправлено: Simple-Scada от 19 Ноября 2019, 16:14:18
Здравствуйте.
Функция MySQLDateTime (https://simple-scada.com/help/script/mysqldatetime.html) возвращает строку, например '2017-01-27 18:14:30.236'. Всё что мы пишем в одинарных кавычках, тоже является обычной строкой, например 'WHERE (`timestamp` >= ', или ') '. А чтобы сложить две строки нужно поставить между ними знак +. Примитивный пример сложения строк:
Код: (delphi)
myStr := 'Привет' + 'мир!';
В приведённом Вами примере мы после вызова функции MySQLDateTime прибавляем к её результату строку ') ' и для этого используем +. Ведь нужно закрыть скобку, которую мы открыли ранее в строке 'WHERE (`timestamp` >= ', чтобы запрос был синтаксически правильным.
Название: Re: Работа с таблицей и БД
Отправлено: Stranger от 19 Ноября 2019, 16:24:17
Спасибо. А зачем после WHERE писать запрос в скобках ()? Вот к примеру нашел запрос SELECT * FROM tableName WHERE condition; и он без скобок.
Название: Re: Работа с таблицей и БД
Отправлено: Simple-Scada от 19 Ноября 2019, 16:39:40
Применение скобок зависит от того какие условия нужно проверить и сколько их. Обычно, если условий несколько каждое условие закрывается в скобки, особенно это касается логических операций когда скобки могут влиять на результат. Скада никак не проверяет синтаксис SQL-запросов, для скады это просто строка, которую нужно передать в СУБД. Поэтому Вы можете писать как угодно, главное чтобы для СУБД синтаксис был правильный. Если Вы используете MySQL, то о синтаксисе запросов можно прочесть в документации MySQL (http://www.mysql.ru/docs/man/Where_optimisations.html).