当前库存的计算出问题了!!!

lsj1982 2004-11-21 03:36:46
做了一个库存管理系统要求是每次保存时计算物料的当前库存并保存在数据库中。
我的处理方式如下:
1、读取前一次出入库的物料库存值 m
2、本次操作的库存值=m+本次出入库的数量
问题出现了:当两个人同时对同一物料进行操作时库存的计算出错了。如下所示:
ID 物料编码 入库数量 出库数量 库存
--------------------------------------
28061 ABC 4577 -5378
28065 ABC 14490 9112
28066 ABC 10000 -15378
这是不是因为数据库的刷新时间的原因?应该怎么避免?
不要议论负库存的问题!

...全文
385 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2004-11-23
  • 打赏
  • 举报
回复
>锁定能达到只有一个用户可读取库存表吗,如果不能的说两个用户读取的是同一库存值也会计算错误呀,还有如果独占访问出错怎么处理呀?

锁定仅仅在编辑(悲观锁)或更新(乐观锁)时锁住记录,不允许其他用户同时更改,读取并不受限制。当一个用户改写遇到记录被锁时,应重新读记录,重新计算,再尝试更新。

因为数据库引擎的锁都是针对记录的,所以才需要库存表。因为这样一来,一种物料只要一条记录,可以互锁。

如果你不想使用库存表,可以在服务程序中加锁。比较简单的是,当一个用户更新时,就拒绝其他用户对表更新,只需要一个 Boolean 型变量就可以了。复杂的,你可以利用一个动态数组保存当前正在更新的物料 ID,锁住相同物料的更新企图。
wumylove1234 2004-11-23
  • 打赏
  • 举报
回复
想不明白为什么不用库存表,保存当前所有物料的库存.

在每笔入,出库成功后,改写库存表,然后再Sum当前物料的库存和!
Sum的速度还是相当快的!
lsj1982 2004-11-23
  • 打赏
  • 举报
回复
ryuginka(除了我谁敢用真名:刘银华):
我也考虑过不用库存,但管理者要求知道每一笔出入库后的当前库存,如果不保存的话每次调零件出入库台帐时的计算量不是很大吗?谢谢指教!
lsj1982 2004-11-22
  • 打赏
  • 举报
回复
楼上的兄弟,我也是你那个意思。不知你能不能提供一下解决办法,不胜感激!
Zedee 2004-11-22
  • 打赏
  • 举报
回复
不知道楼主使用的数据库是哪一种,如果是sql server之类的大型数据库,在插入/更新/删除操作时都有锁的机制,数据库中的结果不会有错的,但是在客户端需要有随时刷新的机制。库存确实没有必要特地设一个字段; 入库数量和出库数量是否合并也并不重要,一样可以计算出库存数的

楼主的问题应该是在做28066操作时未读入28065操作的结果,我觉得这和数据库本身关系不大,要看代码是怎么写的了
liangzhunyu 2004-11-22
  • 打赏
  • 举报
回复
建议这样这样

入库数量正数为入库,负数为出库,方便统计,就不用又多出一个字段来记录库存数了。

ID 物料编码 入库数量
--------------------------------------
28061 ABC -4577
28065 ABC 14490

sql=select sum(入库数量) as 库存 from 库存表 where 物料编码='ABC'
set rs=db.execute(sql)
lsj1982 2004-11-22
  • 打赏
  • 举报
回复
of123():
建议添加一个库存表,每一种物料一条唯一记录。当服务端处理交易后,改写库存表。由于同一物料只有一条记录,就可以做到同时访问互锁。
------------------------
1、访问库存表
2、更改库存表
3、零件出入库
4、写入当前库存
以上用事务控制处理。

锁定能达到只有一个用户可读取库存表吗,如果不能的说两个用户读取的是同一库存值也会计算错误呀,还有如果独占访问出错怎么处理呀?

of123 2004-11-22
  • 打赏
  • 举报
回复
哦,明白了。你是在一个表中不断添加入库和出库数据。然后每一笔处理后计算当前库存量。

因为每次都是新记录,所以无法互相锁定。

建议添加一个库存表,每一种物料一条唯一记录。当服务端处理交易后,改写库存表。由于同一物料只有一条记录,就可以做到同时访问互锁。
alern_zyb 2004-11-22
  • 打赏
  • 举报
回复
guoxu_009(迟来) 的方法很好的
guoxu_009 2004-11-22
  • 打赏
  • 举报
回复
对于网络型数据库,对于可能会同时访问的数据表,最好做一个访问锁定。
像你这样子,做个锁定应该就可以了。
饮水需思源 2004-11-22
  • 打赏
  • 举报
回复
1,加一库存表
2,用事务控制处理计算
iser2003 2004-11-22
  • 打赏
  • 举报
回复
如果是SQL SERVER的话建议你还是用视图比较好点,我已经遇到和你一样的问题!
of123 2004-11-22
  • 打赏
  • 举报
回复
你的代码?你使用哪种方式锁定记录集的?
aloka 2004-11-22
  • 打赏
  • 举报
回复
关注
lsj1982 2004-11-22
  • 打赏
  • 举报
回复
回复人: Free_Windy(自由风) ( ) 信誉:100 2004-11-21 18:55:00 得分: 0


你是说网络型数据库吗,指两个人同时访问数据表?

--------------------------------------------
就是C/S结构的,这不只是同时访问数据表,问题就出在同时访问同一条记录。
lsj1982 2004-11-22
  • 打赏
  • 举报
回复
tztz520(午夜逛街):
公司要求是要知道每次出入库后的库存值,如不存储数据的计算量就太大了。就像这样有没有解决办法?
ryuginka 2004-11-22
  • 打赏
  • 举报
回复
能计算出来的就不用保存了。你可以加两个字段,出库数,入库数,
每次做操作时候在上面加,然后库存就等于

起初库存+入库数-出库数。

我们也是这样做的。
Tiger_Zhao 2004-11-22
  • 打赏
  • 举报
回复
关键是库存值不要在程序中计算,直接用一个 SQL 完成:

UPDATE 出入库 A SET 库存 = (SELECT TOP 1 库存 FROM 出入库 B WHERE B.物料编码 = A.物料编码 AND B.ID < A.ID ORDER BY ID) + A.入库数量 - A.出库数量
WHERE A.ID = 28066
vbman2003 2004-11-21
  • 打赏
  • 举报
回复
加一个库存表,入库出库即时更新库存数量。
Free_Windy 2004-11-21
  • 打赏
  • 举报
回复
你是说网络型数据库吗,指两个人同时访问数据表?
加载更多回复(2)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧