Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Июль 18, 2018, 07:24:00 pm

Автор Тема: Set Analysis и конструкция if не распознают переменные с датой (Qlikview, Sense)  (Прочитано 3611 раз)

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Всем добрый день.

Давно у меня уже висит задача, с которой разобраться не могу. Сейчас появляются на работе задачи, поэтому она стала критичной.
К сути - у меня Set Analysis и конструкция if не распознают переменные с датой.

1) Касаемо Set Analysis:

Есть стандартный синтаксис, где задаются переменные с датой:
SET vYearMin = 2004;
SET vYearMax = 2014;
SET vYearCurr = 2015;
Потом данные переменные должны работать в формуле:
=SUM({$ <Год = {'>=$(vYearMin)<=$(vYearMax)'}>} Продажи)В своём случае я задаю переменные:
SET vDate1 = "'17.08.2015 00:00:00','DD.MM.YYYY HH24:MI:SS'";     
SET vDate2 = "'19.08.2015 23:59:59','DD.MM.YYYY HH24:MI:SS'";
Подставляю их в формулу:
=SUM({$ <Doc_date = {'>=$(vDate1)<=$(vDate2)'}>} Приход)
Формула выдаёт 0. К слову, данная конструкция не видит переменные, т. е. они становятся серыми, когда я убираю фигурные скобки и кавычки одинарные.
Забыла описать саму задачу.
Мне необходимо задать период с понедельника по среду, чтобы поле суммировало приходы за 3 дня. Причём, чтобы один столбец всегда показывал бы предыдущую неделю, а второй текущую - сравнительная аналитика по приходам нужна.
Возможно ли задать данные периоды динамически, чтобы постоянно не переписывать даты? И как быть с переменными, если он их не видит, есть ли другие способы решения данной задачи?
Наверное, стоит уточнить, что поле doc_date содержит массив дат (скрин 2 во вложении). Возможно ли несооттвествие из-за того, что данное поле содержит дату в таком виде? К слову, именно к этому полю у меня прикреплён календарь (скрин 3 во вложении), дату идентифицирует корректно.

2) Касаемо if:

Пишу формулу, но она очень странно работает:
if(DOC_DATE = $(vM1), sum(KOL))
Допустим, нужно просуммировать приход за 17 сентября. Пишу, если doc_date = 17 сентября (переменная), то суммируй приход.
Работает в моём случае эта формула так - она суммирует любые другие даты, кроме указанной. Когда же выбираю роковое 17 сентября, то она выдаёт формат даты (скрин 4 во вложении).
С чем это может быть связано? Или есть какие-то нюансы в данной конструкции, которые я не учла?

Буду благодарна за любую помощь, голову уже сломала, не могу понять, где я допустила ошибки.

Оффлайн DmitryK

  • Наставник
  • **
  • Сообщений: 63
  • Страна: ru
  • Рейтинг: +20/-0
  • QlikView v.11.20
    • Просмотр профиля
Доброе утро, Софья!

Попробуйте даты задать в таком формате:

LET vDate1Tmp = MakeDate(2015,08,17);
LET vDate2Tmp = MakeDate(2015,08,19);

LET vDate1 = floor($(vDate1Tmp));
LET vDate2 = floor($(vDate2Tmp));

В скрипте DOC_DATE прописать как
floor(DOC_DATE) as DOC_DATE

Задаем даты. Преобразуем их в числа. При изменении дат, они автоматически будут преобразованы в числа, соответственно. Даты задаем в переменных с Tmp, в формулах используем переменные vDate1 и vDate2.

Соответственно подставляя в формулы

SUM({$ <Doc_date = {'>=$(vDate1)<=$(vDate2)'}>} Приход)

Формат времени указывать не обязательно, потому что и так возьмутся целые дни.
Пишу на коленке, поэтому могут быть "Очепятки" :-)

Насчет if.
Судя по тому что я вижу, то могу предположить, что формула отрабатывает не корректно, потому что разные форматы дат. Поэтому лучше использовать все тот же floor (Округление в меньшую сторону). С числами проще работать, чем с датами.

if(floor(DOC_DATE) = floor($(vM1)), sum(KOL))

Оффлайн bibis

  • Наставник
  • **
  • Сообщений: 78
  • Рейтинг: +31/-0
    • Просмотр профиля
Добрый день. По второму пункту
 sum(if(DOC_DATE = $(vM1),KOL))

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


Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Попробуйте даты задать в таком формате:

LET vDate1Tmp = MakeDate(2015,08,17);
LET vDate2Tmp = MakeDate(2015,08,19);

LET vDate1 = floor($(vDate1Tmp));
LET vDate2 = floor($(vDate2Tmp));

В скрипте DOC_DATE прописать как
floor(DOC_DATE) as DOC_DATE


Дмитрий, спасибо Вам большое за Ваши ответы - они всегда последовательные и подробные.)
Даты задавать в таком формате не пробовала - сейчас буду тестировать.
Вот с Floor проблема, как бы я его не прописывала, на этапе отладки у меня всегда выдаёт всяческие ошибки. Буду разбираться.

Bibis, спасибо Вам, буду пробовать.

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Добрый день. По второму пункту
 sum(if(DOC_DATE = $(vM1),KOL))

Добрый день.

Когда sum вынесла за общую скобку, ушёл формат даты из поля, но по-прежнему показывает 0, когда я выбираю дату, по который нужно просуммировать.

Это нормальная ситуация?

Оффлайн DmitryK

  • Наставник
  • **
  • Сообщений: 63
  • Страна: ru
  • Рейтинг: +20/-0
  • QlikView v.11.20
    • Просмотр профиля
Доброе утро, София!

Попробуйте принудительно привести в числовой формат даты или в формат даты:

sum(if(floor(DOC_DATE) = floor($(vM1)),KOL))

Или

sum(if(date(DOC_DATE) = date($(vM1)),KOL))

С Уважением, Дмитрий

Оффлайн Софья

  • Наставник
  • **
  • Сообщений: 71
  • Страна: 00
  • Рейтинг: +14/-0
    • Просмотр профиля
Добрый день, Дмитрий.

Как раз вся проблема в том, что я никак не могу применить floor к полю doc_date. Вот кусочек кода, где у меня прописано, каким образом загружается дата:TO_CHAR(D.DOC_DATE, 'dd.mm.yyyy') AS DOC_DATE,
    TO_CHAR(D.DOC_DATE, 'yyyy') AS YEAR,
    TO_CHAR(D.DOC_DATE, 'month') AS MONTH,
    TO_CHAR(D.DOC_DATE, 'day') AS DAY

Дату не могу задать в том виде, в котором Вы мне советовали - через LET и MakeDate, у меня на отладке возникает ошибка - скрин во вложении.

Понимаю, что где-то идёт несоответствие по датам и по формату, но не могу пока определить.

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


Оффлайн DmitryK

  • Наставник
  • **
  • Сообщений: 63
  • Страна: ru
  • Рейтинг: +20/-0
  • QlikView v.11.20
    • Просмотр профиля
Добрый день, Софья.

Как я понимаю представленный кусок кода написан на SQL.

Попробуйте сделать так:
load *,
date(DOCDATE_Tmp) as DOC_DATE, // Если необходимо число, тогда floor(DOCDATE_Tmp)
YEAR(DOCDATE_Tmp) as YEAR,
MONTH(DOCDATE_Tmp) as MONTH,
DAY(DOCDATE_Tmp) as DAY
;
Select D.DOC_DATE as DOCDATE_Tmp
FROM BlaBlaBla;

В этом случае из базы вы грузите дату в том виде как она есть, а потом обрабатываете ее с помощью QlikView.

Оффлайн Роман

  • Новичок
  • *
  • Сообщений: 4
  • Страна: ru
  • Рейтинг: +2/-0
    • Просмотр профиля
Софья,

для суммирования дней с понедельника по среду можно воспользоваться функцией WeekDay() и ее числовой формой num(WeekDay()). Вот пример (названия столбцов из моей модели, но, думаю, все понятно :)):

=num(WeekDay(min({<CalDate={'=sum({<Fact={Sales}>}NetSls)>0'}>}CalDate)))& chr(13)&
 WeekDay(min({<CalDate={'=sum({<Fact={Sales}>}NetSls)>0'}>}CalDate))& chr(13)&
 min({<CalDate={'=sum({<Fact={Sales}>}NetSls)>0'}>}CalDate)

WeekDay() выдает имя дня недели ("Пн"-"Вс" в моем случае), num(WeekDay()) - номер с 0 (для "Пн") до 6 (для "Вс").

Для суммирования понедельников-вторников-сред можно в Set Analysis ограничить множество номеров дней недели от 0 до 2 включительно. Только границами недели текущей и предыдущей нужно будет озаботиться отдельно. ))

Оффлайн Mad

  • Стажер
  • *
  • Сообщений: 1
  • Страна: ru
  • Рейтинг: +1/-0
    • Просмотр профиля
Возникла такая же проблема как и у ТС. С годами работает с датами нет. После дня мозгового штурма решение найдено.
следующее

SUM({$ <Doc_date = {'>=$(vDate1)<=$(vDate2)'}, Year=, Month=, Week=, Day=>} Приход)

т.е. отключаем в календаре все выборки какие может сделать пользователь и вуаля эта чудо система начинает работать. Потрясающее. Молодцы разработчики очень грамотно все задокументировали.

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