Добрый день. Подскажите пожалуйста, как реализовать данную задачу: необходимо рассчитать количество рабочих дней в промежутке двух дат (функция networkdays - не подходит для нас, нужно как-то стыковать с календарём).
В моём приложении дата начала=13.01.2017, дата завершения 18.01.2017
Информация по датам (начала и завершения) находится в двух разных таблицах, к каждой из этих таблиц я подтянул производственный календарь (для "Даты начала" это "Ref_Сalendar1", для "Даты окончания" это "Ref_Сalendar2" (возможно и не нужно две таблицы с календарём...) ).
Выходные дни в таблицах Ref_Сalendar в поле Id_status имеют значение "15" (выделил желтым на скриншоте), рабочие дни ="14".
Можно ли как-то посчитать корректно количество рабочих дней с 13.01 по 18.01
Заранее благодарю за решение.
Так считаем выходные дни:
= COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"15"} >} Ref_Calendar1_Id)
Так считаем рабочие дни:
= COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"} >} Ref_Calendar1_Id)
Дату начала и дату окончания сделайте в переменных
Да, это работает без выбора фильтров, считает кол-во вых. и раб.дней за весь месяц (скрин_01)
Но, не совсем понятно как сделать, чтобы это работало при выборе фильтров (скрин_02) ???
В моём случае нужен 1 календарь ? или 2 ?
Привет, даты завершения и начала выбираете в разных измерениях?
Зачем?
Сделайте одно измерение Дата и выбирайте в нем.
Иначе у вас выберутся только две даты для всей модели данных.
Привет.
Логику понял.
Но не знаю как реализовать, сможете подсказать?
Цитата: 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)
Можете использовать 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) ?
Цитата: 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
Цитата: 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)?
Всем привет.
Немного упростил пример (вопрос.zip)
Может быть так сможете помочь. Буду очень благодарен за подсказку.
Вкратце опишу вопрос. Необходимо при выборе фильтра name (Задача), получать корректное значение по срокам выполнения задачи, а именно срок выполнения задачи в рабочих днях.
В примере при выборе фильтра "задача1", которая имеет start_date = 13.01.2017 и finish_date = 18.01.2017. Необходимо рассчитать разница между этими датами с учётом выходных дней.
Таблица"Calendar" имеет 2 поля, Data и Id_status (значение поля =0 - это выходные; 1- рабочие дни).
Во вложении скрины + архив с файлов приложения *.qvf и таблица в *.xlsx
Заранее благодарен.
Привет.
Хорошим решением будет использование интервалов.
Т.е. У вас есть Дата календарная, та по которой живем. Есть даты начала события и конца события (задачи).
Все условия для использования IntervalMatch()
На оф.сайте в справке есть пример.
Цитата: admin от 23 октября 2018, 03:38:00
Привет.
Хорошим решением будет использование интервалов.
Т.е. У вас есть Дата календарная, та по которой живем. Есть даты начала события и конца события (задачи).
Все условия для использования IntervalMatch()
На оф.сайте в справке есть пример.
Ок, спасибо. Посмотрю что с этим можно сделать.
ответил на комьюнити : https://community.qlik.com/message/1564984?et=watches.email.thread#1564984
Привет! А вариант создания доп таблицы с выходными днями на весь год не рассматриваете?
Джойните её при загрузке данных с доп полем "hollyday" к основной таблице, далее играесь фильтрами в приложении.
Один из плюсов - вы можете сами создавать нестандартные выходные или рабочие дни.
Цитата: Валерий от 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).
Я понял... Не обратил внимание, что дни заданы интервалами....
Но если следовать вашей логике и отображать в доп файле "1" выходные дни, а "0" рабочие, то напрашивается формула:К-во рабочих дней = Count({интервал}Id_status) - Сумма({интервал}Id_status).
Вото только вопрос как перенести в интервалы переменные...