Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
millik89
Contributor II
Contributor II

Остатки на каждый день.

Добрый день.

Сразу скажу что предрасчет остатков на каждый день на этапе загрузки не подходит, от слова совсем. 10 000 номенклатурных позиций * ~20 партий каждая * 10 складов * за последние 2 года  = больше 1 млрд строк.

В качестве источника данных - регистр 1С 7.7. Расчет остатков происходит путем суммирования всех движений до нужной даты.

В модели данных есть таблицы: Регистр, КалендарьРегистра, КалендарьОбщий. КалендарьРегистра связан с Регистром, а КалендарьОбщий болтается отдельно, чтобы выборка в нем не влияла на выборку в регистре.

В Регистре следующие поля (ДатаКодР(для связи календарем), Товар, ТипДвиж, КолДвиж)

Теперь о главном. Я создаю таблицу с измерением Товар и мерой Sum({$<ДатаР={"<=$(=Max(ДатаО))"}>}КолДвиж*ТипДвиж). При выборе ДатыО из общего календаря, происходит расчет остатков на конец последней ДатыО из произведенной выборки. Остаток рассчитывается корректно. Если выборки в ДатеО нет, то остаток просто считается на максимальную ДатуО. Т.е. на выходе получаем простенькую таблицу Товар и его остаток на конец выбранного периода.

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

Я в эту таблицу добавляю измерение ДатаО. Формула меры не понимает, что ДатуО нужно брать из своей строки таблицы, а смотрит глобальную выборку. Соответственно по всем строкам идут одинаковые значения. Я так понимаю это происходит потому что нет ассоциативной связи с этим полем.

Хотя если в таблицу добавить еще одну меру Max(ДатаО), то тут всё верно отображается, а в общей формуле нет. Не могу понять.

Собственно вопрос. Как обойти эту проблему? Как в формуле явно указать, что нужно брать ДатуО из своей строки?

Или может есть иные способы разложить остатки по датам. Опять же, предрасчет не предлагать.

Заранее спасибо.


Вот небольшой скрипт для загрузки примера:

КалендарьОбщий:

Load

Num(Дата) as ДатаКодО,

Date(Дата,'DD.MM.YYYY') as ДатаО;

Load

Date('01.01.2016')+(Iterno()-1) as Дата    

Autogenerate 1

While Date('01.01.2016')+(Iterno()-1) <= Date('31.01.2016');

КалендарьРегистара:

Load

ДатаКодО as ДатаКодР,

ДатаО as ДатаР

Resident КалендарьОбщий;

Регистр:

Load * Inline

[ДатаКодР, Товар, ТипДвиж, КолДвиж

42371,ТоварА,1,1000

42376,ТоварА,-1,450

42380,ТоварА,-1,350

42385,ТоварА,1,1750

42394,ТоварА,-1,550

42400,ТоварА,-1,250

]


Скрин чтобы было нагляднее

qlik.png

1 Solution

Accepted Solutions
Anna_Klimkova
Employee
Employee

Александр,

Для вашей таблицы можно попробовать добавить такую меру:

sum(aggr(sum(DISTINCT if(ДатаР<=ДатаО ,КолДвиж*ТипДвиж))
,ДатаО,ДатаР
))

 

Кроме вашего варианта с Data Island, есть еще способ AsOfDate с созданием нового поля ДатаН, связанного с ДатаР. Каждая дата в ДатаН, соответствует всем датам из ДатаР, предшествующим или равным этой дате. В вашем примере, с 3-м января в ДатаН будут связаны даты с 1-го по 3-е января в ДатаР. Тогда в качестве измерения нужно указывать новое поле ДатаН, а мера совсем простая получится sum(ТипДвиж*КолДвиж). См. пример во вложении.

Рекомендую посмотреть обсуждение аналогичной темы  в нашей группе Qlik Россия и СНГ здесь:

 

https://community.qlik.com/thread/125834

 

             

View solution in original post

2 Replies
Anna_Klimkova
Employee
Employee

Александр,

Для вашей таблицы можно попробовать добавить такую меру:

sum(aggr(sum(DISTINCT if(ДатаР<=ДатаО ,КолДвиж*ТипДвиж))
,ДатаО,ДатаР
))

 

Кроме вашего варианта с Data Island, есть еще способ AsOfDate с созданием нового поля ДатаН, связанного с ДатаР. Каждая дата в ДатаН, соответствует всем датам из ДатаР, предшествующим или равным этой дате. В вашем примере, с 3-м января в ДатаН будут связаны даты с 1-го по 3-е января в ДатаР. Тогда в качестве измерения нужно указывать новое поле ДатаН, а мера совсем простая получится sum(ТипДвиж*КолДвиж). См. пример во вложении.

Рекомендую посмотреть обсуждение аналогичной темы  в нашей группе Qlik Россия и СНГ здесь:

 

https://community.qlik.com/thread/125834

 

             

millik89
Contributor II
Contributor II
Author

Спасибо большое!

Оба варианта работают.