Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Октябрь 18, 2018, 02:05:47 pm

Автор Тема: Формирование динамических и статических переменных для LFL  (Прочитано 2460 раз)

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

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

Понимаю, что словами "переменные" и "динамический" я уже всех тут достала, но тема по-прежнему для меня актуальна. Иногда даже болезненна.)

Прочитала все темы с тегом "переменные" на форуме, возник вопрос, действительно ли через обозреватель переменных можно задать их, и они будут статичны?

Все свои переменные я прописывала всегда в скрипте, как следствие, они всегда пересчитывались. Мне необходимы как статично заданные, так и ежедневно пересчитываемые.

С прологом закончила, теперь к сути задачи.

В 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() формулы работают.

Любым идеям по данной теме буду весьма благодарна.

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1206
  • Страна: ru
  • Рейтинг: +128/-0
    • Просмотр профиля
Привет.
 :)
Если в переменной выражение - оно будет пересчитываться если задано через LET.
Не совсем понял, какие именно календарные переменные требуется задавать статично.
Вроде бы хорошо, что переменные обновляются, и "вчера" всегда соответствует вчерашнему дню относительно даты актуальности данных приложения.
Начало и конец месяца отрабатывают как обычно. Возвращают начальные и конечные даты.
В течении месяца всегда будут возвращать одинаковые значения.

Рекомендую создать отдельное приложение с календарем для теста и прогнать в нем все функции

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

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

Нужно суммировать текущую и прошлую неделю. У меня переменные пересчитываются каждый день, как следствие, сдвигаются. Получается, что, допустим, today()-1 в воскресенье - это суббота, а в понедельник - эта же переменная уже относится к прошлой неделе.

Вот и выходит, что эти переменные я в формулах постоянно двигаю, что не назовёшь автообновлением.

Не могу понять, как организовать цикл. Чтобы программа сама вычисляла, какие дни относятся к текущей, а какие к прошлой неделе, и суммировала их в нужных столбцах - без моего вмешательства.

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


Оффлайн Prive

  • Новичок
  • *
  • Сообщений: 45
  • Страна: ru
  • Рейтинг: +22/-0
    • Просмотр профиля
Постараюсь не так загадочно объяснять.)

Нужно суммировать текущую и прошлую неделю. У меня переменные пересчитываются каждый день, как следствие, сдвигаются. Получается, что, допустим, today()-1 в воскресенье - это суббота, а в понедельник - эта же переменная уже относится к прошлой неделе.

Вот и выходит, что эти переменные я в формулах постоянно двигаю, что не назовёшь автообновлением.

Не могу понять, как организовать цикл. Чтобы программа сама вычисляла, какие дни относятся к текущей, а какие к прошлой неделе, и суммировала их в нужных столбцах - без моего вмешательства.
Функции weekstart(),weekend(). Чтобы узнать начало прошлой недели можно сделать так: WeekStart(today()-7)).

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

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

Как и предполагалось, проблему решила с помощью переменных 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 неделя), но разными годами, если у вас имеются вековые данные.
- Дни недели необходимы для сравнения продаж по конкретным дням. Допустим, сейчас всего лишь вторник текущей недели. У вас имеется сумма за прошлую. Понятно, что она намного больше, и не совсем понятно, сколько продано за понедельник прошлой недели. Убирая это ограничение, вы можете сравнивать продажи по дням недели.

Аналогичное можно прописать для любой другой недели, месяца и пр., смотря, что требуется.

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