我的过程,先把代码改为:
'限定试用期
If vars("截止日期")>vars("测试")
vars("截止日期")=vars("测试")
End If
If vars("起始日期")=Nothing Or vars("截止日期")=Nothing
MessageBox.Show("请设置起始日期和截止日期!")
Return
End If
'定义变量及赋值
Dim t As Table=Tables("" & e.Form.name & "_table1")
vars("操作表")=Tables("" & e.Form.name & "_table1")
t.sort="" '有用
t.ClearSubtotal
DataTables("存货报表").DataRows.Clear()
Dim s As String
s=e.Form.controls("cb1").text
Dim cmd As New SQLCommand
Dim dt As DataTable
For Each cn As Connection In Connections
If vars("外部数据源")=cn.Name
cmd.ConnectionName =vars("外部数据源")
End If
Next
cmd.CommandText = "SELECT DISTINCT " & s & " From {数据库}"
dt = cmd.ExecuteReader()
messagebox.show(1)
Dim f As New Filler
f.SourceTable = dt '指定数据来源
f.SourceCols = "" & s & "" '指定数据来源列
f.DataTable = DataTables("存货报表") '指定数据接收表
f.DataCols ="" & s & "" '指定数据接收列
'f.ExcludeNullValue=True
'f.filter="" & filter & " 公司名称='" & _公司名称 & "'"
f.Fill() '填充数据
messagebox.show(2)
For Each dr0 As DataRow In dt.DataRows
DataTables("过度表").Fill("Select " & s & ", sum(数量) As 数量,sum(金额) As 金额 From {数据库} where " & s & "='" & dr0("" & s & "") & "' and 单据类型 Like '%入库%' and 日期<=#" & vars("起始日期") & "# Group by " & s & "","" & vars("外部数据源") & "",True)
For Each dr As Row In T.Rows
Dim r As DataRow
r = DataTables("过度表").Find("" & s & "='" & dr(s) & "'") '找出编号为03的产品
If r IsNot Nothing
dr("数量1")=r("数量")
dr("期初数量")=dr("数量1")-dr("数量2")
dr("期末数量")=dr("期初数量")+dr("入库数量")-dr("出库数量")
End If
Next
Next
messagebox.show(3)
然后执行测试,结果显示到2的时候没有反应,说明问题出在第三段,然后分析第三段代码:
For Each dr0 As DataRow In dt.DataRows
DataTables("过度表").Fill("Select " & s & ", sum(数量) As 数量,sum(金额) As 金额 From {数据库} where " & s & "='" & dr0("" & s & "") & "' and 单据类型 Like '%入库%' and 日期<=#" & vars("起始日期") & "# Group by " & s & "","" & vars("外部数据源") & "",True)
For Each dr As Row In T.Rows
Dim r As DataRow
r = DataTables("过度表").Find("" & s & "='" & dr(s) & "'") '找出编号为03的产品
If r IsNot Nothing
dr("数量1")=r("数量")
dr("期初数量")=dr("数量1")-dr("数量2")
dr("期末数量")=dr("期初数量")+dr("入库数量")-dr("出库数量")
End If
Next
Next
可以看出,你遍历了dt中的所有行,而且每行都执行一次fill, 这是一个非常低效的设计,Fill加载一个表,当你选择存货代码时,dt表中的数据有13000多行,要执行fill方法13000多次,等于是加载13000多个表,平时的系统有几十个表,打开项目都很慢,而你执行一次操作等于要加载13000个表,慢是非常正常的。