Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
Ноябрь 21, 2017, 07:26:38 am

Автор Тема: Преобразование даты  (Прочитано 1247 раз)

Оффлайн tommix

  • Гуру
  • ***
  • Сообщений: 125
  • Рейтинг: +6/-0
    • Просмотр профиля
Преобразование даты
« : Январь 12, 2017, 04:36:41 pm »
Добрый день, коллеги.

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



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

Спасибо, за помощь.

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 981
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #1 : Январь 12, 2017, 07:20:14 pm »
Привет.
Сделать очень просто.
Необходимо отсортировать по ID товара и дате, и пронумеровать записи.
Выражение примерно такое:
...
if(id=peek(id),День+1,1) as День,
...

Оффлайн tommix

  • Гуру
  • ***
  • Сообщений: 125
  • Рейтинг: +6/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #2 : Январь 18, 2017, 03:17:15 pm »
Склад:
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 Склад;

Вот, что получилось, но подсчет идет как-то не так. Подскажите пожалуйста, что делаю не так?

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

Re: Преобразование даты
« Ответ #2 : Январь 18, 2017, 03:17:15 pm »

Оффлайн Prive

  • Новичок
  • *
  • Сообщений: 43
  • Страна: ru
  • Рейтинг: +20/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #3 : Январь 20, 2017, 11:19:22 am »
Можно сделать таким образом:


Склад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;

В итоге получаем следующую таблицу:


Оффлайн tommix

  • Гуру
  • ***
  • Сообщений: 125
  • Рейтинг: +6/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #4 : Январь 23, 2017, 05:49:40 pm »
Prive, очень круто, то что нужно.

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

Оффлайн Prive

  • Новичок
  • *
  • Сообщений: 43
  • Страна: ru
  • Рейтинг: +20/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #5 : Январь 24, 2017, 12:01:14 pm »
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;


Оффлайн tommix

  • Гуру
  • ***
  • Сообщений: 125
  • Рейтинг: +6/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #6 : Апрель 20, 2017, 07:54:24 pm »
Цитировать
Prive
Можно сделать с помощью autonumber() :

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

Подскажи пожалуйста, как выйти на 7 дне из этого цикла, и дальше не считать.
Так как 99% остатков, как оказывается не лежат дольше 7 дней.
А вот 1% как оказывается может лежать более 2000 дней.
И в итоге вычисления в цикле, выполняются очень долго.

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

Re: Преобразование даты
« Ответ #6 : Апрель 20, 2017, 07:54:24 pm »

Оффлайн Prive

  • Новичок
  • *
  • Сообщений: 43
  • Страна: ru
  • Рейтинг: +20/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #7 : Апрель 22, 2017, 06:40:45 am »
Подскажи пожалуйста, как выйти на 7 дне из этого цикла, и дальше не считать.

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

Оффлайн tommix

  • Гуру
  • ***
  • Сообщений: 125
  • Рейтинг: +6/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #8 : Июль 14, 2017, 05:21:02 pm »

Можно заранее ограничиться количеством дней при загрузке таблицы Склад, условием 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.

Не подскажешь, что можно сделать.

Оффлайн tommix

  • Гуру
  • ***
  • Сообщений: 125
  • Рейтинг: +6/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #9 : Август 09, 2017, 07:00:28 pm »
Коллеги, нужна помощь по этой задаче.

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

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

Оффлайн admin

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 981
  • Страна: ru
  • Рейтинг: +97/-0
    • Просмотр профиля
Re: Преобразование даты
« Ответ #10 : Август 09, 2017, 07:36:32 pm »
Привет.
Скачай и подключи QVC.
В этой библиотеке есть функция, которая поможет.