Можно сделать так:
{((double)S._163_Vo_Tp3 == 0) | ((double)Previous(S, "_163_Vo_Tp3") == 0) ? "0": Round((double)S._163_Vo_Tp3 - (double)Previous(S, "_163_Vo_Tp3"), 1)} где S._163_V0_Tp3 - интегральное значение счётчика на конец интервала.
Previous(S._163_V0_Tp3) - интегральное значение счётчика на конец предыдущего интервала.
так как возможно, что при делении на интервалы может выпасть нулевое значение (например по каким то причинам записался 0) то делается проверка. Если одно из значений равно 0 то выводится 0 иначе выводится разность:
Round((double)S._163_Vo_Tp3 - (double)Previous(S, "_163_Vo_Tp3"), 1)
, где Round - округление до 1 знака после ","
Для итоговой строки можно использовать конструкцию
{Round((double)LastIf(S._163_Vo_Tp3) - (double)FirstIf(S._163_Vo_Tp3), 1)}
Nikso
огромное спасибо, получилось.
Вопрос только как быть с первым значением, которое получается пустым, ведь для первой строки не существует предыдущего значения?
Я пока сделал так:
{PreviousIsNull(Данные,"gp201_TC_M2")
? Данные.gp201_TC_M2 - (double)First(Данные.gp201_TC_M2)
: Данные.gp201_TC_M2 - (double)Previous(Данные,"gp201_TC_M2")}
но все равно первая строка выводится пустая
Миханик, я сейчас как раз в своём проекте реализую отчёт по приборам учёта и тоже столкнулся с появлением нулевых значений при попытке взять первое значение за интервал.
Попробуйте решить следующим образом:
{Format("{0:N2}",IIF(Данные.gp201_TC_M2 == 0,Previous(Данные,"gp201_TC_M2"),Данные.gp201_TC_M2))}
Это конечно не исключает того, что в первый интервал выпадет 0 и предыдущее опять же не будет существовать. Но зато не нужно минусовать 1 час, при котором добавится лишняя строка в начале.
Сделать это можно следующим способом:
1. У самого бэнда данных "DataДанные" и каждого вложенного в него компонента (в Вашем отчете это компоненты "DataДанные_Время", "Text29", "Text27", "DataДанные_gp201_TC_T1" и так далее) установить свойство "Может сжиматься" в значение "Да".
2. Также для каждого вложенного компонента на событие "Взять значение" присвоить следующий код:
if (Line == 1) {
e.Value = "";
} else {
(sender as StiText).CanShrink = false;
} Это позволит исключить первую строку при печати отчета, но оставит её в расчетах.
Здравствуйте.
Вы написали в очень старой теме. В системе отчетов для периодических источников уже давно имеются различные типы обработки (https://simple-scada.com/help/report/periodicsourcework.html), в том числе и "разница (https://simple-scada.com/help/report/periodicsourcework.html#:~:text=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%BC%20%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%BC%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%B2%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%BC%20%D0%B2%20%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB.)". Т.е., сейчас для получения разницы можно просто задать соответствующий тип обработки (https://simple-scada.com/help/report/addvarper.html#:~:text=%D0%95%D1%81%D0%BB%D0%B8%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D0%B2%20%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D1%82%D0%B8%D0%BF%D0%B0%20%22%D0%9F%D0%B5%D1%80%D0%B8%D0%BE%D0%B4%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%22%2C%20%D1%82%D0%BE%20%D0%BE%D0%BA%D0%BD%D0%BE%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B1%D1%83%D0%B4%D0%B5%D1%82%20%D0%B2%D1%8B%D0%B3%D0%BB%D1%8F%D0%B4%D0%B5%D1%82%D1%8C%20%D1%82%D0%B0%D0%BA%3A) для требуемой колонки, без использования скриптов. Рекомендуем обновиться до актуальной версии и использовать готовые типы обработки в отчете.
А как сделать тоже самое с последней стройкой, если число строк неизвестно?
Можно использовать следующий код:
if (Line == cCount(Данные)) {
e.Value = "";
} else {
(sender as StiText).CanShrink = false;
} , где "Данные" – имя источника данных (https://clck.ru/3SqBrf).