Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Здравствуйте.
Вопрос по Qlik sense, почему для появления данных в таблице т2 нужна загрузка 2 раза? Причём ошибка только в текущем дне (now()), т.е. происходит загрузка, пересчёт в скрипте, но именно текущий день, в таблице т2, появляется только при повторной загрузке. Данные в исходных файлах есть, они корректны и между загрузками не обновляются.
В скрипте конструкция примерно такая:
//Создаётся таблица т2, по дням с текущим днём + полным месяцем минус единица,
//_что бы попал последний день предыдущего полного месяца.
т2:
LOAD DISTINCT
[дата],
SumOtg
Resident т1
WHERE [дата]>='$(datan)'-1;
//Определяем переменную для цикла
Set DayDt1=3;
//Цикл расчёт суммы на последний день месяца
Do while DayDt1<=13
// Устанавливаем дату на последний день месяца
if Month(Now())-DayDt1=0 then
LET DayDtD = MakeDate(Year(Now()), 1)-1;
ElseIf Month(Now())-DayDt1>0 then
LET DayDtD = MakeDate(Year(Now()), Month(Now())-DayDt1+1)-1;
ElseIf Month(Now())-DayDt1<0 then
LET DayDtD = MakeDate(Year(Now())-1, Month(Now())-DayDt1+13)-1;
endif;
//Присоединяем к т2 остальной год с данными только за последний день месяца.
Concatenate(т2)
LOAD DISTINCT
[дата],
SumOtg
Resident т1
WHERE [дата]='$(DayDtD)';
Let DayDt1=DayDt1+1;
Loop
Данные в таблице "т1" есть, корректны, в том числе и за текущий день.
Нашел причину, почему только при повторной загрузке и расчёте получался верный результат.
В совершенно другом месте определялась переменная (максимальная дата данных) и она была в следующем обрабатываемом разделе скрипта.
Т.е. я ссылался на переменную, которая становилась актуальной только в следующем разделе.
Думал, что такие переменные обнуляются при начале работы скрипта.
Привет.
Для работы с датами в клике есть неплохой набор функций\
Воспользуйтесь monthend(),
В переменной для визуализации функцией monthend() я могу получить данные на последний день месяца.
Смысл создания таблицы "т2" что бы убрать из базы qlik остальные дни, кроме последнего дня каждого месяца. Иначе графики за год просто не работают (превышен лимит времени). Таблицу "т1" далее в скрипте загрузки я сбрасываю.
И вот тут и проявляется проблема: скрипт загружает и пересчитывает данные ~30мин., но текущий день, только при первой загрузке, не пересчитывается! Запускаю загрузку повторно и всё нормально - текущий день на месте и рассчитан.
Включите флаг в календарь
if(num(DateId)=num(floor(monthend(DateId))),1,0) as EOM_Flag
И используйте его в визуализациях
sum({<EOM_Flag={1}>} Поле).
Если данных много, отсекайте данные по этому условию, для чего делать еще одну таблицу?
По поводу двойной загрузки скрипта - воспользуйтесь отладчиком и отследите переменные. Наверняка, какие-то из них имеют разные состояния при неудачной и удачной загрузке.
Первоначально я примерно такие флаги в скрипте загрузки и ставил. Пока отлаживал на 3-4 месяцах всё работало, загрузил год (данные на каждый день) - превышен лимит расчёта. Решил физически убрать "лишнее" за год, графики опять заработали.
Пока даже не могу представить в каком месте ставить отладку, ситуация стабильно при повторной загрузке исправляется.
Какой объем данных? Сколько записей и оперативной памяти.
Проанализируйте модель данных, есть ли синтетические ключи?
Как много связей?
Для отладки, в подозрительных местах пропишите вывод (trace) значения переменных и проанализируйте неуспешный и успешный запуски.
Через диспетчер задач отслеживайте потребление памяти во время загрузки.
Получившейся файл ~90Mb, таблица с остатками "т2" ~20млн. строк, отгрузка ~10млн. строк, справочник 120тыс. строк. Схема данных "звезда" с центральной таблицей связей, связей всего 6. Синтетических ключей нет. Отлаживаю на i7-3635qm, 8Gb. При загрузке, в Win10, ничего не зависает.
Заметил, что вторая и последующие загрузки, в течение дня, на 10мин дольше, но по логу, вроде проходит все. Нагрузка на бук, при загрузках, одинаковая.
Где искать подозрительные места? Может какая-нибудь системная переменная не перескакивает?
Сложно подсказать что именно.в вашем коде не так.
Я рекомендую отследить все переменные, которые вы используете. В сравнениях, вычислениях, циклах.
Когда приложение уходит в ошибку, переменные сохраняют свое состояние на момент ошибки.
И если в следующий запуск все ОК - повод проверить значения используемых переменных.
Плюс, промежуточные файлы, вы используете их или нет?
По размеру данных: 8Gb на Оперативную память - маловато.
Нашел причину, почему только при повторной загрузке и расчёте получался верный результат.
В совершенно другом месте определялась переменная (максимальная дата данных) и она была в следующем обрабатываемом разделе скрипта.
Т.е. я ссылался на переменную, которая становилась актуальной только в следующем разделе.
Думал, что такие переменные обнуляются при начале работы скрипта.