Skip to main content
Announcements
Join us at Qlik Connect for 3 magical days of learning, networking,and inspiration! REGISTER TODAY and save!
cancel
Showing results for 
Search instead for 
Did you mean: 
valerij_y
Contributor II
Contributor II

Qlik sense, для появления данных загрузка 2 раза?

Здравствуйте.

Вопрос по 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" есть, корректны, в том числе и за текущий день.

1 Solution

Accepted Solutions
valerij_y
Contributor II
Contributor II
Author

Нашел причину, почему только при повторной загрузке и расчёте получался верный результат.

В совершенно другом месте определялась переменная (максимальная дата данных) и она была в следующем обрабатываемом разделе скрипта.

Т.е. я ссылался на переменную, которая становилась актуальной только в следующем разделе.

Думал, что такие переменные обнуляются при начале работы скрипта.

View solution in original post

8 Replies
Eugeny_Ilyin
Creator II
Creator II

Привет.
Для работы с датами в клике есть неплохой набор функций\

Воспользуйтесь monthend(),

valerij_y
Contributor II
Contributor II
Author

В переменной для визуализации функцией monthend() я могу получить данные на последний день месяца.

Смысл создания таблицы "т2" что бы убрать из базы qlik остальные дни, кроме последнего дня каждого месяца. Иначе графики за год просто не работают (превышен лимит времени). Таблицу "т1" далее в скрипте загрузки я сбрасываю.

И вот тут и проявляется проблема: скрипт загружает и пересчитывает данные ~30мин., но текущий день, только при первой загрузке, не пересчитывается! Запускаю загрузку повторно и всё нормально - текущий день на месте и рассчитан.

Eugeny_Ilyin
Creator II
Creator II

Включите флаг в календарь

if(num(DateId)=num(floor(monthend(DateId))),1,0) as EOM_Flag

И используйте его в визуализациях

sum({<EOM_Flag={1}>} Поле).

Если данных много, отсекайте данные по этому условию, для чего делать еще одну таблицу?

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

valerij_y
Contributor II
Contributor II
Author

Первоначально я примерно такие флаги в скрипте загрузки и ставил. Пока отлаживал на 3-4 месяцах всё работало, загрузил год (данные на каждый день) - превышен лимит расчёта. Решил физически убрать "лишнее" за год, графики опять заработали.

Пока даже не могу представить в каком месте ставить отладку, ситуация стабильно при повторной загрузке исправляется.

Eugeny_Ilyin
Creator II
Creator II

Какой объем данных? Сколько записей и оперативной памяти.
Проанализируйте модель данных, есть ли синтетические ключи?

Как много связей?

Для отладки, в подозрительных местах пропишите вывод (trace) значения переменных и проанализируйте неуспешный и успешный запуски.

Через диспетчер задач отслеживайте потребление памяти во время загрузки.

valerij_y
Contributor II
Contributor II
Author

Получившейся файл ~90Mb, таблица с остатками "т2" ~20млн. строк, отгрузка ~10млн. строк, справочник 120тыс. строк. Схема данных "звезда" с центральной таблицей связей, связей всего 6. Синтетических ключей нет. Отлаживаю на i7-3635qm, 8Gb. При загрузке, в Win10, ничего не зависает.


Заметил, что вторая и последующие загрузки, в течение дня, на 10мин дольше, но по логу, вроде проходит все. Нагрузка на бук, при загрузках, одинаковая.


Где искать подозрительные места? Может какая-нибудь системная переменная не перескакивает?

Eugeny_Ilyin
Creator II
Creator II

Сложно подсказать что именно.в вашем коде не так.

Я рекомендую отследить все переменные, которые вы используете. В сравнениях, вычислениях, циклах.

Когда приложение уходит в ошибку, переменные сохраняют свое состояние на момент ошибки.
И если в следующий запуск все ОК - повод проверить значения используемых переменных.
Плюс, промежуточные файлы, вы используете их или нет?

По размеру данных: 8Gb на Оперативную память - маловато.

valerij_y
Contributor II
Contributor II
Author

Нашел причину, почему только при повторной загрузке и расчёте получался верный результат.

В совершенно другом месте определялась переменная (максимальная дата данных) и она была в следующем обрабатываемом разделе скрипта.

Т.е. я ссылался на переменную, которая становилась актуальной только в следующем разделе.

Думал, что такие переменные обнуляются при начале работы скрипта.