Создание круговой диаграммы в Генераторе отчетов

Avatar
  • обновлен
  • Отвечен

Есть 4 канала: А1, А2, А3, A. A = A1 + A2 + A3.


Хочу вставить в отчет круговую диаграмму. 

На этой диаграмме должны отображаться доли этих каналов в общей сумме:

А1 / А, А2 / А, А3 / А.


В руководстве на FastReport приводится пример с таблицей из БД.

Но у нас нет БД, мы работаем с каналами.

Как тогда формировать исходные данные для сегментов диаграммы?

Avatar
Константин Лаптев
Цитата от Станислав С

Enterprise

Добрый день, Станислав.

Компонент THistorySet не может быть использован для решения этой задачи. Я предлагаю вам проект и видео к нему к нему с примером реализации вашей задачи.
Отчет.Круговая диаграмма.slz

Avatar
Станислав С

Спасибо. 

Но мне кажется, что это неправильное решение.

Вы выгружаете данные поканально за сутки притом, что каждый тег обновляется раз в секунду.

А потом вы суммируете эти данные.

За 24 часа мне нужно сложить 86400 значений, равных примерно 1000.

Во-первых, будет переполнение, во-вторых, такой объем данных сразу намертво подвесит скаду, если таких каналов будет с десяток.

У меня была идея считать нарастающим итогом энергию, а потом из значения конца дня вычитать значение начала дня. В общем, ваша идея с использованием функций StreamReadFromDatabase и GetValueFromStream мне понятна: 

считать все в скрипте, а данные для отчета брать из Монитора.

Думаю, что смогу сейчас это реализовать.

Avatar
Константин Лаптев
Цитата от Станислав С

Спасибо. 

Но мне кажется, что это неправильное решение.

Вы выгружаете данные поканально за сутки притом, что каждый тег обновляется раз в секунду.

А потом вы суммируете эти данные.

За 24 часа мне нужно сложить 86400 значений, равных примерно 1000.

Во-первых, будет переполнение, во-вторых, такой объем данных сразу намертво подвесит скаду, если таких каналов будет с десяток.

У меня была идея считать нарастающим итогом энергию, а потом из значения конца дня вычитать значение начала дня. В общем, ваша идея с использованием функций StreamReadFromDatabase и GetValueFromStream мне понятна: 

считать все в скрипте, а данные для отчета брать из Монитора.

Думаю, что смогу сейчас это реализовать.

Да, вы правы что может быть переполнение. Точность типа double составляет [15 цифр точности в диапазоне от 2.23 x 10-308 до 1.79 x 10308], так что это мало вероятное событие. В этом примере показано сложение за месяц при наполнении с 60 сек. интервалом.  Скрипты выполняются в фоновом потоке, следовательно скаду он не повесит, просто придется ждать расчет после запуска скрипта.

Avatar
Станислав С

Все-таки, я не понимаю логику работы.

Если я в редакторе отчетов открываю источник каналов, то почему я не могу указать конкретные теги, которые мне нужно прочитать. 

"Наименование", "ФорматированноеЗначение" к какому тегу относятся?!

В вашем проекте отчет сгенерировался по нажатию на кнопку, а в моем нет!

И как понять почему?!

Avatar
Станислав С

Скрипт, формирующий отчет:

var
lStart: TDateTime;
lEnd: TDateTime;

var
W1, W2, W3, W4, W5, W6, WG, WC: Double;

begin
lStart := ReadValue('Report_Energy_Start');
lEnd := ReadValue('Report_Energy_End');

W1 := GetConsumptionValueFromDB(lStart, lEnd, 'Device1.All.Calc.W_Engines_H');
W2 := GetConsumptionValueFromDB(lStart, lEnd, 'Device1.All.Calc.W_Solar_H');
WG := W1 + W2;

WriteValue('W_Generation', WG);
WriteValue('W_Share_Engines_H', W1 / WG);
WriteValue('W_Share_Solar_H', W2 / WG);

W3 := GetConsumptionValueFromDB(lStart, lEnd, 'Device1.All.Calc.W_AC_Load_H');
W4 := GetConsumptionValueFromDB(lStart, lEnd, 'Device1.All.Calc.W_DC_Load_H');
W5 := GetConsumptionValueFromDB(lStart, lEnd, 'Device1.All.Calc.W_AC_Load_H');
W6 := GetConsumptionValueFromDB(lStart, lEnd, 'Device1.All.Calc.W_DC_Load_H');

WC := W3 + W4 + W5 + W6;
WriteValue('W_Consumption', WC);
WriteValue('W_Share_AC_Load_H', W3 / WC);
WriteValue('W_Share_DC_Load_H', W4 / WC);
WriteValue('W_Share_DC_Aux_H', W5 / WC);
WriteValue('W_Share_W_Bat_H_In', W6 / WC);

OpenReport('Energy1');
end.

Avatar
Станислав С

Возникает ошибка при нажатии кнопки:

23.08.2021 17:40:19.380 Invalid floating point operation - [Report_Energy_Create]

Что это означает? Тег бинарный.

Avatar
Константин Лаптев
Цитата от Станислав С

?

Добрый день. ИсточникКаналов позволяет получить каналы в виде записей в FastReport. При редактировании этого компонента указываются каналы, которые будут получены генератором отчетов от Монитора. Поля "Наименование", "ФорматированноеЗначение" относятся к свойствам каналов, а не к самим тегам. Компонент "Диаграмма" FastReport работает с записями источника данных, а не с каналами на прямую.

В вашем проекте отчет сгенерировался по нажатию на кнопку, а в моем нет!
И как понять почему?

Убедитесь, что отчет находится в корне дерева отчетов в редакторе отчетов либо укажите до него путь, если он находится внутри папки. Например, Отчеты\Отчет пресса №4
https://simplight.ru/manual_next/razdel/openreport