Всем добрый день.
Давно у меня уже висит задача, с которой разобраться не могу. Сейчас появляются на работе задачи, поэтому она стала критичной.
К сути - у меня 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 во вложении).
С чем это может быть связано? Или есть какие-то нюансы в данной конструкции, которые я не учла?
Буду благодарна за любую помощь, голову уже сломала, не могу понять, где я допустила ошибки.
Доброе утро, Софья!
Попробуйте даты задать в таком формате:
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))
Добрый день. По второму пункту
sum(if(DOC_DATE = $(vM1),KOL))
Цитата: DmitryK от 28 сентября 2015, 10:36:32
Попробуйте даты задать в таком формате:
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, спасибо Вам, буду пробовать.
Цитата: bibis от 28 сентября 2015, 10:40:17
Добрый день. По второму пункту
sum(if(DOC_DATE = $(vM1),KOL))
Добрый день.
Когда sum вынесла за общую скобку, ушёл формат даты из поля, но по-прежнему показывает 0, когда я выбираю дату, по который нужно просуммировать.
Это нормальная ситуация?
Доброе утро, София!
Попробуйте принудительно привести в числовой формат даты или в формат даты:
sum(if(floor(DOC_DATE) = floor($(vM1)),KOL))
Или
sum(if(date(DOC_DATE) = date($(vM1)),KOL))
С Уважением, Дмитрий
Добрый день, Дмитрий.
Как раз вся проблема в том, что я никак не могу применить 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, у меня на отладке возникает ошибка - скрин во вложении.
Понимаю, что где-то идёт несоответствие по датам и по формату, но не могу пока определить.
Добрый день, Софья.
Как я понимаю представленный кусок кода написан на 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.
Софья,
для суммирования дней с понедельника по среду можно воспользоваться функцией 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 включительно. Только границами недели текущей и предыдущей нужно будет озаботиться отдельно. ))
Возникла такая же проблема как и у ТС. С годами работает с датами нет. После дня мозгового штурма решение найдено.
следующее
SUM({$ <Doc_date = {'>=$(vDate1)<=$(vDate2)'}, Year=, Month=, Week=, Day=>} Приход)
т.е. отключаем в календаре все выборки какие может сделать пользователь и вуаля эта чудо система начинает работать. Потрясающее. Молодцы разработчики очень грамотно все задокументировали.