В этой статье расскажу, как использовать переменные и знак доллара в выражениях QlikView и Qlik Sense в календаре (в том числе в скриптах загрузки). Мы уже как-то писали о календаре в QlikView, но сегодня – «фишки», связанные с популярными форматами использования переменных с параметрами в календарях.
Переменные с параметрами: Введение
Переменные с параметрами делают код более гибким и наиболее полезны при работе со сводными таблицами, где есть фиксированное количество столбцов (например, 12 месяцев) и более чем одна суммарная колонка (например, «Итого» и «Среднее»).
Также иной способ использования этих параметрических переменных – работа в скрипте загрузки, для очистки скрипта и удаления повторений.
Повторы, повторы, повторы
Бывает так, что у вас есть ряд повторяющихся задач в скрипте загрузки, которые делают скрипт сложночитаемым, а маленькие изменения в коде приводят к необходимости большого объема рутинной работы по правке всего скрипта. Здесь очень хорошо помогают переменные.
Например, работа с датами. Когда даты выгружаются из текстовых файлов нужно сделать две операции: сконвертировать текст в число, а затем в формат даты. Код для этой задачи с переменной:
1 2 3 4 5 |
let vSrcDateFmt = 'YYYY-MM-DD'; let vDateFormat = 'DD MMM YYYY'; set vFmtDate = Date(Date#($1, '$(vSrcDateFmt)'), '$(vDateFormat)'); |
Можно использовать для нескольких полей:
1 2 3 4 5 6 7 8 9 |
LOAD $(vFmtDate(StartDate)) as [Start Date], $(vFmtDate(EndDate)) as [End Date], $(vFmtDate(Updated)) as [Updated Date], ... |
Вы заметили, что параметр в переменной находится там, где появляется $1 в коде переменной. $1 может повторяться, позволяя вставлять тот же текст несколько раз. Дополнительные параметры могут быть использованы в списке через запятую.
Иногда в текстовых файлах или некачественных базах данных вместо пустых значений можно вставлять текст NULL. Лучше всего в этом случае работать с выражением if:
1 |
set vSetNull = if($1 = '', null(), '$1'); |
Переменная, которую мы используем в скрипте в этом случае:
1 2 3 4 5 |
LOAD $(vSetNull(SomeField)) as [Some Field], ... |
Такие же переменные могут использоваться в случае пропусков или нулевых значений дат, таких как 1/1/1900.
А теперь перейдем к более сложному примеру с календарем.
Исключение нерабочих дней в календаре
Функция NetworkDays очень полезна, ведь она присваивает дням недели цифры с понедельника по пятницу. Естественно, в функцию не встроен автоматический учет государственных праздников, т.к. во всех странах даты праздников отличаются. Поэтому здесь можно ввести список с разделителем в виде запятой, но этот список может быть очень длинным, что будет весьма затратно по времени кодинга.
Другой способ решить эту задачу также с помощью переменных – программно создать исполняемый код, который может быть как в скрипте загрузки, так и в другой среде.
В этом случае нам нужно создать список праздников с датами, который поддерживается извне. Нужно создать временную таблицу и запрасить ее (для этого вам нужно понимать функции PEEK и FOR).
Итак, в этом случае код для наших переменных выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Temp_PublicHols: LOAD [Public Holiday Date] FROM [$(vSourceData)\MyApp-Lookups.xlsx] (ooxml, embedded labels, table is [Public Holidays]); let vPubHols = ''; for iHol = 0 to NoOfRows('Temp_PublicHols') - 1; let vPubHols = vPubHols & if(vPubHols = '', '', ',') & chr(39) & Date(peek('Public Holiday Date', iHol, 'Temp_PublicHols')) & chr(39); next set vWorkDays = (RangeMax(NetworkDays($1, $2, $(vPubHols))-1,0)); DROP TABLE Temp_PublicHols; |
Когда мы, например, запустим список государственных праздников Великобритании итоговая переменная будет выглядеть таким образом:
1 2 3 4 5 6 7 8 9 |
(RangeMax(NetworkDays($1, $2, '28/12/2015','25/12/2015','31/08/2015','25/05/2015', '04/05/2015','06/04/2015','03/04/2015','01/01/2015','02/05/2016','28/03/2016', '25/03/2016','01/01/2016','30/05/2016','29/08/2016','26/12/2016','27/12/2016', '02/01/2017','14/04/2017','17/04/2017','01/05/2017','29/05/2017','28/08/2017', '25/12/2017','26/12/2017')-1,0)) |
В скрипте загрузки переменную вписать можно так:
1 2 3 4 5 6 7 8 9 |
LOAD $(vFmtDate(FromDate)) as [From Date], $(vFmtDate(ToDate)) as [To Date], $(vWorkDays(FromDate,ToDate)) as [Number Of Working Days], ... |
Внутри приложения можно использовать переменную в таком формате:
1 |
=$(vWorkDays(min(FromDate),max(ToDate))) |
Надеюсь, эта статья дала вам новые идеи по работе с параметрами в приложениях QlikView и Qlik Sense (не только в календаре).
Коммутируйте! Делитесь идеями!
Свежие комментарии