进销存系统库存管理入门:库存数量的计算与维护
进销存系统库存管理入门:库存数量的计算与维护
到这一篇为止,你会明显感觉到:
系统开始有“约束”和“规则”了。
一、为什么库存不能“随便改一个数字”?
很多初学者在系统里会这么设计库存:
quantity = 100
然后在界面上:
- 入库 →
quantity + 10 - 出库 →
quantity - 5
表面看没问题,但这是一个严重的系统设计错误。
二、库存的本质是什么?
库存不是一个“数”,而是一个结果。
库存 = 所有入库 − 所有出库
也就是说:
- 库存是“计算出来的”
- 不是“随便填出来的”
这就是为什么真实系统中:
几乎没有“手动改库存”的功能
三、库存变化一定来源于“业务行为”
库存只允许被以下行为影响:
| 行为 | 影响 |
|---|---|
| 采购入库 | 库存增加 |
| 销售出库 | 库存减少 |
| 盘点调整 | 特殊处理 |
不允许:
直接在界面写:库存 = 999
直接 UPDATE stock SET quantity = ?
四、库存管理的最小逻辑模型
我们当前系统采用的是简化模型:
- 每个商品只有一条库存记录
- 库存数量只通过业务操作变动
表结构回顾:
CREATE TABLE stock (
id INT PRIMARY KEY IDENTITY(1,1),
product_id INT NOT NULL,
quantity INT NOT NULL DEFAULT 0,
update_time DATETIME DEFAULT GETDATE()
);
五、入库 / 出库的核心思想
入库逻辑
当前库存 + 入库数量
出库逻辑(必须校验)
当前库存 - 出库数量 >= 0
如果不满足:
不允许出库
六、实现“库存增加”逻辑(入库)
private void IncreaseStock(int productId, int amount)
{
string sql = @"
UPDATE stock
SET quantity = quantity + @amount,
update_time = GETDATE()
WHERE product_id = @productId";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@amount", amount);
cmd.Parameters.AddWithValue("@productId", productId);
cmd.ExecuteNonQuery();
}
}
注意:
不是先查 → 再算 → 再更新
而是数据库内完成计算
七、实现“库存减少”并防止负数
先查询当前库存
private int GetCurrentStock(int productId)
{
string sql = "SELECT quantity FROM stock WHERE product_id = @productId";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@productId", productId);
return Convert.ToInt32(cmd.ExecuteScalar());
}
}
出库前校验
private bool DecreaseStock(int productId, int amount)
{
int currentStock = GetCurrentStock(productId);
if (currentStock < amount)
{
MessageBox.Show("库存不足,无法出库!");
return false;
}
string sql = @"
UPDATE stock
SET quantity = quantity - @amount,
update_time = GETDATE()
WHERE product_id = @productId";
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@amount", amount);
cmd.Parameters.AddWithValue("@productId", productId);
cmd.ExecuteNonQuery();
}
return true;
}
库存为负,是系统级 Bug,不是数据问题

浙公网安备 33010602011771号