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

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

Автор Тема: Как получить отчеты с выборкой по сменам (датам) работы персонала?  (Прочитано 2527 раз)

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Здравствуйте.
Персонал нашего производства работает в двухсменном режиме по 12 часов два через два дня (две бригады). Руководство желает видеть работу каждой бригады по отдельности. Как ввести в базу данных график работы бригад и сделать возможность формирования отчетов отдельно по датам работы каждой бригады? Например, берем период с 1 по 27 декабря и бригаду №1. Должна получиться выборка за 3,4,7,8,11,12,15,16,19,20,23,24,27 декабря.
Я хотел использовать компонент "Расписание", но он оперирует с периодами "День" и "Неделя", а тут нужен минимум "Месяц" или лучше "Год". Компонент "Календарь" тоже не подходит.
Жду Вашей подсказки.
« Изменён: 27 Декабря 2018, 14:41:05 от alan54 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3009
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.

Извините за задержку с ответом. Сейчас такую задачу решить будет довольно сложно, например создавая множество источников в отчете в каждый из которых передавать свой интервал (начало / конец) времени выбирая дни в зависимости от месяца и номера смены. Задача довольно обширная, если учитывать все мелочи. Другое решение - создать свою таблицу в БД с нужной структурой и добавлять в неё записи через процедуру RunSQL. PЗатем эту таблицу отображать отчете без преобразований. Но если нужны сложные расчеты, то этот способ тоже плохо подходит. Лучшим решением была бы встроенная система для работы со сменами, но сейчас сложно сказать когда бы мы могли внедрить такую систему.

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Я решил проблему так. Сначала создал таблицу в БД schedule с двумя полями date и shift. Затем в проекте создал компонент "Таблица" tblSchedule с двумя столбцами, заполняемый из таблицы БД, для ее редактирования. Таймер в проекте ежедневно в начале смены находит в таблице БД schedule по текущей дате номер смены и записывает ее в переменную vrShift таблицы trends_data.
Сейчас интересует вопрос - можно ли как-то организовать поиск нужной даты в компоненте "Таблица" tblSchedule, а то она получилась большой (график на год)?   
И второй вопрос. Можно ли в отчете, формируемом из своей таблицы БД MySQL, использовать интервал и усреднение данных в его пределах, как при работе с "родными" таблицами Simple-Scada? Если да, то как?
« Изменён: 07 Января 2019, 09:25:37 от alan54 »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Я имел в виду не это. Меня интересует поиск не в таблице БД, а в компоненте "Таблица", чтобы не перебирать ее всю, а сразу выбрать  ячейку с нужной датой.

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Я хотел бы получить квалифицированный ответ от администратора, а не от новичка.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3009
    • Просмотр профиля
    • Simple-Scada
Можем подтвердить всё вышесказанное pan2000. В таблицах для поиска нужно использовать простой перебор, либо свои ускоренные способы поиска (как дихотомия, если строки в таблице отсортированы по дате\времени). При этом, любые способы поиска по компоненту Таблица будут многократно проигрывать в скорости прямой выборке нужных данных из таблицы БД, т.к. в БД при поиске используется индекс. Поэтому, вместо перебора по компоненту Таблица мы бы рекомендовали (если возможно) запрашивать конкретные нужные данные через отдельный SQL-запрос (процедура RunSQL, как писал выше pan2000), используя все преимущества СУБД. Результаты любого SQL-запроса можно обработать в скрипте с типом события "Выполнен SQL-запрос".

Цитировать
И второй вопрос. Можно ли в отчете, формируемом из своей таблицы БД MySQL, использовать интервал и усреднение данных в его пределах, как при работе с "родными" таблицами Simple-Scada? Если да, то как?
При работе с пользовательскими таблицами напрямую можно использовать только возможности языка запросов SQL, выполняя различные пользовательские выборки данных из таблицы БД. По умолчанию, когда Вы создаете пользовательский источник данных в отчете и указываете таблицу - в отчет выводятся все данные из этой таблицы, при помощи запроса вида:
Код
SELECT * FROM `my_db`.`my_table`
Можно изменить код запроса выбирая данные за определённую дату\время, получая минимальные (MIN), максимальные (MAX), усреднённые (AVG) и т.д. значения, группируя их и т.д.. Функция AVG возвратит обычное среднее значение, скада же для своих источников данных вычисляет средневзвешенное по времени.
« Изменён: 10 Января 2019, 16:06:48 от Simple-Scada »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Спасибо за ответ, хотя и запоздалый. Но выходит, что ждал его зря, ничего нового, увы, я не узнал, а до всего, что советовал pan2000,  докопался сам. И выборки по сменам в отчетах сделал довольно просто. А хотел я собственно узнать, можно ли в компоненте "Таблица" как-то программно выбрать строку - результат SQL-запроса к таблице БД. Но похоже, что нельзя.
« Изменён: 10 Января 2019, 22:45:48 от alan54 »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1209
    • Просмотр профиля
Цитировать
А хотел я собственно узнать, можно ли в компоненте "Таблица" как-то программно выбрать строку - результат SQL-запроса к таблице БД.
Да, нельзя, кроме как поиском по всей таблице. Если в компоненте "Таблица" отображается результат SQL-запроса, то правильнее всего просто выполнить ещё один уточняющий SQL-запрос к БД с нужной выборкой и как угодно его обработать, а не искать данные в компоненте "Таблица".