Добрый день.
Имеется база данных трендов с значениями датчиков. Требуется выбрать минимальное, максимально и среднее значение из базы по нескольким датчикам и группе датчиков за заданный период времени.
Если делать выборку одним простым запрсом SELECT - проблем нет, данные все получаю, передаю в отчет. Код вот такой:
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. Код вот такой тогда использую:
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 запрос". Вот такой
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 - не работает.
Подскажите, к в чем может быть проблема с запросом к базе? Или как реализовать по нажатию кнопки выполнение нескольких запросов с последующей передачей данных в переменные и отчет.