通过stock.move.line推算理论在手库存 - xiaohao0576/odoo-doc GitHub Wiki
更新调拨时间
如果是滞后生成的调拨单,stock_move和实际情况不一致,需要先把库存调拨时间调整到计划的时间
stock_picking.SCHEDULED_DATE的时间和销售订单中的date_order
时间是一样的,所以调整stock_move的时间就以这个为准
-- 1. 更新 stock_picking 表的 date 和 date_done
UPDATE STOCK_PICKING
SET
DATE = SCHEDULED_DATE,
DATE_DONE = SCHEDULED_DATE
WHERE
SCHEDULED_DATE IS NOT NULL
AND CREATE_DATE > '2025-01-01'
AND PICKING_TYPE_ID = 2;
-- 2. 更新 stock_move 表的 date
UPDATE STOCK_MOVE SM
SET
DATE = SP.SCHEDULED_DATE
FROM
STOCK_PICKING SP
WHERE
SM.PICKING_ID = SP.ID
AND SP.CREATE_DATE > '2025-01-01'
AND SP.SCHEDULED_DATE IS NOT NULL
AND SP.PICKING_TYPE_ID = 2;
-- 3. 更新 stock_move_line 表的 date
UPDATE STOCK_MOVE_LINE SML
SET
DATE = SP.SCHEDULED_DATE
FROM
STOCK_PICKING SP
WHERE
SML.PICKING_ID = SP.ID
AND SP.CREATE_DATE > '2025-01-01'
AND SP.SCHEDULED_DATE IS NOT NULL
AND SP.PICKING_TYPE_ID = 2;
-- 4.更新stock_valuation_layer的创建日期
UPDATE stock_valuation_layer svl
SET
create_date = SM.DATE
FROM
STOCK_move SM
WHERE
svl.stock_move_id = sm.id
AND SM.DATE > '2025-01-01';
SELECT
PP.ID AS PRODUCT_ID,
PP.BARCODE AS BARCODE,
COALESCE(
SUM(
CASE
WHEN SML.LOCATION_DEST_ID = 8 THEN SML.QUANTITY
WHEN SML.LOCATION_ID = 8 THEN - SML.QUANTITY
ELSE 0
END
),
0
) AS QTY_THEORETICAL
FROM
PRODUCT_PRODUCT PP
LEFT JOIN STOCK_MOVE_LINE SML ON PP.ID = SML.PRODUCT_ID
AND SML.STATE = 'done'
AND (
SML.LOCATION_ID = 8
OR SML.LOCATION_DEST_ID = 8
)
-- 这里指定截至日期的库存
AND SML.DATE <= '2025-12-31 17:00:00'
WHERE
PP.ID > 0 --这里可以指定具体的产品ID
GROUP BY
PP.ID
ORDER BY
PP.ID;
使用方法
- 把所有的location_id 和 location_dest_id都更换为需要查询的库存地点
- SML.DATE可以指定库存截至日期, 其实也可以指定开始日期,去查询一段时间的库存净变动
- PP.ID可以过滤出指定的产品
查询区间出入数量和净变动
SELECT
PP.ID AS PRODUCT_ID,
PP.BARCODE AS BARCODE,
COALESCE(
SUM(
CASE
WHEN SML.LOCATION_DEST_ID = 8 THEN SML.QUANTITY
ELSE 0
END
),
0
) AS QTY_IN, -- 入库数量
COALESCE(
SUM(
CASE
WHEN SML.LOCATION_ID = 8 THEN SML.QUANTITY
ELSE 0
END
),
0
) AS QTY_OUT, -- 出库数量
COALESCE(
SUM(
CASE
WHEN SML.LOCATION_DEST_ID = 8 THEN SML.QUANTITY
WHEN SML.LOCATION_ID = 8 THEN - SML.QUANTITY
ELSE 0
END
),
0
) AS QTY_NET_CHANGE -- 净变动
FROM
PRODUCT_PRODUCT PP
LEFT JOIN STOCK_MOVE_LINE SML ON PP.ID = SML.PRODUCT_ID
AND SML.STATE = 'done'
AND (
SML.LOCATION_ID = 8
OR SML.LOCATION_DEST_ID = 8
)
AND SML.DATE >= '2024-01-01 00:00:00' -- 开始时间
AND SML.DATE <= '2025-12-31 23:59:59' -- 截止时间
WHERE
PP.ID > 0
GROUP BY
PP.ID
ORDER BY
PP.ID;