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

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

Автор Тема: Работа с таблицей и БД  (Прочитано 2203 раз)

azrael454

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Работа с таблицей и БД
« : 06 Сентября 2019, 14:50:46 »
Добрый день.

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

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

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

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

Прошу не ругаться, раньше работал с WinCC, пока привычка осталась к той среде.

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Работа с таблицей и БД
« Ответ #1 : 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);

Если предоставите более полную информацию о "проблемной" части задачи, то постараюсь ответить с примерами.
« Изменён: 07 Сентября 2019, 07:20:14 от pan2000 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Работа с таблицей и БД
« Ответ #2 : 07 Сентября 2019, 09:29:26 »
Здравствуйте.

Прочтите эту статью, в ней полностью описан принцип выполнения SQL-запросов. В ней же есть пример как после выполнения запроса проделать какие-либо действия. Вы можете сделать также как описано в статье, только подставить свои SQL-запросы. Например вызывать запрос на вставку новой строки в таблицу БД и по событию "Выполнен SQL-запрос" обновлять таблицу на мнемосхеме запросом "SELECT * ...", чтобы все строки из БД отобразились в таблице на мнемосхеме.

azrael454

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Работа с таблицей и БД
« Ответ #3 : 10 Сентября 2019, 14:49:32 »
Всем спасибо. Все получилось.

По поводу SQL.
 Я же могу так составлять запросы?
Код
tblStat.RunSQL('SELECT * FROM `statp1` WHERE(`timestamp_p1` >= ' + aFromStr + ') AND (`timestamp_p1` <= ' + aToStr + ')', tsSaveFixRow);

Stranger

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Работа с таблицей и БД
« Ответ #4 : 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) + ') '.
« Изменён: 19 Ноября 2019, 16:07:50 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Работа с таблицей и БД
« Ответ #5 : 19 Ноября 2019, 16:14:18 »
Здравствуйте.
Функция MySQLDateTime возвращает строку, например '2017-01-27 18:14:30.236'. Всё что мы пишем в одинарных кавычках, тоже является обычной строкой, например 'WHERE (`timestamp` >= ', или ') '. А чтобы сложить две строки нужно поставить между ними знак +. Примитивный пример сложения строк:
Код: (delphi)
myStr := 'Привет' + 'мир!';
В приведённом Вами примере мы после вызова функции MySQLDateTime прибавляем к её результату строку ') ' и для этого используем +. Ведь нужно закрыть скобку, которую мы открыли ранее в строке 'WHERE (`timestamp` >= ', чтобы запрос был синтаксически правильным.

Stranger

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Работа с таблицей и БД
« Ответ #6 : 19 Ноября 2019, 16:24:17 »
Спасибо. А зачем после WHERE писать запрос в скобках ()? Вот к примеру нашел запрос SELECT * FROM tableName WHERE condition; и он без скобок.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3000
    • Просмотр профиля
    • Simple-Scada
Re: Работа с таблицей и БД
« Ответ #7 : 19 Ноября 2019, 16:39:40 »
Применение скобок зависит от того какие условия нужно проверить и сколько их. Обычно, если условий несколько каждое условие закрывается в скобки, особенно это касается логических операций когда скобки могут влиять на результат. Скада никак не проверяет синтаксис SQL-запросов, для скады это просто строка, которую нужно передать в СУБД. Поэтому Вы можете писать как угодно, главное чтобы для СУБД синтаксис был правильный. Если Вы используете MySQL, то о синтаксисе запросов можно прочесть в документации MySQL.
« Изменён: 19 Ноября 2019, 16:41:19 от Simple-Scada »