Пожалуйста, включите JavaScript для просмотра этого сайта.

Скрипты Simple-Scada

История: Примеры скриптов > Работа с БД

Мин/Макс значение за 24 часа

Пред. Вверх След. Еще

Допустим имеется переменная "MyVar", которая архивируется в базу данных, в таблицу с именем "trends":

Задача: по нажатию на кнопку "Button1" получить максимальное и минимальное значения переменной "MyVar" за последние 24 часа. Добавим в проект новую кнопку "Button1" и создадим скрипт по событию "OnClick":

var
  aQuery: string;               // сам запрос
  aFrom, aTo: TDateTime;        // интервал времени в формате TDateTime
  aFromStr, aToStr: string;     // интервал времени в виде строки
 
begin
  { сначала берём в интервал последние 24 часа }
  aTo := Now;                  // текущее время помещаем в aTo
  aFrom := IncHour(aTo, -24);  // текущее время минус 24 часа помещаем в aFrom
 
  { теперь нужно перевести интервал в подходящую для SQL-строку,
    которую будем использовать в SQL-запросе. Для этого используем функцию MySQLDateTime}
  aFromStr := MySQLDateTime(aFrom, dttFull);
  aToStr := MySQLDateTime(aTo, dttFull);
 
  { формируем SQL-запрос }
  aQuery := 'SELECT TRUNCATE(MIN(Value), 2), TRUNCATE(MAX(Value), 2) ' +
            'FROM `trends` ' +
            'WHERE (`t` >= ' + aFromStr + ') AND (`t` <= ' + aToStr + ') AND ' +
                  '(`id` = ' + IntToStr(MyVar.ID) + ');';
 
  { отправляем запрос на выполнение c тегом = 1 }
  RunSQL(aQuery, nil1);
end.

 

Рассмотрим подробнее SQL-запрос: TRUNCATE(MIN(Value), 2). Value - это имя колонки (в таблице "trends"), из которой нужно брать данные. Функция "TRUNCATE" берет вещественное число и усекает его до заданного количества десятичных знаков. В нашем примере берется минимальное значение за заданный интервал и усекается до двух знаков после десятичной запятой. Условия выборки задаются после оператора "WHERE". Мы выбираем все значения тренда переменной "MyVar", которые попали в интервал времени от "aFromStr" до "aToStr".

В итоге, при нажатии на кнопку "Button1" будет выполняться наш запрос. Остается получить результат выполнения запроса и отобразить его в скада-системе. Для этого в редакторе скриптов необходимо создать новый скрипт с типом события "Выполнен SQL-запрос". Такой скрипт будет вызываться скада-системой каждый раз, когда пользовательский SQL-запрос выполнился. Также, этот скрипт будет содержать параметр "DataSet" - это таблица, которая была получена в результате выполнения запроса. Нам известно, что запрос вернет только две колонки ("min" и "max") с одной строкой, поэтому можно брать эти значения напрямую, вот так:

begin
  if DataSet.IsEmpty then Exit;
 
  if DataSet.Tag = 1 then
  begin
    txtMin.Text := DataSet.Fields[0].AsStr;
    txtMax.Text := DataSet.Fields[1].AsStr;
  end;
end.

Пример работы с выборкой из множества строк можно найти по ссылке.

Сначала мы убедились, что "DataSet" это результат нашего запроса, так как мы помечали его тегом = 1. Затем, мы обращаемся к первой колонке (Fields[0]) и записываем ее содержимое в виде строки в объект "txtMin", обращаемся ко второй колонке (Fields[1]) и записываем ее содержимое в виде строки в объект "txtMax". В итоге, результат выполнения SQL-запроса помещён в объекты "txtMin" и "txtMax" и мы можем видеть минимальное и максимальное значения переменной "myVar" за последние 24 часа в скада-системе.