以文本方式查看主题 - 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) |
-- 作者:有点甜 -- 发布时间: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 (\'已完成\',\'进行中\')" 目前直接卡死,我在等时间出来 |