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

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: tommix от 16 марта 2015, 04:34:33

Название: Подсчет остатков в Qlikview и Qlik Sense
Отправлено: tommix от 16 марта 2015, 04:34:33
(https://leto25d.storage.yandex.net/rdisk/77e6582204be2f07911d1729b4316807f8a006543911899dc182eefe802b9ff7/inf/KvrrXHwHkMbw7MAhpMJST0yxI_BczMRepr_Nr-Dr_5vKtL4RycaXwv6Vs4XoLFN1QUWRw5funXEEVYjyQktIaQ==?uid=0&filename=Screenshot_1.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&tknv=v2&rtoken=7149a2ec49fb063621af20442bc85647&force_default=no)

Нужно подсчитать через сколько месяцев закончатся складские остатки (Табличка: Прогноз запасов). Подскажите  в какую сторону копать?
Название: Re: Подсчет остатков
Отправлено: admin от 17 марта 2015, 08:45:51
Добрый день.

Сорри, за нерасторопность.
Тема, затронутая Вами - широка и интересна. :)
Во-первых необходимо определиться с моделью данных и таблицами.
Прогноз продаж должен выглядеть примерно так:
Поля: Продукт, Период, Количество

В таком же ключе и остатки, кстати какие именно? На начало или конец периода? Полагаю, что начальные.
Самый простой и понятный способ решения - в скрипте.
Потребуется сформировать колонку с предполагаемым остатком. Сделать несложно, по аналогии с заполнением курсами валют выходных и праздничных дней.
Для расчета количества месяцев - будем использовать выражения.
Пример постараюсь сделать в ближайшее время.
Название: Re: Подсчет остатков
Отправлено: tommix от 17 марта 2015, 02:30:34
Чувствую что в выражении для подсчета количества месяцев должно использоваться rangecount(), но пока как не знаю. 
Название: Re: Подсчет остатков
Отправлено: tommix от 17 марта 2015, 03:36:21
Пока в голову пришел такой вариант, но как его осуществить?

A - Остатки
B - Прогноз продаж

Если А>B, то
Если А1>B1, то A-B=A2
Если А2>B2, то A2-B2=A3
...
Если Аn>Bn, то An-Bn=An

Потом через rangecount подсчитать количество операций вычитания и разобраться с хвостиком.

Если  0>А/B<1, то An/B=C

Количество операций вычисления + С, в итоге получим количество месяцев. 
Название: Re: Подсчет остатков
Отправлено: admin от 17 марта 2015, 03:55:21
А если скриптом привести к такому виду:
[smg id=79]
И никаких сложностей с выражением.
Название: Re: Подсчет остатков
Отправлено: tommix от 17 марта 2015, 04:10:20
А выложи скрипт посмотреть, пожалуйста.
Название: Re: Подсчет остатков
Отправлено: admin от 17 марта 2015, 05:05:17
 :) ОК, как напишу - обязательно выложу.
Это модель.
Название: Re: Подсчет остатков
Отправлено: tommix от 17 марта 2015, 05:17:02
Вопрос возник с подсчетом
Название: Re: Подсчет остатков
Отправлено: tommix от 17 марта 2015, 05:49:11
И еще не до конца понимаю, как через скрипт можно вывести подсчет, что бы он показывал конкретное число на сколько хватит остатков.
Название: Re: Подсчет остатков
Отправлено: admin от 17 марта 2015, 06:54:25
Под рукой нет инструмента  :(
На картинке флаговое поле f5, если есть прогнозный остаток то 1, если прогнозный остаток на конец месяца меньше 0, то процент остатка на прогноз продаж.
В объектах визуализации можно просто вывести sum(f5)
В скрипте можно сделать немало, peek() & previous() помогут  при расчете остатка по периодам прогноза.
Название: Re: Подсчет остатков
Отправлено: tommix от 18 марта 2015, 09:10:24
Понятно, в скрипте посчитать можно через флаговое поле.
Название: Re: Подсчет остатков
Отправлено: admin от 18 марта 2015, 10:53:50
Вот примерчик:

//Источники
ПрогнозПродаж:
LOAD * INLINE [
    Товар, Период, Прогноз продаж
    Продукт 1, 201501, 10
    Продукт 1, 201502, 20
    Продукт 1, 201503, 0
    Продукт 1, 201504, 0
    Продукт 1, 201505, 5
    Продукт 1, 201506, 0
    Продукт 1, 201507, 10
    Продукт 2, 201501, 5
    Продукт 2, 201502, 7
    Продукт 2, 201503, 0
    Продукт 2, 201504, 10
    Продукт 2, 201505, 15
    Продукт 2, 201506, 2
    Продукт 2, 201507, 0
    Продукт 2, 201508, 4
];
ТекущийОстаток:
join LOAD * INLINE [
    Товар, Период, ОстатокФакт
    Продукт 1, 201501, 37
    Продукт 2, 201501, 37
];
//Избавляемся от NULL для расчетов
ПрогнозПродаж0:
NoConcatenate
LOAD Товар, Период, [Прогноз продаж],
if(len(ОстатокФакт)=0,0,ОстатокФакт) as ОстатокФакт
resident ПрогнозПродаж;
DROP Table ПрогнозПродаж;


Прогноз:
NoConcatenate
LOAD *,

if(peek(Товар)<>Товар, [ОстатокФакт]-[Прогноз продаж], // если новая группа записей по товару
peek([Остаток31])-[Прогноз продаж]) as [Остаток31], // считаем прогноз остатка по прогнозу продаж
if(if(peek(Товар)<>Товар,[ОстатокФакт]-[Прогноз продаж],peek([Остаток31])-[Прогноз продаж])>=0,1,
if(peek([Остаток31])>0,peek([Остаток31])/[Прогноз продаж],0) ) as ФлагОстатка
Resident ПрогнозПродаж0
Order by Товар, Период;

DROP Table ПрогнозПродаж0;
Название: Re: Подсчет остатков
Отправлено: tommix от 18 марта 2015, 11:55:21
Здорово!  :) Блин все так просто. Спасибо.
Но возникло несколько вопросов:
1) А если у нас несколько остатков. Допустим 201501 и 201505, то тогда тот остаток который 201505, он его просто не считает. А как учесть что бы то же считал?

2) А как посчитать на каждую дату остаток, что бы можно было посмотреть сколько остатков останется на каждый день?
Название: Re: Подсчет остатков
Отправлено: admin от 18 марта 2015, 12:19:17
Что значит несколько остатков?
Мы делаем прогноз, следовательно следует опираться на какой-то рубеж до которого прогноз уже не прогноз, а факт, и после которого факт перестает быть фактом и становится прогнозом.
Принимаем какой-нибудь период за этот рубеж и формируем таблицу текущих остатков на эту дату.
Следовательно прогнозы до этой даты уже не прогнозы, если нам не требуется анализировать совпадение прогнозов, но и в этом случае прогноз становится уже прогнозом прошлого периода.

Расчет остатков по датам, как и по периодам, с той лишь разницей, что нам потребуется растянуть остатки на каждую календарную дату, даже если не было фактов движения.
То есть надо брать календарь, и на каждую дату считать остатки.
Название: Re: Подсчет остатков
Отправлено: tommix от 18 марта 2015, 01:10:36
Понятно, а если реализовывать, через выражение. Не подскажите куда двигаться?
Название: Re: Подсчет остатков
Отправлено: admin от 18 марта 2015, 02:50:22
Документация и эксперименты  :)
Возьмем помощь зала (http://community.qlik.com/message/734423#734423)  ;)
Название: Re: Подсчет остатков
Отправлено: tommix от 18 марта 2015, 03:00:18
Спасибо, пошел ставить эксперименты.
Название: Re: Подсчет остатков
Отправлено: admin от 19 марта 2015, 09:14:02
Посмотрите эту тему, по составлению выражения. (http://qlikview-forum.ru/qvf/index.php/topic,491.0.html)
Название: Re: Подсчет остатков
Отправлено: tommix от 19 марта 2015, 05:43:57
Евгений, еще не подскажите как

if(peek(Товар)<>Товар, [ОстатокФакт]-[Прогноз продаж], // если новая группа записей по товару
peek([Остаток31])-[Прогноз продаж]) as [Остаток31], // считаем прогноз остатка по прогнозу продаж
if(if(peek(Товар)<>Товар,[ОстатокФакт]-[Прогноз продаж],peek([Остаток31])-[Прогноз продаж])>=0,1,
if(peek([Остаток31])>0,peek([Остаток31])/[Прогноз продаж],0) ) as ФлагОстатка


Вывести в цикле? Как я понимаю, из-за peek он и не выводиться.
Название: Re: Подсчет остатков
Отправлено: admin от 19 марта 2015, 05:50:29
Поподробнее, в каком цикле?
Название: Re: Подсчет остатков
Отправлено: tommix от 19 марта 2015, 06:30:35
Что бы рассчитать прогноз остатка в каждом месяце, как я понимаю нужно использовать цикл (For...Next).

Что бы получилось следующее:
(https://leto13f.storage.yandex.net/rdisk/ec9ce369f5b8a353cf839055dc6bdb81fc5e8a2cea0f378b831789da06d2abba/inf/YoLzeBwAElG5L5SPAmexZh9N5pYDumMT31q820JB2Vn6gq536aWRK4CDLN9iOApaRz5ZeHo7MzmDa79QVMoT8A==?uid=0&filename=Screenshot_1.png&disposition=inline&hash=&limit=0&content_type=image%2Fpng&tknv=v2&rtoken=120fc57984f441dbe06f00024d216c25&force_default=no)
Название: Re: Подсчет остатков
Отправлено: admin от 19 марта 2015, 07:47:00
Т.е. исходные данные прогнозные полностью?
Остатки будущего периода тоже прогнозируем?
Цикл не нужен, просто добавьте периоды с прогнозными остатками в таблицу "текущие остатки" и посмотрите как сработает скрипт. И станет понятно, что надо будет поправить.
Название: Re: Подсчет остатков
Отправлено: tommix от 25 марта 2015, 02:32:16
Т.е. исходные данные прогнозные полностью? - Да.
Остатки будущего периода тоже прогнозируем? - Да.

Самостоятельно не получилось сделать периоды с прогнозными остатками в таблицу "текущие остатки" и посмотрите как сработает скрипт, не подскажите как?