收录日期:2019/03/20 19:56:20 时间:2016/05/31 07:14:34 标签:VB基础类
做了一个库存管理系统要求是每次保存时计算物料的当前库存并保存在数据库中。
我的处理方式如下:
1、读取前一次出入库的物料库存值 m
2、本次操作的库存值=m+本次出入库的数量
问题出现了:当两个人同时对同一物料进行操作时库存的计算出错了。如下所示:
ID    物料编码     入库数量      出库数量     库存
--------------------------------------
28061   ABC                        4577      -5378
28065   ABC           14490                   9112    
28066   ABC                        10000     -15378 
这是不是因为数据库的刷新时间的原因?应该怎么避免?
不要议论负库存的问题!     

用ADO的方法找开数据操作库存后在关闭此数据库。
不用存这个值吧.能算出来的都不用存进去 .
你是说网络型数据库吗,指两个人同时访问数据表?
加一个库存表,入库出库即时更新库存数量。
tztz520(午夜逛街):
    公司要求是要知道每次出入库后的库存值,如不存储数据的计算量就太大了。就像这样有没有解决办法?
回复人: Free_Windy(自由风) ( ) 信誉:100  2004-11-21 18:55:00  得分: 0  
 
 
   你是说网络型数据库吗,指两个人同时访问数据表?
  
--------------------------------------------
就是C/S结构的,这不只是同时访问数据表,问题就出在同时访问同一条记录。 
关注
你的代码?你使用哪种方式锁定记录集的?
如果是SQL SERVER的话建议你还是用视图比较好点,我已经遇到和你一样的问题!
1,加一库存表
2,用事务控制处理计算
对于网络型数据库,对于可能会同时访问的数据表,最好做一个访问锁定。
像你这样子,做个锁定应该就可以了。
guoxu_009(迟来) 的方法很好的
哦,明白了。你是在一个表中不断添加入库和出库数据。然后每一笔处理后计算当前库存量。

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

建议添加一个库存表,每一种物料一条唯一记录。当服务端处理交易后,改写库存表。由于同一物料只有一条记录,就可以做到同时访问互锁。
of123():
建议添加一个库存表,每一种物料一条唯一记录。当服务端处理交易后,改写库存表。由于同一物料只有一条记录,就可以做到同时访问互锁。
------------------------
1、访问库存表
2、更改库存表
3、零件出入库
4、写入当前库存
以上用事务控制处理。

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

建议这样这样

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

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

sql=select sum(入库数量) as 库存 from 库存表 where 物料编码='ABC'
set rs=db.execute(sql)
不知道楼主使用的数据库是哪一种,如果是sql server之类的大型数据库,在插入/更新/删除操作时都有锁的机制,数据库中的结果不会有错的,但是在客户端需要有随时刷新的机制。库存确实没有必要特地设一个字段; 入库数量和出库数量是否合并也并不重要,一样可以计算出库存数的

楼主的问题应该是在做28066操作时未读入28065操作的结果,我觉得这和数据库本身关系不大,要看代码是怎么写的了
楼上的兄弟,我也是你那个意思。不知你能不能提供一下解决办法,不胜感激!
关键是库存值不要在程序中计算,直接用一个 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
能计算出来的就不用保存了。你可以加两个字段,出库数,入库数,
每次做操作时候在上面加,然后库存就等于

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

我们也是这样做的。
ryuginka(除了我谁敢用真名:刘银华):
我也考虑过不用库存,但管理者要求知道每一笔出入库后的当前库存,如果不保存的话每次调零件出入库台帐时的计算量不是很大吗?谢谢指教!
想不明白为什么不用库存表,保存当前所有物料的库存.

在每笔入,出库成功后,改写库存表,然后再Sum当前物料的库存和!
Sum的速度还是相当快的!
>锁定能达到只有一个用户可读取库存表吗,如果不能的说两个用户读取的是同一库存值也会计算错误呀,还有如果独占访问出错怎么处理呀?

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

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

如果你不想使用库存表,可以在服务程序中加锁。比较简单的是,当一个用户更新时,就拒绝其他用户对表更新,只需要一个 Boolean 型变量就可以了。复杂的,你可以利用一个动态数组保存当前正在更新的物料 ID,锁住相同物料的更新企图。

为什么显示dataGrid老是要自己点开表 有查看网际网的本机IP地址的工具? 请教高手:有没有办法可以沏底的解决win2003的终端服务过期问题?谢谢!!! 一个简单的c++问题 高手们请指教,关于ASP+XML的问题! selecttree(如何在选子菜单的同时把它上面的所有父菜单都选上) 这句SQL有什么问题? 请教各位高手,帮忙看看吧,先谢谢了! SQL SERVER 2000数据库还原 *****小问题****** 对游标精的朋友请帮忙,这个怎么写? 各位,我很拿不定主意,请过来人帮忙给些建议。 9i登录问题??急!!! 一个服务器中的两个应用系统之间能共享Session吗? WINDOWINFO 这个东西需要什么头文件啊 如何创建数据库? text类型从mssql7.0导数据到sql2000中,为什么数据库中看到有数据,asp页面里却读不出来,显示为空白 各位,我很拿不定主意,请过来人帮忙给些建议。 父子窗体之间消息处理问题~~~~~~~~~~~~~~ asp中 将字符 型的 数据 转化 成数值 型的 函数 是什么 ??? 如何寫這樣的SQL語句 请问,怎样获得鼠标在屏幕任意地方的点击位置? COM串口通信问题,谢谢高手! 散分:ASP.NET 1.0.3705.0 与 1.0.3705.6018 的区别 高手指点数据窗口颜色问题???? 有免费的qq号码,能够上网,在公司内部是不是一定能上qq啊? 怎么实现 变维数组 就是用 变量 n 来确定 数组的维数,并遍历数组 有关提交的问题,我都急了, 如何实现功能和界面的分离? 请教关于OnCtlColor