以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 出入库与生产指令的关系 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=139623) |
-- 作者:edisontsui -- 发布时间:2019/8/17 13:52:00 -- 出入库与生产指令的关系 \'自动更新生产指令的已入库数量 If e.DataCol.name = "入库数量" If e.DataRow("指令单号") = "" Else For Each dr As DataRow In DataTables("生产指令").DataRows If dr("指令单号") = e.DataRow("指令单号") And dr("产品代号") = e.DataRow("物料编号") Then dr("已入库数量") = e.DataRow("入库数量") + dr("已入库数量") - e.OldValue Exit For Else Continue For End If Next End If End If 上述代码的目的是:如果“出入库”里面有"入库数量"的变动,就要将“生产指令”里面“已入库数量”进行累计(加或减)。在执行的时候,大部分情况下“已入库数量”的累计结果都是正确的,但是偶尔会发生错误,而且错误的数据偏差很大,不知道是什么原因。那么这段代码是否存在bug呢?谢谢。 |
-- 作者:有点蓝 -- 发布时间:2019/8/17 14:28:00 -- 我觉得这样比较合理一点 If e.DataCol.name = "入库数量" If e.OldValue <> e.NewValue then dim dr as DataRow = DataTables("生产指令").Find("指令单号=\'" & e.DataRow("指令单号") & "\' and 产品代号=\'" & e.DataRow("物料编号") & "\'") if dr isnot nothing then dr("已入库数量") = e.NewValue + dr("已入库数量") - e.OldValue end if End If End If 不过由于表事件模式没有事务控制机制,所以还是会产生误差的。个人建议还是不要使用直接增减库存的方式,而是通过统计获取实时库存。
|
-- 作者:edisontsui -- 发布时间:2019/8/17 14:52:00 -- 请问“直接增减库存的方式”和“统计获取实时库存”是什么意思?上述例子中,是不是用关联表和表达式来更新“生产指令”里面的“已入库数量”比较好? |
-- 作者:有点蓝 -- 发布时间:2019/8/17 15:00:00 -- 统计,顾名思义,就是通过分组统计,如:http://www.foxtable.com/webhelp/topics/2305.htm 来获取实时库存。 直接增减就是直接改库存数量。
|
-- 作者:edisontsui -- 发布时间:2019/8/17 15:18:00 -- 我用了你给的代码,还是一样出错:它会把“出入库”里面的“批号”一列的数据(比如:20180825)也一起加到“生产指令”的“已入库数量”里面去。这是为什么? |
-- 作者:edisontsui -- 发布时间:2019/8/17 15:27:00 -- 我似乎找到原因了。是下面这句的影响: If e.DataCol.name = "入库数量" OrElse e.DataCol.name = "出库数量" OrElse e.DataCol.name = "批号" 我将 OrElse e.DataCol.name = "出库数量" OrElse e.DataCol.name = "批号" 分开另一段来写,就没事了。看看今后情况会怎样再说。谢谢。
|