Удалил все переменные в отчете AllTermopodveski и он заработал.
Удалять не обязательно. Достаточно снять флажки "Не задано" у переменных в словаре отчета, как мы писали в предыдущем сообщении.
А отчет Termopodveska так и не работает.
Отчет Termopodveska не строится из-за другой ошибки в синтаксисе SQL-запроса у таблицы "tmonitor". Проверьте, Вы пропустили скобку "(" в условии WHERE:
WHERE `silage`= @silage_now) and
Нули выводятся вместо данных, потому что у Вас выборка из БД делается вот так:
SELECT Date(`Timestamp`), max(`level`), max(`t1`), max(`t2`), max(`t3`)...
В результате такой выборки получаем столбцы в именами "max(`level`)", "max(`t1`)", "max(`t3`)" и так далее. Это видно на первом скрине из вашего предыдущего сообщения. При этом в источнике данных колонки имеют имена: "level", "t1", "t2", "t3" и т.д. Видимо когда вы создавали источник, то колонки брались без преобразований, а затем Вы добавили выборку максимумов, но имена колонок в источнике не изменили. Решений может быть несколько. Первое это изменить запрос вот так:
SELECT Date(`Timestamp`) as `Timestamp`, max(`level`) as `level`, max(`t1`) as `t1`, max(`t2`) as `t2`, max(`t3`) as `t3`...
Тогда имена колонок в источнике и колонки полученные в результате выборки будут совпадать.
Второй вариант сначала удалить все колонки из источника, затем нажать "Получить все колонки" и система отчетов добавит колонки с соответствующими именами. После этого нужно будет удалить старый бэнд данных и перетянуть в отчет обновленный бэнд с обновленными именами. См. вложение.
Мы забыли включить в статью фильтрацию по пустым циклам. Проделайте следующие действия:
1. Кликнуть ПКМ по бэнду DataЦиклы и выбрать пункт Редактировать.
2. Добавить фильтр по значению даты колонки vrCycleEnd.
(см. скрины во вложении)
Обратите внимание, циклы в отчете формируются по изменению переменной vrCycleEnd. У Вас в отчете она принимает только нулевые значения (дата-время "30.12.1899 0:00:00" соответствует нулю). Эти нулевые значения появляются в архиве когда Вы запускаете проект. После выполнения двух шагов описанных выше у Вас в отчете ничего не отобразится, т.к. vrCycleEnd не принимает никаких значений кроме 0. Поэтому нужно сделать так, чтобы в переменную vrCycleEnd записывалась дата/время конца цикла. Т.е. когда очередной цикл завершается вы должны выполнить такой код:
begin
vrCycleEnd.Value := Now;
end.
То же касается и переменной vrCycleStart. Когда начинается новый цикл в эту переменную нужно записать дату/время:
begin
vrCycleStart.Value := Now;
end.
В ином случае дата/время циклов будет равна нулю и отчет не будет строиться правильно.
Здравствуйте!
Если у Вас в скрипте написано:
begin
ReportView('my_client_1', 'Отчет');
ReportView('my_client_2', 'Отчет');
ReportView('my_client_3', 'Отчет');
end.
и он вызывается, к примеру по нажатию на кнопку, то при нажатии кнопки на любом из клиентов произойдет формирование отчета и он отобразится на клиентах my_client_1, my_client_2, my_client_3. Если нужно, чтобы по нажатию на кнопку отчет отобразился только на том клиенте, на котором нажали кнопку - необходимо изменить скрипт так:
begin
ReportView(GetClientName, 'Отчет'); // сформировать отчет и открыть его на клиенте, который вызвал скрипт
end.
Хотелось бы получить нечто похожее на то, что находится в приложении.
Для вывода такой таблицы в отчет стандартные источники плохо подходят и проще всего создать через MySQLWorkbench в БД новую таблицу с колонками:
- `id` (int). Первичный ключ. Автоинкрементный;
- `start` (timestamp(0)). Время начала цикла;
- `end` (timestamp(0)). Время конца цикла;
- `start_val` (double). Значение параметра на начало цикла;
- `end_val` (double). Значение параметра на конец цикла;
- `diff` (double). Разница между конечным и начальным значением параметра;
Создание подобной таблицы описано в этой статье (https://simple-scada.com/help/script/dbreciepes.html) начиная с абзаца: "Интерфейс проекта создан, переменные определены. Теперь можно создать таблицу...".
В эту таблицу в конце каждого цикла можно добавлять новую строку с итогами цикла. У Вас в проекте уже есть переменные старта и конца цикла (vrCycleStart и vrCycleEnd). Значение параметра на конец цикла можно получить в конце цикла, как и разницу между начальным и конечным значением. Не хватает переменной для значения параметра в начале цикла. Нужно создать её, например с именем "vrStartValue". Во время старта цикла записывать в неё текущее значение параметра:
begin
vrStartValue.Value := myVariable.Value;
end.
А по завершению цикла выполнять вставку новой строки в таблицу:
var
aQuery: string;
aStartStr, aEndStr: string;
aDiff: string;
begin
{ переводим время старта и конца цикла в пригодный для MySQL формат }
aStartStr := MySQLDateTime(vrCycleStart.AsDateTime, dttMillisecond);
aEndStr := MySQLDateTime(vrCycleEnd.AsDateTime, dttMillisecond);
{ считаем разницу между конечным и начальным значением параметра }
aDiff := FloatToStr(myVariable.AsFloat - vrStartValue.AsFloat);
{ формируем запрос на вставку новой строки в таблицу }
aQuery := 'INSERT INTO `my_table` (`start`, `end`, `start_val`, `end_val`, `diff`) VALUES(' +
aStartStr + ', ' + // время старта цикла
aEndStr + ', ' + // время конца цикла
QuotedStr(vrStartValue.AsStr) + ', ' // значение на начало цикла
QuotedStr(myVariable.AsStr) + ', ' // текущее значение параметра, т.е значение на конец цикла
QuotedStr(aDiff) + // разница между показаниями
')';
{ отправляем запрос на выполнение }
RunSQL(aQuery, nil, 0);
end.
В результате в Вашей БД будет таблица практически такая же, как Вы описали (за исключением "ИТОГО", его расчет легко добавить в отчете). Эту таблицу можно легко вывести в отчет в соответствии с этой статьей (https://simple-scada.com/help/report/rep-user-data.html). При таком подходе не нужно создавать множество источников и легко вывести итог с суммой разниц для каждого цикла. Отчет будет строиться очень быстро, т.к. данные уже подготовлены и их нужно только отобразить. Плюс эту таблицу при необходимости можно отобразить в компоненте Таблица в скаде.
AutoCY, забыли описать обновление таблицы. Обновить таблицу можно SQL-запросом на выборку, используя метод RunSQL (https://simple-scada.com/help/script/trunsql.html) вот так:
begin
{ выбираем все данные из таблицы БД `my_table` и отображаем их в скаде в таблице "Table1" }
Table1.RunSQL('SELECT * FROM `my_table`', tsSaveFixRow);
end.
Нет, в кавычки нельзя. Для имён с кириллицей в выражении нужно использовать стандартную функцию IIF (пробелы в имени переменной должны быть заменены на подчеркивания), например:
{IIF(Данные.Подача_первой_доски == true, 1, 0)}