以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  分页流水账的统计  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=115875)

--  作者:elfing
--  发布时间:2018/3/15 22:30:00
--  分页流水账的统计
设计了一个分页加载的流水账,但是需要对库存进行统计,如果使用如下代码,每次重置所有产品的库存需要大量的时间,而且数据量越大越慢,想请教有没有效率更高的代码可以用来统计每个产品的实时库存?
以下内容为程序代码:

1 Dim dt1 As Integer = DataTables("半成品流水").sqlCompute("Sum(入库)","半成品件号 = \'" & e.DataRow("半成品件号") & "\'")
2 Dim dt2 As Integer = DataTables("半成品流水").sqlCompute("Sum(出库)","半成品件号 = \'" & e.DataRow("半成品件号") & "\'")
3 e.DataRow("库存") = dt1 - dt2


--  作者:有点甜
--  发布时间:2018/3/15 22:44:00
--  

不要用重置列,单独写一个代码计算,如

 

Dim dt As Datatable = DataTables("半成品流水")
Dim dic As new Dictionary(of String, Double)
For Each dr As DataRow In dt.Select("")
    Dim key = dr("半成品件号")
    If dic.ContainsKey(key) = False Then
        Dim dt1 As Integer = dt.sqlCompute("Sum(入库)","半成品件号 = \'" & key & "\'")
        Dim dt2 As Integer = dt.sqlCompute("Sum(出库)","半成品件号 = \'" & key & "\'")
        dr("库存") = dt1 - dt2
        dic.Add(key,  dt1 - dt2)
    Else
        dr("库存") = dic(key)
    End If
Next


--  作者:elfing
--  发布时间:2018/3/15 23:23:00
--  时间
多谢
试验了一下,以重置的方式计算大概30秒,以代码计算方式大概28秒,这已经是最快的方式了吗?分页流水账只使用了一个月不到,如果后面数据更多是不是每次加载都会特别慢?

--  作者:有点甜
--  发布时间:2018/3/15 23:37:00
--  

关键是执行了多少次 sqlCompute 函数,每一次执行都是很耗时的。

 

或者试试改成下面这样,如果还是耗时,做具体实例发上来测试优化

 

systemready = false
Dim dt As Datatable = DataTables("半成品流水")
Dim dic As new Dictionary(of String, Double)
For Each dr As DataRow In dt.Select("")
    Dim key = dr("半成品件号")
    If dic.ContainsKey(key) = False Then
        Dim dt1 As Integer = dt.sqlCompute("Sum(入库)","半成品件号 = \'" & key & "\'")
        Dim dt2 As Integer = dt.sqlCompute("Sum(出库)","半成品件号 = \'" & key & "\'")
        dr("库存") = dt1 - dt2
        dic.Add(key,  dt1 - dt2)
    Else
        dr("库存") = dic(key)
    End If
Next
systemready = true