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


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

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

帅哥哟,离线,有人找我吗?
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



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


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

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

 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  3楼 | 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
  4楼 | 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
  5楼 | 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编辑过]

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


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

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

 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  7楼 | 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 ('已完成','进行中')"  目前直接卡死,我在等时间出来

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


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

以下是引用有点甜在2018/6/5 17:47:00的发言:

如果改成这样呢?

 

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



稍微快点 需要90秒以上


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


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

我改成这样了



Dim st As Date = Date.Now

                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 项目状态 ='已完成'"
                    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
                dic1.Clear()
                For Each ar As DataRow In DataTables(e.Form.Name & "_Table1").DataRows
                    Dim Filter2 As String = ""
                    Filter2 = "GUID = '" & ar("GUID") & "' And 项目状态 = '进行中'"
                    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("划扣业绩") = lr("划扣业绩") + dic1(lr)
                Next
                MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")


也是没有办法的办法了.


我本来就是加载的视图

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


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57646 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2018/6/5 18:03:00 [显示全部帖子]

以下是引用有点甜在2018/6/5 17:55:00的发言:

 

方法一:那就用select计算,循环每一行(一次),计算各个GUID的值的统计值,记录到字典里面待用;

 

方法二:直接分组统计生成统计表,直接调用统计表值。



每次计算的方式不一样,不然我只要做个分组统计就可以了,先按照方法这个搞了再说.


 回到顶部
总数 14 1 2 下一页