Добрый день.
Стоит задача вести статистику по установке. Данные в таблицу должны заноситься тогда, когда установка закончит свой цикл, т.е. есть условие, по которому происходит запись в таблицу БД, которая была отдельно создана в самой БД (т.е. это не trends_data итд). Данные должны заносится автоматически, без участия кнопок и прочего.
Как может выглядеть скрипт для внесения в базу данных одной записи и последующем чтении этой записи из нее в таблицу? Получилось сделать чтение по кнопке, но это немного не то. А запись вообще не получается.
И еще вопрос. В многих местах реализована выборка по времени. Делал на основе примера, получилось делать выборку за час, день итд. Но как сделать выборку, когда временной диапазон задается календарями, в которых прописывают границы временного отрезка?
Немного не понимаю синтаксис записи SQL запросов из скады.
tblStat.RunSQL('SELECT * FROM `statp1` WHERE(`timestamp_p1` >= ' + aFromStr + ') AND (`timestamp_p1` <= ' + aToStr + ')', tsSaveFixRow);
когда нужно заносить в ``? когда нужно ставить '' ? зачем ставятся ++?
Прошу не ругаться, раньше работал с WinCC, пока привычка осталась к той среде.
Здравствуйте!
Данные в таблицу должны заноситься тогда, когда установка закончит свой цикл, т.е. есть условие
Условие окончания цикла установки, заключающееся в достижении переменной определенного значения, можно обрабатывать в скрипте "Изменились переменные":
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:
Table1.RunSQL('SELECT timestamp, text FROM `statp1` '
+ 'WHERE(`timestamp` >= ' + MySQLDateTime(TimeFrom.AsDateTime, dttFull) + ') '
+ 'AND (`timestamp` <= ' + MySQLDateTime(TimeTo.AsDateTime, dttFull) + ');', tsSaveFixRow);
Если предоставите более полную информацию о "проблемной" части задачи, то постараюсь ответить с примерами.
Всем спасибо. Все получилось.
По поводу SQL.
Я же могу так составлять запросы?
tblStat.RunSQL('SELECT * FROM `statp1` WHERE(`timestamp_p1` >= ' + aFromStr + ') AND (`timestamp_p1` <= ' + aToStr + ')', tsSaveFixRow);
Добрый день. Никак не могу разобраться в синтаксе запросов.
Table1.RunSQL('SELECT timestamp, text FROM `statp1` ' +
'WHERE (`timestamp` >= ' + MySQLDateTime(TimeFrom.AsDateTime, dttFull) + ') ' +
'AND (`timestamp` <= ' + MySQLDateTime(TimeTo.AsDateTime, dttFull) + ');', tsSaveFixRow); Зачем плюс со скобкой в кавычках dttFull) + ') '.
Здравствуйте.
Функция MySQLDateTime (https://simple-scada.com/help/script/mysqldatetime.html) возвращает строку, например '2017-01-27 18:14:30.236'. Всё что мы пишем в одинарных кавычках, тоже является обычной строкой, например 'WHERE (`timestamp` >= ', или ') '. А чтобы сложить две строки нужно поставить между ними знак +. Примитивный пример сложения строк:
myStr := 'Привет' + 'мир!';
В приведённом Вами примере мы после вызова функции MySQLDateTime прибавляем к её результату строку ') ' и для этого используем +. Ведь нужно закрыть скобку, которую мы открыли ранее в строке 'WHERE (`timestamp` >= ', чтобы запрос был синтаксически правильным.