Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Ноябрь 17, 2018, 01:36:38 pm

Автор Тема: Работа с календарем (рабочие и праздничные дни)  (Прочитано 591 раз)

Оффлайн SC7793

  • Новичок
  • *
  • Сообщений: 16
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Добрый день. Подскажите пожалуйста, как реализовать данную задачу: необходимо рассчитать количество рабочих дней в промежутке двух дат (функция networkdays - не подходит для нас, нужно как-то стыковать с календарём).

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

Заранее благодарю за решение.

Оффлайн Chernov

  • Новичок
  • *
  • Сообщений: 21
  • Рейтинг: +5/-0
  • QV. Developer & Designer
    • Просмотр профиля
    • Личный блог
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #1 : Октябрь 22, 2018, 02:30:46 am »
Так считаем выходные дни:
= COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"15"} >} Ref_Calendar1_Id)
Так считаем рабочие дни:
= COUNT ( DISTINCT {< Ref_Calendar1_Id_status = {"14"} >} Ref_Calendar1_Id)

Дату начала и дату окончания сделайте в переменных

Оффлайн SC7793

  • Новичок
  • *
  • Сообщений: 16
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #2 : Октябрь 22, 2018, 07:18:54 am »
Да, это работает без выбора фильтров, считает кол-во вых. и раб.дней за весь месяц (скрин_01)
Но, не совсем понятно как сделать, чтобы это работало при выборе фильтров (скрин_02) ???
В моём случае нужен 1 календарь ? или 2 ? 

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


Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1215
  • Страна: ru
  • Рейтинг: +129/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #3 : Октябрь 22, 2018, 07:28:39 am »
Привет, даты завершения и начала выбираете в разных измерениях?
Зачем?
Сделайте одно измерение Дата и выбирайте в нем.
Иначе у вас выберутся только две даты для всей модели данных.

Оффлайн SC7793

  • Новичок
  • *
  • Сообщений: 16
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #4 : Октябрь 22, 2018, 07:31:15 am »
Привет.
Логику понял.
Но не знаю как реализовать, сможете подсказать?

Оффлайн Chernov

  • Новичок
  • *
  • Сообщений: 21
  • Рейтинг: +5/-0
  • QV. Developer & Designer
    • Просмотр профиля
    • Личный блог
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #5 : Октябрь 22, 2018, 07:34:05 am »
Да, это работает без выбора фильтров, считает кол-во вых. и раб.дней за весь месяц (скрин_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)

Оффлайн SC7793

  • Новичок
  • *
  • Сообщений: 16
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #6 : Октябрь 22, 2018, 07:44:36 am »

Можете использовать 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) ?

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


Оффлайн Chernov

  • Новичок
  • *
  • Сообщений: 21
  • Рейтинг: +5/-0
  • QV. Developer & Designer
    • Просмотр профиля
    • Личный блог
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #7 : Октябрь 22, 2018, 08:41:46 am »

Можете использовать 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

Оффлайн SC7793

  • Новичок
  • *
  • Сообщений: 16
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #8 : Октябрь 22, 2018, 09:12:06 am »

Можете использовать 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)?

Оффлайн SC7793

  • Новичок
  • *
  • Сообщений: 16
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #9 : Октябрь 23, 2018, 08:49:08 am »
Всем привет.
Немного упростил пример (вопрос.zip)
Может быть так сможете помочь. Буду очень благодарен за подсказку.

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

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

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



Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1215
  • Страна: ru
  • Рейтинг: +129/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #10 : Октябрь 23, 2018, 03:38:00 pm »
Привет.
Хорошим решением будет использование интервалов.
Т.е. У вас есть Дата календарная, та по которой живем. Есть даты начала события и конца события (задачи).
Все условия для использования IntervalMatch()
На оф.сайте в справке есть пример.

Оффлайн SC7793

  • Новичок
  • *
  • Сообщений: 16
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #11 : Октябрь 23, 2018, 03:41:37 pm »
Привет.
Хорошим решением будет использование интервалов.
Т.е. У вас есть Дата календарная, та по которой живем. Есть даты начала события и конца события (задачи).
Все условия для использования IntervalMatch()
На оф.сайте в справке есть пример.

Ок, спасибо. Посмотрю что с этим можно сделать.

Оффлайн Chernov

  • Новичок
  • *
  • Сообщений: 21
  • Рейтинг: +5/-0
  • QV. Developer & Designer
    • Просмотр профиля
    • Личный блог

Оффлайн Валерий

  • Новичок
  • *
  • Сообщений: 22
  • Страна: ua
  • Рейтинг: +3/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #13 : Октябрь 30, 2018, 09:29:06 am »
Привет! А вариант создания доп таблицы с выходными днями на весь год не рассматриваете?
Джойните её при загрузке данных с доп полем "hollyday" к основной таблице, далее играесь фильтрами в приложении.

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

Оффлайн SC7793

  • Новичок
  • *
  • Сообщений: 16
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #14 : Октябрь 30, 2018, 06:50:46 pm »
Привет! А вариант создания доп таблицы с выходными днями на весь год не рассматриваете?
Джойните её при загрузке данных с доп полем "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).

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

Re: Работа с календарем (рабочие и праздничные дни)
« Ответ #14 : Октябрь 30, 2018, 06:50:46 pm »