既然如此,我重新将已付款列改为逻辑型,然后修改代码,直接在表达式中用1和0代替True和False进行比较:
Dim nms As List(of
String) = DataTables("表A").GetUniqueValues("","客户")
DataTables("表B").StopRedraw()
For Each nm As String In nms
Dim dr As
DataRow =
DataTables("表B").AddNew()
dr("客户") = nm
dr("付款合计") = DataTables("表A").Compute("Sum(金额)", "客户 = '"
&
nm
&
"' And 已付款 = 1")
dr("欠款合计") = DataTables("表A").Compute("Sum(金额)", "客户 = '"
&
nm
&
"' And 已付款 = 0")
Next
DataTables("表B").ResumeRedraw()
在表A为5000行,客户数为1000的时候,执行上述代码所花费的时间为0.23秒,效果非常好。
我用帮助的例子测试了,因为我的机器不太好,我在0.25秒的按钮上测试了三次
第一次: 1.21875
第二次: 0.09875
第三次: 0.092
第四次: 1.015625
为啥 四次的结果不一样.
我后来又加多了一个产品列 又进行了一次测试:
代码如下:
Dim nms As List(of String()) = DataTables("表A").GetUniqueValues("","客户","产品")
DataTables("表B").StopRedraw()
For Each nm As String() In nms
Dim dr As DataRow = DataTables("表B").AddNew()
dr("客户") = nm(0) dr("产品") = nm(1)
dr("付款合计") = DataTables("表A").Compute("Sum(金额)", "客户 = '" & nm(0) & "' And 产品='" & nm(1) & "' And 已付款 = 1")
dr("欠款合计") = DataTables("表A").Compute("Sum(金额)", "客户 = '" & nm & "' And 产品='" & nm(1) & "' And 已付款 = 0")
Next
DataTables("表B").ResumeRedraw()
又进行了四次测试:
第一次: 2.390625
第二次: 1.078125
第三次: 1.09375
第四次: 1.15
测试下来 多一个列的数据 明显慢了很多, 如果加多多列 速度是不是会慢N多倍?