Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Rolich от 15 Августа 2024, 11:50:50

Название: Чтение значения из БД
Отправлено: Rolich от 15 Августа 2024, 11:50:50
Доброго всем времени суток
Имеется таблица БД Value, в которой есть поля ID и Znachenie (база - Postgres)
Как в переменную Simple Scada считать значение ?
Пробую вот так:
Код: (delphi)
var
  aQuery: string;
begin
    aQuery := 'Select "Znachenie" from "Value" where ID=1';
    RunSQL(aQuery);
    if DataSet.Tag = 1 then Peremennaya.Value:= DataSet[0].AsFloat;
end.
Название: Re: Чтение значения из БД
Отправлено: Simple Scada от 15 Августа 2024, 16:09:58
Здравствуйте.

Процедура RunSQL выполняется асинхронно (выполнение зависит от нагрузки на СУБД, ПК и пр.). Поэтому сразу после вызова RunSQL нельзя работать с результатом запроса. Обрабатывать результат запроса нужно в отдельном скрипте с типом события "Выполнен SQL-запрос (https://simple-scada.com/help/script/sql-query-completed.html)". Пример получения значение из БД (для MySQL) см. по ссылке (https://simple-scada.com/help/script/getvardb.html). Для СУБД PostgreSQL скрипты будут выглядеть следующим образом:
Код: (delphi)
var
  aQuery: string;
begin
  aQuery := 'SELECT "Znachenie" FROM "Value" WHERE "ID" = 1;';
  RunSQL(aQuery, nil, 1);
end.

Скрипт с типом события "Выполнен SQL-запрос":
Код: (delphi)
begin
  if DataSet.Tag = 1 then
    Peremennaya.Value:= DataSet[0].AsFloat;
end.

Проверить свой SQL-запрос и увидеть результат его выполнения можно используя приложение PgAdmin (https://simple-scada.com/help/manual/pgadmin.html), выполнив в нём требуемый SQL-запрос. Обработать ошибки выполнения SQL-запроса можно в скрипте "Ошибка SQL-запроса (https://simple-scada.com/help/script/sql-query-error.html)". Также для поиска ошибок в SQL-запросе можно включить опцию "Лог пользовательских SQL-запросов (https://simple-scada.com/help/manual/settings-simple-scada-server.html?anchor=other)". При активации данной опции все пользовательские SQL-запросы будут записываться в лог-файл сервера с указанием имени скрипта, из которого была вызвана процедура и текстом SQL-запроса. Таким образом, можно просмотреть нужный SQL-запрос, отправленный в БД, и проверить, нет ли в нем ошибок. Данную опцию можно использовать только для отладки проекта, иначе она будет создавать лишнюю нагрузку на сервер. После отладки опцию нужно обязательно выключить.
Название: Re: Чтение значения из БД
Отправлено: Rolich от 16 Августа 2024, 09:00:45
Как быть в ситуации, когда поле ID имеет формат uuid и выглядит, например, так: 18a5f8b-7ab4-7727-b7b2-b5f90c739dda
Запрос aQuery := 'SELECT "Znachenie" FROM "Value" WHERE "ID" = 18a5f8b-7ab4-7727-b7b2-b5f90c739dda' возвращает ошибку "Мусорное значение"
Название: Re: Чтение значения из БД
Отправлено: Simple Scada от 16 Августа 2024, 11:49:22
Здравствуйте.

Информацию по данной ошибке и ее устранению можно найти в интернете (https://dba.stackexchange.com/questions/211692/in-postgres-how-to-select-by-a-column-of-type-uuid). Вам нужно самостоятельно изучить синтаксис PostgreSQL и составлять запросы в соответствии с требованиями синтаксиса используемой СУБД. Запросы для скады не нужно никак менять. Их можно просто подставить в RunSQL в виде строки. Исключение: символы одинарных кавычек (т.к. в скаде одинарные кавычки используются для указания строки). Чтобы добавить строке одинарные кавычки (по краям) используйте функцию QuotedStr, либо дублируйте их (см. пример по ссылке (https://simple-scada.com/help/script/querytodb.html?anchor=quotes)). Подробное описание см. в руководстве по ссылке (https://simple-scada.com/help/script/querytodb.html).

Исправленный запрос:
Код: (delphi)
aQuery := 'SELECT "Znachenie" FROM "Value" WHERE "ID" = ' + QuotedStr('18a5f8b-7ab4-7727-b7b2-b5f90c739dda') + ';';
Название: Re: Чтение значения из БД
Отправлено: Rolich от 16 Августа 2024, 14:39:08
Большое спасибо за помощь, всё получилось !