Как посчитать дни, в которые количество товара в наличии было 0 за месяц? в оду - PullRequest
0 голосов
/ 17 февраля 2020

Как просто посчитать дни, в которые количество товара в наличии было 0 за месяц. Любая помощь будет оценена! Спасибо!

/ Я пытаюсь запросить. Но это слишком сложно ^^ /

1 Ответ

0 голосов
/ 18 февраля 2020

Сначала необходимо определить «день, когда количество товара на складе равно 0», потому что количество может сильно измениться в течение дня из-за движения запасов. Это может быть «количество в наличии равно 0 в каждую минуту дня» или «количество в наличии равно 0 в 23:59:59 дня».

Я думаю, что есть два подхода:

  1. Рассчитайте количество под рукой, используя stock.move на временной шкале и посмотрите, сколько 0. Это хорошо работает, если вы хотите использовать вычислительную мощность для замены дискового пространства и если вы хотите сделать отчет сейчас, используя существующие данные.
  2. Создайте новую модель для хранения количества под рукой из stock.quant с указанием c время суток. Это легче кодировать, но работает только для будущих отчетов и не работает хорошо, если вам нужно проверять несколько временных точек в день.

Для первого подхода вы можете сделать SQL, чтобы получить количество в наличии в , заданное c момент времени , рассчитанное по stock.move.

Если вам не важно местоположение и вам просто нужно количество в наличии, сгруппированное по продуктам:

WITH AGG AS
  (SELECT stock_move.product_id AS "PP",
          ROUND(stock_move.quantity_done / uom_uom.factor, 2) AS "Base_Qty_Done"
   FROM stock_move
   LEFT OUTER JOIN product_product ON product_product.id = stock_move.product_id
   LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
   LEFT OUTER JOIN uom_uom ON stock_move.product_uom = uom_uom.id
   WHERE product_template.type = 'product'
     AND stock_move.state = 'done'
     AND date <= '2020-01-01 07:00:00'
     UNION
    ALL
     SELECT stock_move.product_id AS "PP",
            - ROUND(stock_move.quantity_done / uom_uom.factor, 2) AS "Base_Qty_Done"
     FROM stock_move
     LEFT OUTER JOIN product_product ON product_product.id = stock_move.product_id
     LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
     LEFT OUTER JOIN uom_uom ON stock_move.product_uom = uom_uom.id WHERE product_template.type = 'product'
     AND stock_move.state = 'done'
     AND date <= '2020-01-01 07:00:00' ),
     CALC AS
  (SELECT AGG."PP",
          sum(AGG."Base_Qty_Done") "Base QoH"
   FROM AGG
   GROUP BY AGG."PP")
SELECT product_product.default_code "Reference",
       CALC."Base QoH" "Qty Calculated From Stock Move",
       uom_category.name "Base UoM Of"
FROM CALC
LEFT OUTER JOIN product_product ON product_product.id = CALC."PP"
LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
LEFT OUTER JOIN uom_uom ON product_template.uom_id = uom_uom.id
LEFT OUTER JOIN uom_category ON uom_category.id = uom_uom.category_id
WHERE CALC."Base QoH" = 0
ORDER BY CALC."PP"

Если вам нужно количество под рукой для каждого продукта на местоположение:

WITH AGG AS
  (SELECT stock_move.product_id AS "PP",
          stock_move.location_dest_id AS "Loc",
          ROUND(stock_move.quantity_done / uom_uom.factor, 2) AS "Base_Qty_Done"
   FROM stock_move
   LEFT OUTER JOIN product_product ON product_product.id = stock_move.product_id
   LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
   LEFT OUTER JOIN uom_uom ON stock_move.product_uom = uom_uom.id
   WHERE product_template.type = 'product'
     AND stock_move.state = 'done'
     AND date <= '2020-01-01 07:00:00'
     UNION
    ALL
     SELECT stock_move.product_id AS "PP",
            stock_move.location_id AS "Loc", - ROUND(stock_move.quantity_done / uom_uom.factor, 2) AS "Base_Qty_Done"
     FROM stock_move
     LEFT OUTER JOIN product_product ON product_product.id = stock_move.product_id
     LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
     LEFT OUTER JOIN uom_uom ON stock_move.product_uom = uom_uom.id WHERE product_template.type = 'product'
     AND stock_move.state = 'done'
     AND date <= '2020-01-01 07:00:00' ),
     CALC AS
  (SELECT AGG."PP",
          AGG."Loc",
          sum(AGG."Base_Qty_Done") "Base QoH"
   FROM AGG
   GROUP BY AGG."PP",
            AGG."Loc")
SELECT product_product.default_code "Reference",
       stock_location.name "Location",
       CALC."Base QoH" "Qty Calculated From Stock Move",
       uom_category.name "Base UoM Of"
FROM CALC
LEFT OUTER JOIN product_product ON product_product.id = CALC."PP"
LEFT OUTER JOIN stock_location ON stock_location.id = CALC."Loc"
LEFT OUTER JOIN product_template ON product_template.id = product_product.product_tmpl_id
LEFT OUTER JOIN uom_uom ON product_template.uom_id = uom_uom.id
LEFT OUTER JOIN uom_category ON uom_category.id = uom_uom.category_id
WHERE CALC."Base QoH" = 0
ORDER BY CALC."PP"

Измените все '2020-01-01 07:00:00' в запросе на желаемый момент времени и повторите для всех точек на вашей шкале времени ( если только один раз, вы можете вручную составить отчет с помощью SQL и Excel, если нет, напишите какой-нибудь код).

Для второго подхода - запрос количества в наличии на один продукт на местоположение это просто.

SELECT stock_quant.product_id "PP ID", 
       stock_quant.location_id "Location ID", 
       Sum(stock_quant.quantity) "QoH"
FROM   stock_quant 
GROUP  BY stock_quant.location_id, 
          stock_quant.product_id 

Вам понадобится написать новую модель с задачей schedueld для хранения данных с заданным интервалом.

Я бы порекомендовал метод 1, это больше работы но использует меньше места на диске, и вы можете o отчеты за любой период времени, включая прошлое.

...