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

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: mutniyglaz от 17 февраля 2015, 11:19:37

Название: Проблема с датами в Qlikview / Qlik Sense
Отправлено: mutniyglaz от 17 февраля 2015, 11:19:37
Доброе утро!

Загружаю файл Календарь.

Загружаю файл Продажи - S 01.2013. В данном файле указана суммы продаж по датам.

1. Загружаю как Кросс-таблицу. Выбираю встроенные метки и при загрузке даты становятся числовыми значениями -
01.01.2013 - 41275
02.01.2013 - 41276
03.01.2013 - 41277

2. Поле дата из файла Продаж не ассоциируется с датами из файла Календарь

Вопросы:
1. Как все таки загружать даты чтобы они оставались датами
2. Как добиться того, чтобы поле Дата одинаково ассоциировалось в обоих файлах
Название: Re: Проблема с датами
Отправлено: admin от 17 февраля 2015, 01:03:07
Добрый день.

Когда мы загружаем данные из таблицы Excel, то грузятся не отображаемые данные (настроенные по формату ячейки) а подлинные значения. В случае с датами, загружаются числа либо текстовое представление числа, если Qlikview берет данные из заголовка, как в вашем случае.
Обычно, форматы полей при загрузке данных можно подкорректировать в операторе LOAD, предшествующем LOAD FROM.
Но в случае с матрицами этот вариант исключен, поэтому мы воспользуемся обработкой таблицы оператором Load Resident, в котором сначала преобразуем текст в число num#(Дата).
(О том, что поле Дата содержит текстовые данные можно узнать из обозревателя таблиц, наведя курсор на интересующее нас поле.)
Затем число преобразовываем в дату для нормального отображения, согласно установкам системы.
Получится скрипт:

tmp1:
CrossTable(Дата, Данные, 3)
LOAD Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     [41275],
     [41276],
     [41277],
     [41278],
     [41279],
     [41280],
     [41281],
     [41282],
     [41283],
     [41284],
     [41285],
     [41286],
     [41287],
     [41288],
     [41289],
     [41290],
     [41291],
     [41292],
     [41293],
     [41294],
     [41295],
     [41296],
     [41297],
     [41298],
     [41299],
     [41300],
     [41301],
     [41302],
     [41303],
     [41304],
     [41305]
FROM
[S 01.2013 - копия.xlsx]
(ooxml, embedded labels, table is TDSheet);

Продажи:
NoConcatenate
load Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     date(num#(Дата)) as [Дата],
     Данные
Resident tmp1;
DROP Table tmp1;


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


Название: Re: Проблема с датами
Отправлено: admin от 17 февраля 2015, 01:10:43
Далее грузим подготовленный календарь, который также можно сформировать в Qlikview.

LOAD date(Дата) As Дата,
     Месяц,
     Квартал,
     Год
FROM
[Календарь.xlsx]
(ooxml, embedded labels, table is Лист1);
Название: Re: Проблема с датами
Отправлено: mutniyglaz от 17 февраля 2015, 03:33:33
С Календарем разобрался, но с Датами из файла Продажи, не получается... Скорее всего запутался в скрипте...

Мне надо загружать:
1. Таблица:

CrossTable(Дата, Данные, 3)
LOAD Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     [41275],
     [41276], и т.д.

2. В этом же скрипте как продолжение:

Продажи:
NoConcatenate
load Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     date(num#(Дата)) as [Дата],
     Данные

В данном скрипте что такое:

"Продажи:"
"Данные"

?
Название: Re: Проблема с датами
Отправлено: admin от 17 февраля 2015, 07:19:34
Изначально, когда выполняется первый скрипт, преобразующий матрицу в обычную таблицу

tmp1:
CrossTable(Дата, Данные, 3)
LOAD Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     [41275],
     [41276],
     [41277],
     [41278],
     [41279],
     [41280],
     [41281],
     [41282],
     [41283],
     [41284],
     [41285],
     [41286],
     [41287],
     [41288],
     [41289],
     [41290],
     [41291],
     [41292],
     [41293],
     [41294],
     [41295],
     [41296],
     [41297],
     [41298],
     [41299],
     [41300],
     [41301],
     [41302],
     [41303],
     [41304],
     [41305]
FROM
[S 01.2013 - копия.xlsx]
(ooxml, embedded labels, table is TDSheet);

Формируется таблица tmp1:
[smg id=74 width=700 type=preview]
Название: Re: Проблема с датами
Отправлено: mutniyglaz от 17 февраля 2015, 08:15:01
Не могу понять куда подставлять скрипт, который будет определять дату
Название: Re: Проблема с датами
Отправлено: admin от 17 февраля 2015, 08:29:57
Но так как нас не устраивает такой формат поля Дата, мы запускаем еще один запрос

Продажи:
NoConcatenate
load Номенклатура.Код,
     Партнер.Код,
     ВидРеализации,
     date(num#(Дата)) as [Дата],
     Данные
Resident tmp1;
DROP Table tmp1;

И получаем таблицу уже с нужным форматом поля Дата
[smg id=75 width=700 type=preview]
Т.е. очередность такая:
- грузим из Excel матрицу и преобразовываем в таблицу tmp1.
- формируем таблицу Продажи из tmp1, с преобразованием Дата в формат даты.
- Удаляем первую, промежуточную таблицу Tmp1.
Название: Re: Проблема с датами
Отправлено: mutniyglaz от 17 февраля 2015, 08:43:55
Resident tmp1;
DROP Table tmp1;

я так понимаю эти команды тоже надо использовать?
Название: Re: Проблема с датами
Отправлено: admin от 18 февраля 2015, 08:12:37
Приведу цитаты из документации.

ЦитироватьЗагрузка данных из ранее загруженной таблицы
Можно использовать логическое условие Resident в операторе LOAD, чтобы загрузить данные из ранее загруженной таблицы. Это удобно, когда необходимо выполнить вычисления с данными, загруженными с помощью оператора SELECT, когда нет возможности использовать функции Qlik Sense, такие как обработка даты или числовых значений.
Цитировать
Часто элемент Resident используется, при необходимости временной таблицы для выполнения вычислений или фильтра. Если временная таблица больше не нужна, избавьтесь от нее с помощью оператора Drop table.
Цитировать
Элемент Resident или предшествующий элемент LOAD?

В большинстве случаев тот же результат можно достичь с помощью предшествующего элемента LOAD. Это оператор LOAD, который выполняет загрузку из оператора LOAD или SELECT ниже, не указывая префикс источника, такой как From или Resident, который обычно указывается. Предшествующий элемент LOAD — это обычно более быстрый способ, но есть случаи, когда необходимо использовать Resident LOAD:

    В случае необходимости использования утверждения Order_by для сортировки записей перед обработкой оператора LOAD.
    В случае необходимости использования одного из следующих префиксов. В этом случае предшествующий элемент LOAD не поддерживается:
        Crosstable
        Join
        Intervalmatch
Первоисточник (http://help.qlik.com/sense/ru-RU/online/#../Subsystems/WorkingWith/Content/Scripting/LoadingResidentTables.htm)
Название: Re: Проблема с датами
Отправлено: mutniyglaz от 18 февраля 2015, 09:59:35
Спасибо, буду разбираться  :)
Название: Re: Проблема с датами
Отправлено: mutniyglaz от 18 февраля 2015, 10:05:30
Ура, получилось!!!

Буду читать подробно документацию )
Название: Re: Проблема с датами
Отправлено: admin от 18 февраля 2015, 10:48:10
Цитата: mutniyglaz от 18 февраля  2015, 10:05:30  
Буду читать подробно документацию )
По загрузке данных рекомендую скачать в PDF-формате руководство
Загрузка и моделирование данных (http://help.qlik.com/sense/ru-RU/pdf/%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0%20%D0%B8%20%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85.pdf) для Sense, но справедливо и для Qlikview (кроме источников lib)
Название: Re: Проблема с датами
Отправлено: mutniyglaz от 18 февраля 2015, 12:24:26
С одной таблицей все получилось за (допустим) январь месяц.

Но я планирую загружать порядка 24 таблиц за 2 года.

Данную процедуру замены данных придется делать для каждой таблицы?
Название: Re: Проблема с датами
Отправлено: admin от 18 февраля 2015, 01:27:22
А почему бы не взять данные сразу из базы?
Или сформировать отчет в табличном варианте и затем уже загружать.
Иначе, для каждого месяца потребуется править сценарий.
Название: Re: Проблема с датами
Отправлено: mutniyglaz от 18 февраля 2015, 01:39:04
Цитата: admin от 18 февраля  2015, 01:27:22  
А почему бы не взять данные сразу из базы?

Из 1С?

Цитата: admin от 18 февраля  2015, 01:27:22  
Или сформировать отчет в табличном варианте и затем уже загружать.

Отчет в табличном варианте, но Дни продаж по столбцам идут...
Название: Re: Проблема с датами
Отправлено: admin от 18 февраля 2015, 03:50:10
Да, из 1С.
Отчет у вас идет матрицей. Данные на пересечении атрибутов.
Если проблема с доступом к БД на SQL, то этот же отчет можно чуть-чуть подправить чтобы была "портянка" на несколько листов, но вам же его не печатать а в таблицу выгрузить.
Т.е. вместо столбцов-дней, сделать один "продажи" и добавить столбец дата.
Выгрузить за любой период и никаких crosstable и двойных обработок.
Название: Re: Проблема с датами
Отправлено: mutniyglaz от 18 февраля 2015, 05:00:35
Спасибо, отчет уже формирую
Кросс-таблиц я так понял лучше избегать

Со временем будем подключаться напрямую к БД на SQL
Название: Re: Проблема с датами в Qlikview / Qlik Sense
Отправлено: Kek от 29 марта 2017, 01:11:49
Хорошо а если дата в текстовом формате (2016 Н01) как ее конвертировать в дату? потом ее надо будет разбить на год и номер недели и связать с календарем, в котором 3 поля - Cal(там формат 11.03.2016), Week(формат 1,2,3) и year (2016,2017)
Название: Re: Проблема с датами в Qlikview / Qlik Sense
Отправлено: admin от 29 марта 2017, 02:16:48
Привет.

http://help.qlik.com/ru-RU/sense/3.2/Subsystems/Hub/Content/Scripting/DateAndTimeFunctions/makeweekdate.htm (http://help.qlik.com/ru-RU/sense/3.2/Subsystems/Hub/Content/Scripting/DateAndTimeFunctions/makeweekdate.htm)

Для связи с календарем надо будет определиться на какую дату преобразовывать ваше поле. Также это зависит и от ваших задач. Возможно, в календаре потребуется создать поле для связи с вашими данными.