庫存管理機制
出自iDempiere zh
庫存管理是ERP的核心功能之一。在這裡我們一起探尋 iDempiere 庫存管理的機制。
庫存管理核心表
庫存管理核心的表有兩個類別,一類是記錄庫存事務的 ( Inventory Transaction ),一類是記錄庫存數量的 ( Storage )。
- M_Transaction:庫存事務
- M_StorageOnHand:在手庫存
- M_StorageReservation:預留庫存
庫存管理非核心表
其他表可看成是非核心的,例如 M_InOut, M_Inventory,這些表(以及表背後的窗口、進程)不會直接改變庫存事務和庫存數量。
- M_InOut:與銷售或採購相關的出入庫。
- 相關窗口: Shipment ( Customer ) / 發貨給客戶, Material Receipt / 物料收貨, Customer Return / 客戶退貨, Return to Vender / 退貨給供應商
- M_Inventory:內部領用或庫存檔點:
- 相關窗口: Internal Use Inventory / 內部領用 , Physical Inventory / 庫存實盤
- M_Movement:庫存調撥
- 相關窗口:Inventory Move / 庫存調撥
需要注意的幾點
- ADempiere 記錄庫存數量只有一張表 m_storage, iDempiere 則拆分成了兩張表 M_StorageOnHand, M_StorageReservation,而 m_storage 變成了視圖。原因是會導致資料庫鎖死和預留庫存為負。
- 庫存事務、庫存數量兩者非常獨立,在數據表、窗口及後台處理上都是分開的,並不是通過庫存事務來改變庫存數量。換句話說,你在 MTransaction 類里找不到對 MStorageOnHand 類 或 M_StorageReservation 類的調用 。
典型代碼示例
org.compiere.model.MInOut.java
public String completeIt()
{
MStorageReservation.add(); // 更新预留库存
MStorageOnHand.add(); // 更新在手库存
// 更新库存事务
mtrx = new MTransaction ();
mtrx.save();
}
