以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  这个计算还有什么好的办法  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=120014)

--  作者:blackzhu
--  发布时间:2018/6/5 16:40:00
--  这个计算还有什么好的办法
我计算9000条数据,耗时非常缓慢:


 Dim dic As New Dictionary(Of DataRow, String)
                For Each dr1 As DataRow In DataTables(e.Form.Name & "_Table1").DataRows
                    Dim Filter1 As String = ""
                    Filter1 = "GUID = \'" & dr1("GUID") & "\' And 项目状态 =\'已付款\'"
                    dic.Add(dr1, DataTables(e.Form.Name & "_Table2").Compute("Sum(现金收入)", Filter1) + DataTables(e.Form.Name & "_Table2").Compute("Sum(抵扣收入)", Filter1))
                Next
                For Each dr As DataRow In dic.Keys
                    dr("业绩") = dic(dr)
                Next

这个怎么优化?

帮助的这个代码我也用过:

Dim dic As New Dictionary(of DataRow, String)
Dim
drs As List(of DataRow)
For
Each dr1 As DataRow In DataTables("表A").DataRows
    Dim
dv As Date = dr1("日期")
    Dim
sm As Double = 0
    drs = DataTables("表A").Select("项目 = \'" & dr1("项目") & "\'", "日期") \'注意要根据日期排序
    For
Each dr2 As DataRow In drs
        If
dr2("日期") <= dv Then
            sm = sm + dr2("支出")
        Else
            Exit
For
        End
If
    Next
   
dic.Add(dr1, sm)
Next
For
Each dr As DataRow In dic.Keys
    dr("累计支出") = dic(dr)
Next



--  作者:有点甜
--  发布时间:2018/6/5 17:15:00
--  

你的filter条件没有日期列,不至于导致这种问题。

 

计算一下,是compute导致的问题,还是你其余代码导致的。

 

实例发上来测试。


--  作者:blackzhu
--  发布时间:2018/6/5 17:20:00
--  
还在测试中,这一段速度非常快,但是我还有一段代码是跟这个一样的,只是计算条件不一样,是那一段慢了
--  作者:blackzhu
--  发布时间:2018/6/5 17:28:00
--  
 Dim dic As New Dictionary(Of DataRow, String)
                For Each dr1 As DataRow In DataTables(e.Form.Name & "_Table1").DataRows
                    Dim Filter1 As String = ""
                    Filter1 = "GUID = \'" & dr1("GUID") & "\' And 项目状态 =\'已付款\'"
                    dic.Add(dr1, DataTables(e.Form.Name & "_Table2").Compute("Sum(现金收入)", Filter1) + DataTables(e.Form.Name & "_Table2").Compute("Sum(抵扣收入)", Filter1))
                Next
                For Each dr As DataRow In dic.Keys
                    dr("业绩") = dic(dr)
                Next

另外一段代码是 And 项目状态 in (\'进行中\',\'已完成\')"  这个条件巨慢  还有 项目状态<>\'已付款\'  也是巨慢  这个是什么原因?

--  作者:blackzhu
--  发布时间:2018/6/5 17:32:00
--  
这样的条件 也是慢

Filter2 = "GUID = \'" & ar("GUID") & "\' And (项目状态 = \'已付款\' Or 项目状态=\'已完成\')"


只要改成 

Filter2 = "GUID = \'" & ar("GUID") & "\' And 项目状态 = \'已付款\' 这样 唰的一下 全部计算好了

--  作者:blackzhu
--  发布时间:2018/6/5 17:43:00
--  
==================0.8秒就计算成功==========================================================
Dim dic As New Dictionary(Of DataRow, String)
                dic.Clear()
                For Each dr1 As DataRow In DataTables(e.Form.Name & "_Table1").DataRows
                    Dim Filter1 As String = ""
                    Filter1 = "GUID = \'" & dr1("GUID") & "\' And 项目状态 =\'已付款\'"
                    dic.Add(dr1, DataTables(e.Form.Name & "_Table2").Compute("Sum(现金收入)", Filter1) + DataTables(e.Form.Name & "_Table2").Compute("Sum(抵扣收入)", Filter1))
                Next
                For Each dr As DataRow In dic.Keys
                    dr("业绩") = dic(dr)
                Next
=============下面这段代码巨慢,几乎卡着不动==================================================
                Dim dic1 As New Dictionary(Of DataRow, String)
                dic1.Clear()
                For Each ar As DataRow In DataTables(e.Form.Name & "_Table1").DataRows
                    Dim Filter2 As String = ""
                    Filter2 = "GUID = \'" & ar("GUID") & "\' And 项目状态 in (\'已完成\',\'进行中\')"
                    dic1.Add(ar, DataTables(e.Form.Name & "_Table2").Compute("Sum(现金收入)", Filter2) + DataTables(e.Form.Name & "_Table2").Compute("Sum(抵扣收入)", Filter2))
                Next
                For Each lr As DataRow In dic1.Keys
                    lr("划扣业绩") = dic1(lr)
                Next
[此贴子已经被作者于2018/6/5 17:43:32编辑过]

--  作者:jspta
--  发布时间:2018/6/5 17:45:00
--  
换一个思路
DataTables(e.Form.Name & "_Table2") 这个只加载("项目状态 = \'已付款\' Or 项目状态=\'已完成\'") 


这样Filter就不会有这个条件,自然也就快了。  
以前Computer在数据量大的时候速度慢,现在不知道改进了没有。


--  作者:blackzhu
--  发布时间:2018/6/5 17:46:00
--  
不行,可以这样干 我早干了
--  作者:有点甜
--  发布时间:2018/6/5 17:47:00
--  

如果改成这样呢?

 

Filter2 = "GUID = \'" & ar("GUID") & "\' And (项目状态 = \'已完成\' or 项目状态 = \'进行中\')"


--  作者:blackzhu
--  发布时间:2018/6/5 17:47:00
--  
 Filter2 = "GUID = \'" & ar("GUID") & "\' And 项目状态 in (\'已完成\',\'进行中\')"  目前直接卡死,我在等时间出来