Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: alan54 от 27 Декабря 2018, 14:36:39

Название: Как получить отчеты с выборкой по сменам (датам) работы персонала?
Отправлено: alan54 от 27 Декабря 2018, 14:36:39
Здравствуйте.
Персонал нашего производства работает в двухсменном режиме по 12 часов два через два дня (две бригады). Руководство желает видеть работу каждой бригады по отдельности. Как ввести в базу данных график работы бригад и сделать возможность формирования отчетов отдельно по датам работы каждой бригады? Например, берем период с 1 по 27 декабря и бригаду №1. Должна получиться выборка за 3,4,7,8,11,12,15,16,19,20,23,24,27 декабря.
Я хотел использовать компонент "Расписание", но он оперирует с периодами "День" и "Неделя", а тут нужен минимум "Месяц" или лучше "Год". Компонент "Календарь" тоже не подходит.
Жду Вашей подсказки.
Название: Re: Как получить отчеты с выборкой по сменам (датам) работы персонала?
Отправлено: Simple-Scada от 31 Декабря 2018, 07:44:22
Здравствуйте.

Извините за задержку с ответом. Сейчас такую задачу решить будет довольно сложно, например создавая множество источников в отчете в каждый из которых передавать свой интервал (начало / конец) времени выбирая дни в зависимости от месяца и номера смены. Задача довольно обширная, если учитывать все мелочи. Другое решение - создать свою таблицу в БД с нужной структурой и добавлять в неё записи через процедуру RunSQL. PЗатем эту таблицу отображать отчете без преобразований. Но если нужны сложные расчеты, то этот способ тоже плохо подходит. Лучшим решением была бы встроенная система для работы со сменами, но сейчас сложно сказать когда бы мы могли внедрить такую систему.
Название: Re: Как получить отчеты с выборкой по сменам (датам) работы персонала?
Отправлено: alan54 от 02 Января 2019, 14:51:21
Я решил проблему так. Сначала создал таблицу в БД schedule с двумя полями date и shift. Затем в проекте создал компонент "Таблица" tblSchedule с двумя столбцами, заполняемый из таблицы БД, для ее редактирования. Таймер в проекте ежедневно в начале смены находит в таблице БД schedule по текущей дате номер смены и записывает ее в переменную vrShift таблицы trends_data.
Сейчас интересует вопрос - можно ли как-то организовать поиск нужной даты в компоненте "Таблица" tblSchedule, а то она получилась большой (график на год)?   
И второй вопрос. Можно ли в отчете, формируемом из своей таблицы БД MySQL, использовать интервал и усреднение данных в его пределах, как при работе с "родными" таблицами Simple-Scada? Если да, то как?
Название: Re: Как получить отчеты с выборкой по сменам (датам) работы персонала?
Отправлено: alan54 от 09 Января 2019, 15:44:52
Я имел в виду не это. Меня интересует поиск не в таблице БД, а в компоненте "Таблица", чтобы не перебирать ее всю, а сразу выбрать  ячейку с нужной датой.
Название: Re: Как получить отчеты с выборкой по сменам (датам) работы персонала?
Отправлено: alan54 от 09 Января 2019, 18:25:48
Я хотел бы получить квалифицированный ответ от администратора, а не от новичка.
Название: Re: Как получить отчеты с выборкой по сменам (датам) работы персонала?
Отправлено: Simple-Scada от 10 Января 2019, 15:54:40
Можем подтвердить всё вышесказанное pan2000. В таблицах для поиска нужно использовать простой перебор, либо свои ускоренные способы поиска (как дихотомия, если строки в таблице отсортированы по дате\времени). При этом, любые способы поиска по компоненту Таблица будут многократно проигрывать в скорости прямой выборке нужных данных из таблицы БД, т.к. в БД при поиске используется индекс. Поэтому, вместо перебора по компоненту Таблица мы бы рекомендовали (если возможно) запрашивать конкретные нужные данные через отдельный SQL-запрос (процедура RunSQL, как писал выше pan2000), используя все преимущества СУБД. Результаты любого SQL-запроса можно обработать в скрипте с типом события "Выполнен SQL-запрос".

Цитировать
И второй вопрос. Можно ли в отчете, формируемом из своей таблицы БД MySQL, использовать интервал и усреднение данных в его пределах, как при работе с "родными" таблицами Simple-Scada? Если да, то как?
При работе с пользовательскими таблицами напрямую можно использовать только возможности языка запросов SQL, выполняя различные пользовательские выборки данных из таблицы БД. По умолчанию, когда Вы создаете пользовательский источник данных в отчете и указываете таблицу - в отчет выводятся все данные из этой таблицы, при помощи запроса вида:
Код
SELECT * FROM `my_db`.`my_table`
Можно изменить код запроса выбирая данные за определённую дату\время, получая минимальные (MIN), максимальные (MAX), усреднённые (AVG) и т.д. (https://www.dyclassroom.com/mysql/mysql-aggregate-functions-count-min-max-avg-and-sum) значения, группируя их и т.д.. Функция AVG возвратит обычное среднее значение, скада же для своих источников данных вычисляет средневзвешенное по времени.
Название: Re: Как получить отчеты с выборкой по сменам (датам) работы персонала?
Отправлено: alan54 от 10 Января 2019, 16:48:18
Спасибо за ответ, хотя и запоздалый. Но выходит, что ждал его зря, ничего нового, увы, я не узнал, а до всего, что советовал pan2000,  докопался сам. И выборки по сменам в отчетах сделал довольно просто. А хотел я собственно узнать, можно ли в компоненте "Таблица" как-то программно выбрать строку - результат SQL-запроса к таблице БД. Но похоже, что нельзя.
Название: Re: Как получить отчеты с выборкой по сменам (датам) работы персонала?
Отправлено: Simple_Scada от 11 Января 2019, 21:51:52
Цитировать
А хотел я собственно узнать, можно ли в компоненте "Таблица" как-то программно выбрать строку - результат SQL-запроса к таблице БД.
Да, нельзя, кроме как поиском по всей таблице. Если в компоненте "Таблица" отображается результат SQL-запроса, то правильнее всего просто выполнить ещё один уточняющий SQL-запрос к БД с нужной выборкой и как угодно его обработать, а не искать данные в компоненте "Таблица".