Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
petrushkinandre
Contributor
Contributor

Работа с календарем (рабочие и праздничные дни)

Привет.
Предложите пож-та решение проблемы.

Вкратце опишу вопрос. Необходимо при выборе фильтра name (Задача), получать корректное значение по срокам выполнения задачи, а именно срок выполнения задачи в рабочих днях.

В примере при выборе фильтра  "задача1", которая имеет start_date = 13.01.2017 и finish_date = 18.01.2017. Необходимо рассчитать разница между этими датами с учётом выходных дней.

Таблица"Calendar" имеет 2 поля, Data и Id_status (значение поля =0 - это выходные; 1- рабочие дни).

Во вложении скрины + архив с файлов приложения *.qvf и таблица в *.xlsx

Заранее благодарен.


10 Replies
andrey_krylov
Specialist
Specialist

Добрый день, Андрей. Попробуй использовать для этого networkdays (start_date, finish_date)

https://help.qlik.com

petrushkinandre
Contributor
Contributor
Author

Андрей, добрый день. Спасибо за ответ.

Пробовал данную функцию. Есть у неё один минус, если start_date = дата выходного, то расчёт получается некорректный (по крайней мере у меня так вышло). В связи с этим, мне это не походит.

Нужно всё же как-то пробовать привязать производственный календарь к датам start и finish.

Так же пробовал с помощью функции IntervalMatch(). НО, есть  в этом также минус, если много данных, Qlik не справляется, я так понимаю что каждой задачи присваивает интервал и слишком много записей в таблице получается.

Chernov
Creator
Creator

При варианте из вашего примера, формула такая получится.

= SUM ( { < Data = {">=$(=min(start_date))<=$(=max(finish_date))"} > }  Id_status)

Если использовать в таблице, добавьте агрегирование или по названию или по ID (но ID у вас не совпадают в примере)

= SUM ( AGGR (

     SUM ( { < Data = {">=$(=min(start_date))<=$(=max(finish_date))"} > }  Id_status)

     , name) )

andrey_krylov
Specialist
Specialist

Как вариант, проставить флаги в календаре для рабочих и не рабочих дней если нужно включить какие-то праздники или использовать определенный производственный календарь и в set analysis отфильтровать

Count({< Флаг = {1} >} DISTINCT Дата)

или еще как-то попробовать

Count(DISTINCT If(not Match(WeekDay(Дата), 'Сб', 'Вс') and not Match(Дата, $(=СписокДатДляИсключения)), Дата))

или тоже самое в set analysis

Count({< ДеньНедели -={'Сб', 'Вс'}, Дата -= {"$(=СписокДатДляИсключения)"} >} DISTINCT Дата)

andrey_krylov
Specialist
Specialist

Еще момент,  Андрей, под рукой нет QS и посмотреть файл нет возможности. По сему ответ Станислава может быть куда более осмысленным.

petrushkinandre
Contributor
Contributor
Author

Станислав, Андрей, благодарю за ответ.

По варианту Станислава  расчёт рабочих дней происходит корректно при выборе фильтра "Задача1" или "Задача2" . см.скрины

А как сделать, чтобы мера в таблице вела подсчёт по количеству рабочих дней и без выбора фильтров "Задача1" или "Задача2"???

без фильтров.JPGс фильтрами.JPG

Chernov
Creator
Creator

Попробуйте так, специально на куски разбил для удобочитаемости

=

     SUM ( { < Data = {"

>=

$(=aggr(min(start_date)),name)

<=

$(=aggr(max(finish_date)),name)

"} > }  Id_status)

petrushkinandre
Contributor
Contributor
Author

Станислав, такой вариант и с фильтрами и без них показывает "0"

3.JPG

SergeyNazarkin
Contributor II
Contributor II

Решал подобную задачу сделав предрасчет при загрузке в скрипте

NetWorkDays(<Дата начала>, <Дата окончания>, $(vHolidays)) as WorkDays

Список праздничных дней брал отсюда

https://data.gov.ru/opendata/7708660670-proizvcalendar