Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Как вывести в отчет интервалы времени?  (Прочитано 11208 раз)

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Не могу сообразить сам, подскажите, пожалуйста - как вывести в отчет интервалы времени между определенными событиями, например, выходами готовых щитов (см. вложение)?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет интервалы времени?
« Ответ #1 : 28 Ноября 2018, 11:00:08 »
Здравствуйте.
Извините за задержку с ответом. Т.е. нужно вывести время прошедшее между временем предыдущей строки и временем текущей строки? Для этого можно в бэнде данных разместить компонент Текст, дважды кликнуть его для редактирования и использовать следующее выражение:
Код: (c#)
{DateDiff(Данные.Время, (System.DateTime)Previous(Данные, "Время"))}
Данный код получает разницу во времени между текущей и предыдущей строкой. Также не забудьте выставить у компонента Текст формат "Время". Для этого кликните его ПКМ и выберите пункт "Формат".
« Изменён: 28 Ноября 2018, 11:01:12 от Simple-Scada »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет интервалы времени?
« Ответ #2 : 28 Ноября 2018, 11:26:02 »
Все понятно, я не знал функцию system.datetime. Большое спасибо!

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет интервалы времени?
« Ответ #3 : 28 Ноября 2018, 11:33:56 »
Это явное приведение к типу данных DateTime. Дело в том, что функция Previous возвращает указатель на объект предыдущей строки, без определённого типа данных. А функция DateDiff работает только с типами DateTime. Поэтому мы должны явно указывать тип данных и вместо "Previous(Данные, "Время")" писать "(System.DateTime)Previous(Данные, "Время")"

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет интервалы времени?
« Ответ #4 : 28 Ноября 2018, 12:39:46 »
Наберусь наглости и задам еще вопрос: как написать условие для выделения ячейки отчета цветом, если значение разности времен больше 5 минут?  Пытаюсь написать Minute(полученное_выражение_ в_ячейке) > 5 - ругается...

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет интервалы времени?
« Ответ #5 : 28 Ноября 2018, 13:56:49 »
Нашел, вроде надо так:
РазницаВоВремени.Minutes > 5

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет интервалы времени?
« Ответ #6 : 28 Ноября 2018, 14:45:15 »
Результатом функции DateDiff является структура TimeSpan. Обращаясь к свойствам этой структуры, можно получить различные значения. Свойство Minutes для Вашей задачи не подходит и нужно использовать TotalMinutes:
Код
РазницаВоВремени.TotalMinutes > 5

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет интервалы времени?
« Ответ #7 : 28 Ноября 2018, 18:01:07 »
Очень Вам благодарен за оказанную помощь!

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет интервалы времени?
« Ответ #8 : 29 Ноября 2018, 18:16:30 »
Дальше опять зашел в тупик. В итоге отчета надо просуммировать интервалы более 5 минут. Написал такую формулу, пока без условия (просуммировать все):
{SumTime(Источник_1.ВремяМеждуВыходомЩитов)}
Почему-то выдает 00:00:00, хотя в колонке полно ненулевых значений.
« Изменён: 29 Ноября 2018, 21:25:17 от alan54 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет интервалы времени?
« Ответ #9 : 29 Ноября 2018, 23:32:47 »
Как мы поняли, "Источник_1.ВремяМеждуВыходомЩитов" у Вас - это рассчитываемая колонка с типом данных TimeSpan? Из-за особенностей при взятии значения из рассчитываемых колонок источника данных, проще всего суммировать время следующим способом:
  • размещаем объект текст в бэнде Итог отчета;
  • выставляем формат "Время";
  • дважды кликаем компонент и задаём выражение: {SumTime(DateDiff(Данные.Время, (System.DateTime)Previous(Данные, "Время")))}
Теперь в нём будет выводиться суммарное время для всех строк. Но если нужны условия (суммировать только интервалы больше 5 минут), то придется использовать более сложный способ:
  • переходим на вкладку "Словарь" и в разделе "Переменные" создаём новую переменную с типом TimeSpan и значением "0:00:00". Назовём её vrTotalTime;
  • в бэнде данных на странице отчета выделяем ячейку в которую выводится значение "Источник_1.ВремяМеждуВыходомЩитов";
  • переходим на вкладку "Свойства" -> "События" (кнопка с иконкой молнии);
  • на событие "После печати" назначаем следующий код:
Код: (c#)
if (!PreviousIsNull(Источник_1, "Время")){
  TimeSpan aTime = Источник_1.ВремяМеждуВыходомЩитов;
  if (aTime.TotalMinutes > 5)
    vrTotalTime += aTime;
}
Теперь при построении отчета в переменную vrTotalTime будут просуммированы все интервалы "Источник_1.ВремяМеждуВыходомЩитов" с значениями более 5 минут. Значение переменной vrTotalTime можно вынести в любое место отчета.
« Изменён: 29 Ноября 2018, 23:33:57 от Simple-Scada »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет интервалы времени?
« Ответ #10 : 30 Ноября 2018, 07:07:32 »
Большое спасибо за подробные разъяснения! Что бы я без Вас делал...
« Изменён: 30 Ноября 2018, 07:22:53 от alan54 »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет интервалы времени?
« Ответ #11 : 07 Декабря 2018, 17:34:03 »
...Значение переменной vrTotalTime можно вынести в любое место отчета.
А можно ли значение переменной vrTotalTime экспортировать из отчета в архив базы данных, чтобы затем использовать ее для построения другого отчета? Если да, то каким образом?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет интервалы времени?
« Ответ #12 : 07 Декабря 2018, 23:25:33 »
Такой возможности нет.

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет интервалы времени?
« Ответ #13 : 08 Декабря 2018, 08:31:08 »
Тогда подскажите пожалуйста, как создать такую вычисляемую переменную в скрипте проекта, чтобы затем вывести ее в другой отчет, точнее, диаграмму? Нужно ли создавать отдельную таблицу в БД, куда писать дату-время и сам параметр (количество выпущенных щитов) для каждого его изменения, или их можно как то вытащить из существующих таблиц для трендов и отчетов? 
« Изменён: 08 Декабря 2018, 08:32:15 от alan54 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет интервалы времени?
« Ответ #14 : 09 Декабря 2018, 10:42:37 »
Создать свою таблицу и записывать в неё можно. Вывести данные в отчет затем можно как описано в этой статье.
Если у переменной включена архивация, то можно брать данные из стандартных таблиц. Этот вариант обычно проще. Когда Вы создаёте в отчете источник данных с типом "Периодический", или "По-изменению", то этот источник будет работать именно со стандартными архивными данными. Пример вывода трендов в отчет (в компонент Диаграмма) описан здесь.
« Изменён: 09 Декабря 2018, 10:43:44 от Simple-Scada »