跳至內容
Astera Technology

倉內有貨,扣除已預留數量後還可接多少訂單?

分開顯示實物存貨、已確認預留及可用數量,避免把預留貨再答應給另一位客戶。

先訂清楚要判斷甚麼,再準備資料

預留貨品未必已出庫,但已不能自由分配。先按貨品合計已確認的預留數,再從盤點數扣除。沒有預留紀錄的貨品也要保留在報表,用零作預留數,不能因為接不到資料便漏掉整款貨品。

以下全部是假設資料。請在新的 SQLite 測試資料庫建立各表,再執行唯讀查詢。數量以件計,金額以港元的分作整數儲存;顯示港元時除以 100。

假設輸入節錄;完整相關資料見下方 SQL
編號貨品編號數量狀態代碼
1A8confirmed
2A3cancelled
3B5confirmed
下載可編輯 CSV ↓
可直接執行的完整假設資料(SQLite)
CREATE TABLE stock(sku TEXT PRIMARY KEY, opening_qty INTEGER, counted_qty INTEGER);
CREATE TABLE movements(id INTEGER PRIMARY KEY, sku TEXT, qty INTEGER, moved_on TEXT);
CREATE TABLE reservations(id INTEGER PRIMARY KEY, sku TEXT, qty INTEGER, status TEXT);
CREATE TABLE transfers(id INTEGER PRIMARY KEY, sku TEXT, sent_qty INTEGER, received_qty INTEGER, sent_on TEXT);
INSERT INTO stock VALUES ('A',10,12),('B',8,3),('C',6,6);
INSERT INTO movements VALUES (1,'A',5,'2026-10-01'),(2,'A',-2,'2026-10-02'),(3,'B',-5,'2026-10-03'),(4,'C',0,'2026-08-01');
INSERT INTO reservations VALUES (1,'A',8,'confirmed'),(2,'A',3,'cancelled'),(3,'B',5,'confirmed');
INSERT INTO transfers VALUES (1,'A',7,4,'2026-10-05'),(2,'B',2,2,'2026-10-06');

執行查詢,核對實際結果

SQLite 唯讀查詢
WITH held AS (
 SELECT sku,SUM(qty) AS reserved_qty FROM reservations
 WHERE status='confirmed' GROUP BY sku
)
SELECT s.sku,s.counted_qty,COALESCE(h.reserved_qty,0) AS reserved_qty,
       s.counted_qty-COALESCE(h.reserved_qty,0) AS available_qty
FROM stock s LEFT JOIN held h ON h.sku=s.sku ORDER BY s.sku;
以上 SQLite 假設資料的查詢結果
貨品編號盤點數量已預留可用數量
A1284
B35-2
C606
下載可編輯 CSV ↓

A 可再分配 4 件;B 只有 3 件,卻已預留 5 件,短缺 2 件;C 的 6 件全部可用。B 要決定補貨或重新分配,也可能需要重點盤查。把負數顯示成零只會遮蓋問題,已取消的預留則不應佔用貨量。

按資料範圍使用結果

此計算未包括將到貨、最低存量、批次到期或跨倉調貨,不能當作完整交期承諾模型。

本例的建表、資料及結果已在 SQLite 執行。套用時先在系統測試副本調整欄位及狀態規則,再與流程負責人核對預期結果。其他資料庫平台未經測試。

相關資源