Доброго всем времени суток
Пытаюсь писать значение переменной в БД с интервалом секунда, для чего:
1. В БД создана таблица Current_Values со столбцами ID, DataTime, Value
2. Создан скрипт с исполнением каждую секунду
3. Код скрипта
var
aQuery: string;
begin
aQuery := 'INSERT INTO `current_values` (`id`, `datetime`, `value`) VALUES (' +
IntToStr(Parametr.ID) +', Now(), '+ FloatToStr(Parametr.AsFloat,8) +');
RunSQL(aQuery);
end
Запись не происходит :(
Что я делаю не так ?
Здравствуйте.
Насколько нам известно, Вы используете СУБД PostgreSQL. В синтаксисе SQL-запросов для данной СУБД вместо "`" нужно использовать двойные кавычки.
Правильный код:
var
aQuery: string;
begin
aQuery := 'INSERT INTO "current_values" ("id", "datetime", "value") VALUES(' +
IntToStr(Parametr.ID) +', Now(), '+ FloatToStr(Parametr.AsFloat, 8) +')';
RunSQL(aQuery);
end.
Как выполнять запросы к БД, можно прочесть по ссылке (https://simple-scada.com/help/script/querytodb.html). Обработать ошибки выполнения SQL-запроса можно в скрипте "Ошибка SQL-запроса (https://simple-scada.com/help/script/sql-query-error.html)". Пример записи значения переменной в БД по таймеру можно найти по ссылке (https://simple-scada.com/help/script/dbwrtime.html).
Доброго всем времени суток
Имеется выполняющийся 1 раз в час скрипт для записи значений наработки оборудования в БД:
var
Time, DateStart, DateEnd: TDateTime;
I:integer;
aQuery: string;
begin
DateEnd:= Now;
DateStart:= IncHour(Now, -1);
ArchiveTimeOn(HPT_2, HPT_2_narabotka, DateStart, DateEnd);
I:= MinutesBetween(0, HPT_2_narabotka.AsDateTime);
aQuery := 'INSERT INTO "public.equpment_operating" ("id","operating_time","operating_value") VALUES ('+IntToStr(2)+', Now(), '+IntToStr(I)+')';
RunSQL(aQuery);
end.
Запись в БД не происходит
Что здесь не так ?
Здравствуйте.
1. Если требуется выявить ошибки при выполнении SQL-запроса, то нужно использовать скрипт с типом события "Ошибка SQL-запроса (https://simple-scada.com/help/script/sql-query-error.html)". Также, для отладки скриптов работы с БД можно активировать опцию "Лог пользовательских SQL-запросов (https://simple-scada.com/help/manual/settings-simple-scada-server.html?anchor=debug)", тогда все пользовательские SQL-запросы будут записываться в лог-файл сервера. Данную опцию можно использовать только для отладки проекта, иначе она будет создавать лишнюю нагрузку на сервер скады.
2. Нужно использовать синтаксис используемой СУБД. В данном случае, если требуется выполнить запись в таблицу, расположенную в схеме "public", то указание схемы можно опустить:
aQuery := 'INSERT INTO "equpment_operating"… ';
В случае, когда в SQL-запросе требуется указать определенную схему, нужно использовать следующий синтаксис:
aQuery := 'INSERT INTO "my_schema"."equpment_operating"… ';
Также в скрипте используется архивная процедура "ArchiveTimeOn (https://simple-scada.com/help/script/archivetimeon.html)". Рекомендуем ознакомиться с принципом работы архивных процедур (https://simple-scada.com/help/script/work-with-arch-procedures.html). В Вашем случае при выполнении скрипта, в БД могут записываться неверные значения, так как архивные процедуры не выполняются мгновенно. Скорость их выполнения зависит от производительности ПК, загруженности СУБД, качества связи между сервером Simple-Scada и СУБД. Поэтому, после вызова архивных процедур, скрипт продолжит выполняться, но результат вычислений может записаться в переменную "HPT_2_narabotka" позже, например через секунду после полного выполнения скрипта.