2 Replies Latest reply: May 10, 2016 3:54 PM by Aleksandr Melnikov RSS

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

    Aleksandr Melnikov

      Добрый день.

       

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

        • Re: Остатки на каждый день.
          Anna Klimkova

          Александр,

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

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

           

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

           

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

           

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