以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  出入库与生产指令的关系  (http://www.foxtable.com/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 = "批号" 分开另一段来写,就没事了。看看今后情况会怎样再说。谢谢。