收录日期:2019/05/20 13:10:01 时间: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,锁住相同物料的更新企图。

能利用网页通过CDHtmlDialog来做出漂亮的界面吗? 求---适应窗口分辨率代码 大厨做菜 和 英雄模式 关于合并结果集的问题 有人做过基于状态机的程序架构嘛!交流交流 求一SQL语句 MyEclipse7.5打开时出现问题 __flash__removeCallback的js错误 调查,你用boost解决过哪些问题? 【倒版--只为那种感觉】 VC6.0中怎么创建调用创建文件对话框 apache中关于IPv6配置的问题 初学者问加油站加气站的3D仿真问题 asp远程 调用 access 在spring的hibernate中批量插入百万条数据 关于scjp 请教一个sql包含子查询的语句 建立BIOS 论坛 如何用filter修改request的URI? PB12 Public CTP版出来了,sybase有下载,我正在下载 请教count(0)和count(*)哪个效率高? 如何防止公司文档被复制 自定义事件无效 【天】 大家目前开发direct show时用的是什么版本 关于迷宫搜索的思路 (响应:那点广告都搞不定的还是挨踢人吗?)关于如何屏蔽CSDN的广告 NeatUpload控件,问题很严重! 我怎么SQL Server定时执行我需要的语句? 字符集问题