以下是引用lin_hailun在2012-9-1 14:29:00的发言:
如果是这个问题的话,帮你稍微替换了下原先的代码,测试有效,效率自己测试。
Dim s As String = e.Form.Controls("月份").Value
If s <> "" Then
Dim n As Integer = e.Form.Controls("月份").Value
DataTables("月报表").DataRows.Clear
Dim Arys As List(Of String())
Arys = DataTables("入仓").GetUniqueValues("", "型号","规格")
For Each Ary As String() In Arys
Dim r As Row = Tables("月报表").AddNew
r("型号") = Ary(0)
r("规格") = Ary(1)
Next
For Each dr As DataRow In DataTables("月报表").DataRows
Dim s1 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 = '" & s & "'"
'Dim s2 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 < " & n
'Dim Sum,Sum1 As Double
dr("本月入仓_数量") = DataTables("入仓").Compute("Sum(入仓数量)",s1)
dr("本月入仓_金额") = DataTables("入仓").Compute("Sum(入仓金额)",s1)
dr("本月出仓_数量") = DataTables("出仓").Compute("Sum(出仓数量)",s1)
'自己进行统计
Dim s2 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "'"
Dim Sum, Sum1, Sum2 As Double
Sum = 0
Sum1 = 0
Sum2 = 0
Dim drs As List(Of DataRow)
drs = DataTables("入仓").Select(s2, "月份")
Dim mdr As DataRow
For Each mdr In drs
If mdr("月份") >= s Then
Exit For
End If
Sum = Sum + mdr("入仓金额")
Sum1 = Sum1 + mdr("入仓数量")
Next
drs = DataTables("出仓").Select(s2, "月份")
For Each mdr In drs
If mdr("月份") >= s Then
Exit For
End If
Sum2 = Sum2 + mdr("出仓数量")
Next
'Sum = DataTables("入仓").Compute("Sum(入仓金额)",s2)
'Sum1 = DataTables("入仓").Compute("Sum(入仓数量)",s2)
'dr("上月结存_数量") = Sum1 - DataTables("出仓").Compute("Sum(出仓数量)",s2)
dr("上月结存_数量") = Sum1 - Sum2
'-----------------------计算上月结存金额
dr("上月结存_金额") = Sum / Sum1 * dr("上月结存_数量")
'-----------------------
dr("本月加权平均单价") = (dr("上月结存_金额") + dr("本月入仓_金额"))/(dr("上月结存_数量") + dr("本月入仓_数量"))
dr("本月结存_数量") = dr("上月结存_数量") + dr("本月入仓_数量") - dr("本月出仓_数量")
dr("本月结存_金额") = dr("本月加权平均单价") * dr("本月结存_数量")
dr("本月出仓_金额") = dr("本月加权平均单价") * dr("本月出仓_数量")
Next
End If
3000记录25秒,有一点改善,还不能满足要求,希望10000条记录5秒以下,3000条记录2秒以下