Всем доброе утро.
Понимаю, что словами "переменные" и "динамический" я уже всех тут достала, но тема по-прежнему для меня актуальна. Иногда даже болезненна.)
Прочитала все темы с тегом "переменные" на форуме, возник вопрос, действительно ли через обозреватель переменных можно задать их, и они будут статичны?
Все свои переменные я прописывала всегда в скрипте, как следствие, они всегда пересчитывались. Мне необходимы как статично заданные, так и ежедневно пересчитываемые.
С прологом закончила, теперь к сути задачи.
В LFL у меня реализовано сравнение периодов. Текущая неделя с прошлой, текущий месяц 2015 года с аналогичным, только 2014. Приложение работает, но костыльно - мне приходится править данные в формулах.
Переменные у меня загружены при помощи today() и её вариаций (today()-1, today()-2 & etc.) Но при ежедневном обновлении дата у данных переменных, как вы понимаете, сдвигается. Поэтому мне приходится её править.
Календарь содержит у меня такое поле, как номер недели (вложение 1). Каким образом можно организовать цикл, чтобы программа сравнивала номер недели дат с текущей, и суммировала только те дни, которые соответствуют ей? Для предыдущей то же самое нужно (полагаю, week()-1).
И как организовать такую функцию, как MonthStart() и MonthEnd()? Читала, но в голове картинка не складывается. Нужны начальные и конечные даты каждого месяца. Заданы должны быть статично, естественно.
Прописать их в скрипте не проблема, но в выражениях такие переменные у меня не работают.
1 нерабочий вариант:
SET vDate1 = "'20.10.2015 00:00:00','DD.MM.YYYY HH24:MI:SS'";
2 нерабочий вариант с MakeDate, Date. В выражениях с Set Analysis такие переменные бесполезны в моём случае. Причину так и не выявила.
C today() формулы работают.
Любым идеям по данной теме буду весьма благодарна.
Привет.
:)
Если в переменной выражение - оно будет пересчитываться если задано через LET.
Не совсем понял, какие именно календарные переменные требуется задавать статично.
Вроде бы хорошо, что переменные обновляются, и "вчера" всегда соответствует вчерашнему дню относительно даты актуальности данных приложения.
Начало и конец месяца отрабатывают как обычно. Возвращают начальные и конечные даты.
В течении месяца всегда будут возвращать одинаковые значения.
Рекомендую создать отдельное приложение с календарем для теста и прогнать в нем все функции (http://help.qlik.com/sense/2.1/ru-RU/online/#../Subsystems/Hub/Content/Scripting/DateAndTimeFunctions/date-time-functions.htm?Highlight=date)
Постараюсь не так загадочно объяснять.)
Нужно суммировать текущую и прошлую неделю. У меня переменные пересчитываются каждый день, как следствие, сдвигаются. Получается, что, допустим, today()-1 в воскресенье - это суббота, а в понедельник - эта же переменная уже относится к прошлой неделе.
Вот и выходит, что эти переменные я в формулах постоянно двигаю, что не назовёшь автообновлением.
Не могу понять, как организовать цикл. Чтобы программа сама вычисляла, какие дни относятся к текущей, а какие к прошлой неделе, и суммировала их в нужных столбцах - без моего вмешательства.
Цитата: Софья от 25 декабря 2015, 07:41:03
Постараюсь не так загадочно объяснять.)
Нужно суммировать текущую и прошлую неделю. У меня переменные пересчитываются каждый день, как следствие, сдвигаются. Получается, что, допустим, today()-1 в воскресенье - это суббота, а в понедельник - эта же переменная уже относится к прошлой неделе.
Вот и выходит, что эти переменные я в формулах постоянно двигаю, что не назовёшь автообновлением.
Не могу понять, как организовать цикл. Чтобы программа сама вычисляла, какие дни относятся к текущей, а какие к прошлой неделе, и суммировала их в нужных столбцах - без моего вмешательства.
Функции weekstart(),weekend(). Чтобы узнать начало прошлой недели можно сделать так: WeekStart(today()-7)).
Проблему решила. Публикую, если принесёт пользу кому-то, то прекрасно.
Как и предполагалось, проблему решила с помощью переменных current_week и previous_week.
Задаём переменные:let v_current_week = Week(today());
let v_previous_week = Week(today()-7);
Так же нам необходим будет год в ограничениях, чтобы Set Analysis работал корректно:let v_current_year = Year(today());
let v_previous_year = Year(today())-1;
В итоге, мы получаем формулу:=SUM({ <WEEK = {'>=$(v_current_week)<=$(v_current_week)'}, YEAR = {'>=$(v_current_year)<=$(v_current_year)'},DAY=, MONTH=/*DAYNAMES=,YEAR=*/>} СУММА_ЗА_ДЕНЬ)
Она отображает сумму только за текущую неделю. Получилось, что и было необходимо - программа при ежедневном обновлении показывает соответствующие данные, и править руками ничего не нужно.
DAYNAMES и YEAR я убрала из игнорируемых ограничений по нескольким причинам:
- Если год будет игнорироваться, то вы получите сумму по неделям с одинаковым числом (допустим, 17 неделя), но разными годами, если у вас имеются вековые данные.
- Дни недели необходимы для сравнения продаж по конкретным дням. Допустим, сейчас всего лишь вторник текущей недели. У вас имеется сумма за прошлую. Понятно, что она намного больше, и не совсем понятно, сколько продано за понедельник прошлой недели. Убирая это ограничение, вы можете сравнивать продажи по дням недели.
Аналогичное можно прописать для любой другой недели, месяца и пр., смотря, что требуется.