0
Отвечен

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

Станислав С 3 года назад в Генератор отчетов обновлен Константин Лаптев 3 года назад 44

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


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

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

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


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

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

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

  Добрый день. Соотношение текущих значений каналов вы можете вывести на круговую диаграмму с помощью компонентов ИсточникКаналов(Вкладка Данные, TChannelSet) и Объект "Диаграмма" (Вкладка Page*, TfrxChartView). На данный момент не получится получить коэффициенты на уровне FastReport. Однако Вы можете использовать отдельные виртуальные каналы для хранения коэффициентов, которые могут быть установлены из скрипта.

Я не понял ваш ответ. Какие должны быть виртуальные каналы?

Добрый день. Виртуальные каналы могут быть добавлены в активные каналы в модуле Редактор каналов из источников. Это каналы, используемые только внутри системы. Их значения могут быть установлены из скрипта.
https://simplight.ru/manual_next/rabota-s-kanalami/redaktor-virtualnykh-kanalov#:~:text=%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%B3%D1%80%D1%83%D0%BF%D0%BF)%20%D1%83%D0%B4%D0%B0%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F.-,%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D1%81%20%D0%BA%D0%B0%D0%BD%D0%B0%D0%BB%D0%B0%D0%BC%D0%B8,-%D0%94%D0%BB%D1%8F%20...
https://simplight.ru/manual_next/nastroyki-virtualnykh-kanalov/dobavlenie-skriptov-virtualnym-kanalam

Пример исходного кода скрипта:

https://pastebin.com/ZKrgErCD

Это все понятно. Что писать в полях Значения: Pie, Color?

Вам необходимо выбрать поле источника данных со значением канала для поля Pie. Поле Color может быть оставлено пустым.

Т. е.  Pie1 - А1, Pie2 - А2, Pie3 - А3

Для вывода текущих значений каналов вам требуется компонент TChannelSet. Пример заполнения полей ряда диаграммы:

Также укажите для бенда MasterData1 ваш источник данных. Открыть окно можно сделав двойной клик.

Что вы мне загадками отвечаете?! Я конкретный вопрос задал про каналы!

Каков вопрос таков ответ. Сформулируйте вашу задачу более конкретно, опишите сделанные вами шаги.

Бенд - это полоска на странице отчета. Предназначена для вывода записей источника данных. Записи выводятся добавлением объекта Текст на бенд с указанием внутри поля источника данных.

Сделайте нормальные примеры для редактора отчетов! 

Руководство на Fast Reports криво написано - только методом тыка разбираться!

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

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

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

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

Как еще написать?! Прочитайте сами свой ответ и попробуйте его понять!

"Наименование" и "Форматированное значение" это вообще к чему относится?!

Вы используете виртуальные каналы для хранения коэффициентов и наполняете их из скрипта? Вам требуются текущие значения вывести или записанные ранее в базу данных?

Мне нужно вывести соотношение разных выработок (потребления) мощности в балансе за день.

Решаю задачу следующим образом.

Накопленным итогом считаю по каждому каналу выработку.

Затем вычисляю разность двух значений за день. Эти данные попадут в каналы А1, А2, А3.

A = A1 + A2 + A3

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

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

Простите, вмешаюсь. Для меня тоже тема нужная.

Станислав, у вас затруднение в формировании отчета с элементом вставки диаграммы или в методе подготовки данных (скриптовая математика) к выводу в отчет, или то и другое? 

Что писать в настройках диаграммы? В мануале дан пример для базы данных, которой нет в SimpLight!

Я посмотрел ваш пример. У вас в источнике каналов 6 тегов, а на диаграмме только 3.

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

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

Слева находятся каналы, доступные для выбора, а справа выбранные каналы. Каждый выбранный канал будет соответствовать записи в источнике, а его полю – свойство канала.

У меня окно выбора каналов выглядит по-другому.Screenshot - 18.08.2021 , 10_50_25.png

Какая связь между страницами 7 и 8? Как теги привязываются к диаграмме?!

Один и тот же вопрос по кругу уже 4й раз задаю!

Вам нужно использовать Текущее значение каналов вместо истории каналов (THistorySet) (2 иконка вместо 3-ей) на вкладке Данные в панели инструментов слева от инспектора объектов. Теги к диаграмме не привязывается на прямую. В документе написано что через источник данных. Диаграмма работает только с источником данных. Связь между 7 и 8 страницей заключается в открытии предварительного просмотра отчета. На последнем скриншоте показан результат.
Проект к мануалу: Reporter test v 4.7.7.slz

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

На рассмотрении

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

Наши специалисты ответят Вам в порядке очереди. Ожидайте. Уточните какая версия СИМП установлена у Вас на данный момент (лайт, про, ент и цифры версии)?

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

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

Спасибо. 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

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

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

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

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

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

У меня шаблон отчета находится здесь:

d:\slProject\Reports\Templates\

Указал путь:  OpenReport('Templates\Energy1');

Скриншот ошибки во вложении.

Почему для Источник Истории Каналов (THistorySet) я могу выводить значения поканально,

а для Источник Каналов (TChannelSet) не могу. 

Чем они отличаются принципиально?

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


Возникает ошибка при нажатии кнопки:
23.08.2021 17:40:19.380 Invalid floating point operation - [Report_Energy_Create]

У вас в скрипте происходит деление на 0. Это вызывает ошибку времени выполнения.

Указал путь: OpenReport('Templates\Energy1');

В вашем проекте, который мы получили, путь до отчета указан верно. Папку Templates указывать не нужно.

Почему для Источник Истории Каналов (THistorySet) я могу выводить значения поканально,
а для Источник Каналов (TChannelSet) не могу.
Чем они отличаются принципиально?

   

   HistorySet выводит значения канала в определенный момент времени с определенным агрегатором в виде записей. В настройках компонента настраиваются конечные поля через указание канала, его свойства, агрегатора записей в поддиапазоне. В пределах поддиапазона, полученного делением диапазона на интревал, для полученных записей с диска(ssd) применяется агрегатор и выводится в запись источника данных соответствующую этому поддиапазону.

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

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

Что это за ошибка?

Ошибка системная. Подробнее опишите что делали при её получении.

Сервис поддержки клиентов работает на платформе UserEcho