以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]一个普遍的核心问题,出库单入库单保存后如何更新其它单据  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=91532)

--  作者:zhangqinyun
--  发布时间:2016/10/12 19:34:00
--  [求助]一个普遍的核心问题,出库单入库单保存后如何更新其它单据
学了狐表好几年了,这个思路问题一直没找到答案。

想给自家工厂做个多人操作的ERP系统。

1.如何处理出库入库单据保存后,相关数据(采购单,销售单)的更新
2.如何保证即时库存的准确性

例如:仓库收到100个物料A,做采购入库单。

操作:1.SQL命令 保存库存明细。
         2.SQL命令 在库存表 物料A行的即时库存列+100。
         3.SQL命令 在采购单表 对应采购单的已入库列中+100,如果已入库数量>=采购数量,关闭采购明细。

这里我用了数据库事务回滚,保证一次执行所有数据。

但是这个方案即时库存可能还是不准确。是否要加一列期初余额,用期初余额+本期入库-本期出库=实际库存 定期来调整即时库存。

请各位大神帮帮忙,我不是专业出生,谢谢
                            
[此贴子已经被作者于2016/10/12 19:45:53编辑过]

--  作者:有点蓝
--  发布时间:2016/10/12 20:40:00
--  
你的不准确具体是指什么?

如果是指产生库存数据丢失,那是代码逻辑有问题。否则使用事务的情况下一般不会出现这种情况。

如果是指库存数量变化和查询之间的不实时,这种情况基本很难避免。

--  作者:zhangqinyun
--  发布时间:2016/10/12 20:44:00
--  
因为很多人都说即时库存直接加减很容易出错,需要用有效入库-有效出库来调整
--  作者:有点蓝
--  发布时间:2016/10/12 21:07:00
--  
事务和逻辑合理就不会出错。

见过的一种做法是,在相关表增加一个标志列
操作时,开启事务,在操作前先查询并更新这个标志值,表示占用状态,如果全部为可操作并更新成功,才开始进行库存操作,这样就会产生行级写锁,保证一个产品只能有一个连接进行更新。但是不影响查询,只不过查询到的只是事务开启之前的数据。
更新完库存后把标志列置为空闲状态,然后提交事务。

这种情况需要快速处理,不能有太多费时的逻辑处理,一般都是扔到存储过程中,整个事务保持在毫秒级,才不会阻塞其它并发处理。