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

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: tommix от 12 января 2017, 04:36:41

Название: Преобразование даты
Отправлено: tommix от 12 января 2017, 04:36:41
Добрый день, коллеги.

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

(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fimage.prntscr.com%2Fimage%2Fc66811d765564442b250c7d2b1c1fd69.png&hash=9f018826d7df2bc06508480cdd779fc188f844fd)

Задача:
1. Имеем табличку, где сложены id товара и дата его наличия на складе.
2. id товара всегда уникальна
3. Если товар поступил на склад, то делается запись в таблице, если товар ушел со склада, то запись то же пропадает.
4. Нужно пронумеровать дни, 1 день, 2 день, и т.д. И если товар есть в наличии, то поставить 1, если нет записи то 0.

Спасибо, за помощь.
Название: Re: Преобразование даты
Отправлено: admin от 12 января 2017, 07:20:14
Привет.
Сделать очень просто.
Необходимо отсортировать по ID товара и дате, и пронумеровать записи.
Выражение примерно такое:
...
if(id=peek(id),День+1,1) as День,
...
Название: Re: Преобразование даты
Отправлено: tommix от 18 января 2017, 03:17:15
Склад:
Load * inline
[
id,data
20,07.01.2016
14,01.01.2016
14,02.01.2016
14,03.01.2016
14,04.01.2016
14,05.01.2016
15,01.01.2016
15,02.01.2016
15,03.01.2016
15,04.01.2016
16,01.01.2016
16,02.01.2016
16,03.01.2016
20,06.01.2016
];

NoConcatenate
Склад_tmp:
LOAD
    id,
    data,
    RowNo() as День
Resident Склад Order By id,data;


NoConcatenate
Склад_tmp_2:
LOAD
    if(id=peek(id),День+1,1) as День
Resident Склад_tmp Order By id,data;

Drop Table Склад;


Вот, что получилось, но подсчет идет как-то не так. Подскажите пожалуйста, что делаю не так?
Название: Re: Преобразование даты
Отправлено: Prive от 20 января 2017, 11:19:22
Можно сделать таким образом:


СкладTemp:
Load * inline
[
id,data
20,07.01.2016
14,01.01.2016
14,02.01.2016
14,03.01.2016
14,04.01.2016
14,05.01.2016
15,01.01.2016
15,02.01.2016
15,03.01.2016
15,04.01.2016
16,01.01.2016
16,02.01.2016
16,03.01.2016
20,06.01.2016
];

NoConcatenate
Склад:
LOAD
id as ID,  //Field1
// data as DATA,
'День ' & Day(data) & ' (' & month(data) & year(data) & ')' as DAY, //Attribute
'1' as IN_STOCK //Value
Resident СкладTemp;

DROP TABLE СкладTemp;


temp1:
generic load * resident Склад;

result:
load distinct ID resident Склад;

drop table Склад;

FOR i = 0 to NoOfTables()
TableList:
LOAD TableName($(i)) as Tablename AUTOGENERATE 1
WHERE WildMatch(TableName($(i)), 'temp1.*');
NEXT i

FOR i = 1 to FieldValueCount('Tablename')
LET vTable = FieldValue('Tablename', $(i));
LEFT JOIN (result) LOAD * RESIDENT [$(vTable)];
DROP TABLE [$(vTable)];
NEXT i

DROP TABLE TableList;


В итоге получаем следующую таблицу:
(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fi12.pixs.ru%2Fstorage%2F9%2F6%2F8%2Fforumpng_6513000_24839968.png&hash=4d0b002e080324bd13d59418f082f6096b4c66ee) (http://pixs.ru/showimage/forumpng_6513000_24839968.png)
Название: Re: Преобразование даты
Отправлено: tommix от 23 января 2017, 05:49:40
Prive, очень круто, то что нужно.

Подскажите пожалуйста, а как сделать, что бы для id 20 , сделать так что бы 06.01.16 было первым днем?
Так, как 06.01.16 товар только появился на складе и это его первый день нахождения на складе.
А то так получается, что он уже 6 дней находится на складе.
Название: Re: Преобразование даты
Отправлено: Prive от 24 января 2017, 12:01:14
Цитата: tommix от 23 января  2017, 05:49:40  
Prive, очень круто, то что нужно.

Подскажите пожалуйста, а как сделать, что бы для id 20 , сделать так что бы 06.01.16 было первым днем?
Так, как 06.01.16 товар только появился на складе и это его первый день нахождения на складе.
А то так получается, что он уже 6 дней находится на складе.

Можно сделать с помощью autonumber() :
СкладTemp:
Load * inline
[
id,data
20,07.01.2016
14,01.01.2016
14,02.01.2016
14,03.01.2016
14,04.01.2016
14,05.01.2016
15,01.01.2016
15,02.01.2016
15,03.01.2016
15,04.01.2016
16,01.01.2016
16,02.01.2016
16,03.01.2016
20,06.01.2016
];


//Сортируем по Товару и Дате + проставляем номер дня
Склад:
LOAD
id as ID,
data as DATA,
'День ' & AutoNumber(data,id) as День_номер,
'1' as IN_STOCK
Resident СкладTemp
Order by id,data;

DROP FIELD DATA;

DROP TABLE СкладTemp;

result:
load
distinct
ID
resident Склад;

temp1:
generic load * resident Склад;

drop table Склад;

FOR j = 0 to NoOfTables()

TableList:
LOAD TableName($(j)) as Tablename AUTOGENERATE 1
WHERE WildMatch(TableName($(j)), 'temp1.*');

NEXT j

FOR k = 1 to FieldValueCount('Tablename')

LET vTable = FieldValue('Tablename', $(k));
LEFT JOIN (result) LOAD * RESIDENT [$(vTable)];
DROP TABLE [$(vTable)];

NEXT k

DROP TABLE TableList;


(https://qliksense-forum.ru/qvf/proxy.php?request=http%3A%2F%2Fi12.pixs.ru%2Fstorage%2F0%2F4%2F9%2FScreenshot_5084866_24891049.png&hash=1dbcc6516bcf994a1a3020a6358aee1d31993acd) (http://pixs.ru/showimage/Screenshot_5084866_24891049.png)
Название: Re: Преобразование даты
Отправлено: tommix от 20 апреля 2017, 07:54:24
ЦитироватьPrive
Можно сделать с помощью autonumber() :

То, что нужно.

Подскажи пожалуйста, как выйти на 7 дне из этого цикла, и дальше не считать.
Так как 99% остатков, как оказывается не лежат дольше 7 дней.
А вот 1% как оказывается может лежать более 2000 дней.
И в итоге вычисления в цикле, выполняются очень долго.
Название: Re: Преобразование даты
Отправлено: Prive от 22 апреля 2017, 06:40:45
Цитата: tommix от 20 апреля  2017, 07:54:24  
Подскажи пожалуйста, как выйти на 7 дне из этого цикла, и дальше не считать.

Можно заранее ограничиться количеством дней при загрузке таблицы Склад, условием Where AutoNumber(data,id) <= 7
Название: Re: Преобразование даты
Отправлено: tommix от 14 июля 2017, 05:21:02
Цитата: Prive от 22 апреля  2017, 06:40:45  

Можно заранее ограничиться количеством дней при загрузке таблицы Склад, условием Where AutoNumber(data,id) <= 7

Да с этим, я разобрался. Все получилось. Но столкнулся с другой проблемой.


Prive, подскажи пожалуйста как можно разобраться со следующей ситуацией:

Товар сначала находился на складе 2 дня подряд, потом пропал на 1 день, А потом вернулся, т.е. в БД это выглядит следующим образом:

СкладTemp:
Load * inline
[
id,data
14,01.01.2016
14,02.01.2016

14,05.01.2016


т.е. 3,4 день товар отсутствовал.
Следовательно весь изложенный алгоритм считает так будто 05.01.2016 - это 3 день, и таким образом его записывает, а на самом деле это 5 день.

У меня был вариант, что на пропущенные даты, нужно сформировать дни с остатком 0, но как,то не особо получилось под каждый id товара сгенерировать дату с остатком = 0.

Не подскажешь, что можно сделать.
Название: Re: Преобразование даты
Отправлено: tommix от 09 августа 2017, 07:00:28
Коллеги, нужна помощь по этой задаче.

Сейчас, с оглядкой на эту подсказку - http://qlikview-forum.ru/qvf/index.php/topic,442.msg809.html#msg809 (http://qlikview-forum.ru/qvf/index.php/topic,442.msg809.html#msg809)
Пытаюсь на пропущенные даты сгенерировать строку с флагом = 0. т.е. пытаюсь сгенерировать отсутствующие дни. 

Но в целом с тем алгоритмом, что выше, пока не удается сделать комплексно работающее решение.
Название: Re: Преобразование даты
Отправлено: admin от 09 августа 2017, 07:36:32
Привет.
Скачай и подключи QVC.
В этой библиотеке есть функция, которая поможет.