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

Для разработчиков => Вопросы по Qlik Sense & QlikView => Тема начата: roman от 28 августа 2017, 06:07:00

Название: Расчет остатков на конкретную дату
Отправлено: roman от 28 августа 2017, 06:07:00
В таблице есть возможность в качестве измерения выбрать дату, неделю, месяц, квартал, год.

Есть основная таблица в которой содержится 2 типа данных - остаток на конец месяца (OnHandEoM) и приход+расход на каждый день (InventTrans).

Есть таблица с календарем в которой содержится для каждой даты информация о принадлежности каждой конкретной даты к типу периода.

Например, для 3 июля есть 1 запись с типом OnHand_SoM Для определения начала месяца
Дата;_ДатаКлюч
3.07.17;30.06.17

И есть 3 записи с типом OnHand_Sum
Дата;_ДатаКлюч
3.07.17;1.07.17
3.07.17;2.07.17
3.07.17;3.07.17

Соответственно имеем формулу для расчета остатков на конкретную дату:
Sum({<ТипПериода={'OnHand_SoM'}, ТипДокумента={'OnHandEoM'}>} Количество) + Sum({<ТипПериода={'OnHand_Sum'}, ТипДокумента={'InventTrans'}>} Количество)

Первая сумма ищет сумму по всем остаткам на конец месяца, вторая сумму всех движений с начала месяца по указанную в измерении дату.

Данная формула работает если в измерении указывать месяц или дату, но если выбрать например неделю, то в период OnHand_SoM попадают 2 записи, если неделя содержит данные из двух разных месяцев.
Можно как-то в set expression определить значение минимальной даты начальных остатков?
Отсюда же следует второй вопрос, например, в таблице есть данные по промо акциям, есть дата начала промо акции и дата ее окончания, в каждой строке они разные, можно как-то определить в формуле эту дату для расчета остатков на начало и конец промо акции?
Название: Re: Расчет остатков на конкретную дату
Отправлено: admin от 01 сентября 2017, 07:26:05
Привет.

Вопрос по остаткам неоднократно обсуждался
Посмотрите по темам: ссылка (http://qlikview-forum.ru/qvf/index.php?action=search2;params=eJxLTClLzEtOTalRrzGoUapJKgKxjHSMdUx0THUsdAwNdQxNgeLFGfnl8cn5uQU5qSWpQBUgodKkrNTkkvj8vJxKqEh-UQmQVZSakwo2FCoUn5JZBBROSS1OBomkJhYlZwD5FxsubLjYeLH9wtaLTQoX9gGZTUCBpgu7Luy7sAkAv0JBfw..)
Название: Re: Расчет остатков на конкретную дату
Отправлено: roman от 04 сентября 2017, 05:35:05
К сожалению ни вариант с if, ни вариант с предрасчетом остатков не подходят :( слишком большой объем данных. Хотелось бы уточнить возможность подстановки именно в сет анализ дату, зависящую от двух других дат / от даты конца выбранного периода (день/неделя/месяц/квартал) в сводной/прямой таблице. Но я остановился на том что формулы Max/Min возвращают одинаковые значения во всех строках аггрегируя данные по всей текущей выборке.
Название: Re: Расчет остатков на конкретную дату
Отправлено: admin от 04 сентября 2017, 06:58:54
Привет, а вариант с "as of table"? Неплохой вариант, кстати.
Насколько большие данные?
Расчет остатков - задача требующая ресурсов. Объем работы примерно одинаков при любом способе.
Если остатки рассчитаны заранее - будет большой массив, но графики, скажем по дате будут строиться махом при любых изменениях выборки, а при выборе "формульных" вариантов - каждый раз будут рассчитываться и съедать память.
Так что, здесь надо экспериментировать. Взять фрагмент/период и протестировать на нем все варианты.
Поэтому и нет однозначного ответа - как лучше считать остатки.
Название: Re: Расчет остатков на конкретную дату
Отправлено: roman от 04 сентября 2017, 11:37:59
Остатков под 20 миллионов записей за месяц. Данные с 2013, выходит около миллиарда записей.

Имеется в виду этот способ?
ЦитироватьКроме вашего варианта с Data Island, есть еще способ AsOfDate с созданием нового поля ДатаН, связанного с ДатаР. Каждая дата в ДатаН, соответствует всем датам из ДатаР, предшествующим или равным этой дате. В вашем примере, с 3-м января в ДатаН будут связаны даты с 1-го по 3-е января в ДатаР. Тогда в качестве измерения нужно указывать новое поле ДатаН, а мера совсем простая получится sum(ТипДвиж*КолДвиж).
У меня по сути этот вариант и реализован, но с перенаправлением дат из выборки на другие даты в источнике данных, например, остаток на начало месяца с любого дня месяца перенаправляет на конец предыдущего месяца. Этот вариант работает прекрасно если нет деления на подпериоды, т.е. остатки на конец периода или на месяц, или на конкретный день. Проблема с остатком на неделю и квартал, в которые могут попасть остатки на начало месяца из 2 - 3 разных месяцев. Сегодня придумал костыль - в таблице календаре завести поля с флагами недели и месяца, которые нужно учитывать, например в прошлой неделе нужно промаркировать дни августа '0', а дни сентября '1'. и тогда если добавить в set expression ФлагНедели={1}, то перестанут попадать лишние месяцы. Но при этом формула перестает работать, если например в выборке ограничить период 28-31 августа и сгруппировать данные понедельно, т.к. не будет ни одного дня с флагом = 1.
Вот и получается пока возможным реализовать этот расчет с кучей вариаций формул в зависимости от группируемого периода через 3 выражения и условным отображением.

Ну и с самым неприятным - остатками на начало и конец промо это никак не поможет.
Нашел такое решение: KeyAutonumber = {"=(ДатаНачалаАкции = Дата)"}, в поле сравниваемом хранится значение true. Но у меня не вышло, есть подозрение что для корректной работы такой формулы ДатаНачалаАкции и Дата должны быть в одной таблице, а у меня это разные и объединить их невозможно.