Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
请先设置好外部数据源
运行“存货报表”的窗口,目标框选择“手册名称”、“批号”和“仓库名称”,都能运行;选择“存货代码”程序就死了。
我从早上到现在一直在调试,都搞不好,还请各位出手。
下载信息 [文件大小: 下载次数: ] | |
![]() |
下载信息 [文件大小: 下载次数: ] | |
![]() |
我的过程,先把代码改为:
'限定试用期
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个表,慢是非常正常的。
哈哈,不是死,是慢,一直在高速运行,没有办法做出相应,你等24小时可能会ok.
但是,有这个需求!
现在有上万种产品,总不能让领导少发明些产品品种!!!
哈哈,不是死,是慢,一直在高速运行,没有办法做出相应,你等24小时可能会ok.
如果让领导等24个小时,软件就会被否掉的。
呵呵,既然事实和理论已经证明这个设计不行,你就调整思路啊。
FoxTable自身的统计速度,不也曾经有过上千倍的提升吗,设计嘛,就得不断地摸索调整。
按“手册名称”、“存货代码”为分组列,“期初数量”、“入库数量”、“出库数量”和“期末数量”为统计列
我今天想了一整天,想破了脑袋,也没有想出来。还要贺老师出马。