Foxtable(狐表)用户栏目专家坐堂 → 这个计算还有什么好的办法


  共有2753人关注过本帖树形打印复制链接

主题:这个计算还有什么好的办法

帅哥哟,离线,有人找我吗?
blackzhu
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57646 威望:0 精华:15 注册:2008/9/1 9:45:00
这个计算还有什么好的办法  发帖心情 Post By: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



 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/6/5 17:15:00 [只看该作者]

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

 

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

 

实例发上来测试。


 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  3楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57646 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2018/6/5 17:20:00 [只看该作者]

还在测试中,这一段速度非常快,但是我还有一段代码是跟这个一样的,只是计算条件不一样,是那一段慢了

 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  4楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57646 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By: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
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57646 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2018/6/5 17:32:00 [只看该作者]

这样的条件 也是慢

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


只要改成 

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

 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57646 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By: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
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1732 积分:11272 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2018/6/5 17:45:00 [只看该作者]

换一个思路
DataTables(e.Form.Name & "_Table2") 这个只加载("项目状态 = '已付款' Or 项目状态='已完成'") 


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


 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  8楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57646 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2018/6/5 17:46:00 [只看该作者]

不行,可以这样干 我早干了

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/6/5 17:47:00 [只看该作者]

如果改成这样呢?

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  10楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57646 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2018/6/5 17:47:00 [只看该作者]

 Filter2 = "GUID = '" & ar("GUID") & "' And 项目状态 in ('已完成','进行中')"  目前直接卡死,我在等时间出来

 回到顶部
总数 22 1 2 3 下一页