Неофициальный форум пользователей Qlik Sense & Qlikview

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: SC7793 от 20 октября 2018, 03:48:43

Название: Работа с календарем (рабочие и праздничные дни)
Отправлено: SC7793 от 20 октября 2018, 03:48:43
Добрый день. Подскажите пожалуйста, как реализовать данную задачу: необходимо рассчитать количество рабочих дней в промежутке двух дат (функция networkdays - не подходит для нас, нужно как-то стыковать с календарём).

В моём приложении дата начала=13.01.2017, дата завершения 18.01.2017
Информация по датам (начала и завершения) находится в двух разных таблицах, к каждой из этих таблиц я подтянул производственный календарь (для "Даты начала" это "Ref_Сalendar1", для "Даты окончания" это "Ref_Сalendar2" (возможно и не нужно две таблицы с календарём...) ).
Выходные дни в таблицах Ref_Сalendar в поле Id_status имеют значение "15" (выделил желтым на скриншоте), рабочие дни ="14".
Можно ли как-то посчитать корректно количество рабочих дней с 13.01 по 18.01

Заранее благодарю за решение.
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: Chernov от 22 октября 2018, 02:30:46
Так считаем выходные дни:
= COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"15"} >} Ref_Calendar1_Id)
Так считаем рабочие дни:
= COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"} >} Ref_Calendar1_Id)

Дату начала и дату окончания сделайте в переменных
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: SC7793 от 22 октября 2018, 07:18:54
Да, это работает без выбора фильтров, считает кол-во вых. и раб.дней за весь месяц (скрин_01)
Но, не совсем понятно как сделать, чтобы это работало при выборе фильтров (скрин_02) ???
В моём случае нужен 1 календарь ? или 2 ? 
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: admin от 22 октября 2018, 07:28:39
Привет, даты завершения и начала выбираете в разных измерениях?
Зачем?
Сделайте одно измерение Дата и выбирайте в нем.
Иначе у вас выберутся только две даты для всей модели данных.
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: SC7793 от 22 октября 2018, 07:31:15
Привет.
Логику понял.
Но не знаю как реализовать, сможете подсказать?
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: Chernov от 22 октября 2018, 07:34:05
Цитата: SC7793 от 22 октября  2018, 07:18:54  
Да, это работает без выбора фильтров, считает кол-во вых. и раб.дней за весь месяц (скрин_01)
Но, не совсем понятно как сделать, чтобы это работало при выборе фильтров (скрин_02) ???
В моём случае нужен 1 календарь ? или 2 ?
Можете использовать 1, можете два, как угодно в принципе.. но я бы сделал 1.

COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"}, bd_proc_step_pos_sp.dsdt_finish_date_perf3 = {">=$(=MIN(bd_proc_step_sp.dsdt_start_date3)<=$(=MAX(bd_proc_step_sp.dsdt_finish_date3)) "} >} Ref_Calendar1_Id)
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: SC7793 от 22 октября 2018, 07:44:36

Можете использовать 1, можете два, как угодно в принципе.. но я бы сделал 1.

COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"}, bd_proc_step_pos_sp.dsdt_finish_date_perf3 = {">=$(=MIN(bd_proc_step_sp.dsdt_start_date3)<=$(=MAX(bd_proc_step_sp.dsdt_finish_date3)) "} >} Ref_Calendar1_Id)
[/quote]

Почему то. этот скрипт у меня не отрабатывает (и с фильтрами и без), может я что-то делаю не так (скрин_03) ?
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: Chernov от 22 октября 2018, 08:41:46
Цитата: SC7793 от 22 октября  2018, 07:44:36  

Можете использовать 1, можете два, как угодно в принципе.. но я бы сделал 1.

COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"}, bd_proc_step_pos_sp.dsdt_finish_date_perf3 = {">=$(=MIN(bd_proc_step_sp.dsdt_start_date3)<=$(=MAX(bd_proc_step_sp.dsdt_finish_date3)) "} >} Ref_Calendar1_Id)

Почему то. этот скрипт у меня не отрабатывает (и с фильтрами и без), может я что-то делаю не так (скрин_03) ?
[/quote]
Проверьте по отдельности :
$(=MIN(bd_proc_step_sp.dsdt_start_date3)
$(=MAX(bd_proc_step_sp.dsdt_finish_date3))
и что вот в этом поле лежит ?: bd_proc_step_pos_sp.dsdt_finish_date_perf3 , может его нужно заменить на это bd_proc_step_sp.dsdt_start_date3 или это bd_proc_step_sp.dsdt_finish_date3
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: SC7793 от 22 октября 2018, 09:12:06
Цитата: Chernov от 22 октября  2018, 08:41:46  
Цитата: SC7793 от 22 октября  2018, 07:44:36  

Можете использовать 1, можете два, как угодно в принципе.. но я бы сделал 1.

COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"}, bd_proc_step_pos_sp.dsdt_finish_date_perf3 = {">=$(=MIN(bd_proc_step_sp.dsdt_start_date3)<=$(=MAX(bd_proc_step_sp.dsdt_finish_date3)) "} >} Ref_Calendar1_Id)

Почему то. этот скрипт у меня не отрабатывает (и с фильтрами и без), может я что-то делаю не так (скрин_03) ?
Проверьте по отдельности :
$(=MIN(bd_proc_step_sp.dsdt_start_date3)
$(=MAX(bd_proc_step_sp.dsdt_finish_date3))
и что вот в этом поле лежит ?: bd_proc_step_pos_sp.dsdt_finish_date_perf3 , может его нужно заменить на это bd_proc_step_sp.dsdt_start_date3 или это bd_proc_step_sp.dsdt_finish_date3
[/quote]


Проверил по отдельности, результат не считает. :(
bd_proc_step_pos_sp.dsdt_finish_date_perf3 - это дата завершения задачи
bd_proc_step_sp.dsdt_start_date3 - дата начала задачи

Вообще нужно чтобы при выборе этапа, был результат по кол-ву затраченных рабочих дней на задачу (скрин_04).
Может нужно думать в направлении одного календаря на обе даты. У меня сейчас два календаря на каждую из дат (нач. и заверш.) по отдельности (скрин_05)?
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: SC7793 от 23 октября 2018, 08:49:08
Всем привет.
Немного упростил пример (вопрос.zip)
Может быть так сможете помочь. Буду очень благодарен за подсказку.

Вкратце опишу вопрос. Необходимо при выборе фильтра name (Задача), получать корректное значение по срокам выполнения задачи, а именно срок выполнения задачи в рабочих днях.
В примере при выборе фильтра  "задача1", которая имеет start_date = 13.01.2017 и finish_date = 18.01.2017. Необходимо рассчитать разница между этими датами с учётом выходных дней.
Таблица"Calendar" имеет 2 поля, Data и Id_status (значение поля =0 - это выходные; 1- рабочие дни).

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

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


Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: admin от 23 октября 2018, 03:38:00
Привет.
Хорошим решением будет использование интервалов.
Т.е. У вас есть Дата календарная, та по которой живем. Есть даты начала события и конца события (задачи).
Все условия для использования IntervalMatch()
На оф.сайте в справке есть пример.
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: SC7793 от 23 октября 2018, 03:41:37
Цитата: admin от 23 октября  2018, 03:38:00  
Привет.
Хорошим решением будет использование интервалов.
Т.е. У вас есть Дата календарная, та по которой живем. Есть даты начала события и конца события (задачи).
Все условия для использования IntervalMatch()
На оф.сайте в справке есть пример.

Ок, спасибо. Посмотрю что с этим можно сделать.
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: Chernov от 30 октября 2018, 08:13:17
ответил на комьюнити : https://community.qlik.com/message/1564984?et=watches.email.thread#1564984
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: Валерий от 30 октября 2018, 09:29:06
Привет! А вариант создания доп таблицы с выходными днями на весь год не рассматриваете?
Джойните её при загрузке данных с доп полем "hollyday" к основной таблице, далее играесь фильтрами в приложении.

Один из плюсов - вы можете сами создавать нестандартные выходные или рабочие дни.
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: SC7793 от 30 октября 2018, 06:50:46
Цитата: Валерий от 30 октября  2018, 09:29:06  
Привет! А вариант создания доп таблицы с выходными днями на весь год не рассматриваете?
Джойните её при загрузке данных с доп полем "hollyday" к основной таблице, далее играесь фильтрами в приложении.

Один из плюсов - вы можете сами создавать нестандартные выходные или рабочие дни.

Валерий, приветствую.
У меня в примере как раз создана отдельная таблица с производственным календарём. (календарь.JPG).
Не представляю как можно осн. табл. объединить с календарём по доп полю "hollyday"?  (нет схожих полей в двух таблицах)
Если у вас есть своё решение, не откажусь на него посмотреть :)

осн.таблица в таком формате: 
id                              start_date     finish_date     name
0800071387eb6870   13.01.2017   18.01.2017   задача1
0800071387eb6871   14.01.2017   21.01.2017   задача2


Ранее были опробованы варианты других участников обсуждения.
Корректные результаты показала функция IntervalMatch(), НО есть в этом также минус, если много данных, Qlik не справляется, я так понимаю что каждой задачи присваивает интервал и слишком много записей в таблице получается.
+ тоже корректные данные показывает вариант Станислава (без объединения таблиц) = SUM ( { < Data = {">=$(=min(start_date))<=$(=max(finish_date))"} > }  Id_status), но для меня это не совсем подходит, данные отражаются в том случае если выбран фильтр с задачами. Для меня идеальным вариантом было бы -  подсчёт и с фильтрами и без выбора фильтров, это на 100% подходит мне (без фильтров.JPG), (с фильтрами.JPG).
Название: Re: Работа с календарем (рабочие и праздничные дни)
Отправлено: Валерий от 31 октября 2018, 03:29:06
Я понял... Не обратил внимание, что дни заданы интервалами....
Но если следовать вашей логике и отображать в доп файле "1" выходные дни, а "0" рабочие, то напрашивается формула:К-во рабочих дней = Count({интервал}Id_status) - Сумма({интервал}Id_status).
Вото только вопрос как перенести в интервалы переменные...