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

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

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - SergeyP

Страницы: [1]
1
Добрый день.
Имеется база данных трендов с значениями датчиков. Требуется выбрать минимальное, максимально и среднее значение из базы по нескольким датчикам и группе датчиков за заданный период времени.

Если делать выборку одним простым запрсом SELECT - проблем нет, данные все получаю, передаю в отчет. Код вот такой:

Код: (delphi)
var

  aQuery: string;               // сам запрос
  aFromStr, aToStr: string;     // интервал времени в виде строки

begin

 aFromStr := MySQLDateTime(DATA_BEGIN.VALUE, dttFull);
 aToStr   := MySQLDateTime(DATA_END.VALUE, dttFull);

   aQuery := 'SELECT TRUNCATE(MIN(`V`), 2), TRUNCATE(MAX(`V`), 2), TRUNCATE(AVG(`V`), 2) ' +
              'FROM `trends` ' +
              'WHERE (`t` >= ' + aFromStr + ') AND (`t` <= ' + aToStr + ') AND ' +
              '((`id` = 21) or (`id` = 23) or (`id` = 25))';
 
RunSQL(aQuery, nil, 1);

end.

Для получения данных по нескольким датчикам использую UNION. Код вот такой тогда использую:

Код: (delphi)
var

  aQuery: string;               // сам запрос
  aFromStr, aToStr: string;     // интервал времени в виде строки

begin

 aFromStr := MySQLDateTime(DATA_BEGIN.VALUE, dttFull);
 aToStr   := MySQLDateTime(DATA_END.VALUE, dttFull);

   aQuery := 'SELECT TRUNCATE(MIN(`V`), 2), TRUNCATE(MAX(`V`), 2), TRUNCATE(AVG(`V`), 2) ' +
              'FROM `trends` ' +
              'WHERE (`t` >= ' + aFromStr + ') AND (`t` <= ' + aToStr + ') AND ' +
              '((`id` = 21) or (`id` = 23) or (`id` = 25))'  +
              'union' +
              'SELECT TRUNCATE(MIN(`V`), 2), TRUNCATE(MAX(`V`), 2), TRUNCATE(AVG(`V`), 2) ' +
              'FROM `trends` ' +
              'WHERE (`t` >= ' + aFromStr + ') AND (`t` <= ' + aToStr + ') AND ' +
              '(`id` = 11)' +
              'union' +
              'SELECT TRUNCATE(MIN(`V`), 2), TRUNCATE(MAX(`V`), 2), TRUNCATE(AVG(`V`), 2) ' +
              'FROM `trends` ' +
              'WHERE (`t` >= ' + aFromStr + ') AND (`t` <= ' + aToStr + ') AND ' +
              '(`id` = 10);';

  RunSQL(aQuery, nil, 1);

end.

Для обработки данных использую скрипт "Выполнен SQL запрос". Вот такой

 
Код: (delphi)
var

 aReport: TM_Report;

begin

  if DataSet.IsEmpty then Exit;
 
  if DataSet.Tag = 1 then
  begin
    MIN_room1.Value := DataSet.Fields[0].AsStr;
    MAX_room1.Value := DataSet.Fields[1].AsStr;
    AVG_room1.Value := DataSet.Fields[2].AsStr;
    MIN_T_room1.Value := DataSet.Fields[3].AsStr;
    MAX_T_room1.Value := DataSet.Fields[4].AsStr;
    AVG_T_room1.Value := DataSet.Fields[5].AsStr;
    MIN_HE_room1.Value := DataSet.Fields[6].AsStr;
    MAX_HE_room1.Value := DataSet.Fields[7].AsStr;
    AVG_HE_room1.Value := DataSet.Fields[8].AsStr;
    end;

  aReport := ReportBuild('Камера газации 1');
  aReport.View(GetClientName);
                                           
end.

Для простой выборки через SELECT - все работает.  При применении UNION - не работает.

Подскажите, к в чем может быть проблема с запросом к базе? Или как реализовать по нажатию кнопки выполнение нескольких запросов с последующей передачей данных в переменные и отчет.



Страницы: [1]