以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  不好意思,程序死机问题,测试了一天,不能解决,来求助。  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=9468)

--  作者:lihe60
--  发布时间:2011/4/15 14:45:00
--  不好意思,程序死机问题,测试了一天,不能解决,来求助。

请先设置好外部数据源

运行“存货报表”的窗口,目标框选择“手册名称”、“批号”和“仓库名称”,都能运行;选择“存货代码”程序就死了。

我从早上到现在一直在调试,都搞不好,还请各位出手。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:东山6.rar

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:db1.rar

[此贴子已经被作者于2011-4-15 14:44:48编辑过]

--  作者:狐狸爸爸
--  发布时间:2011/4/15 15:06:00
--  

我的过程,先把代码改为:

 

\'限定试用期
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个表,慢是非常正常的。


--  作者:lihe60
--  发布时间:2011/4/15 15:16:00
--  
慢是可以理解的,但死程序就不能理解了。
--  作者:狐狸爸爸
--  发布时间:2011/4/15 15:34:00
--  

哈哈,不是死,是慢,一直在高速运行,没有办法做出相应,你等24小时可能会ok.

 

图片点击可在新窗口打开查看


--  作者:lihe60
--  发布时间:2011/4/15 16:11:00
--  
如果按“手册名称”、“存货代码”为分组列,“期初数量”、“入库数量”、“出库数量”和“期末数量”为统计列,如何写代码,速度可以容忍的?
--  作者:狐狸爸爸
--  发布时间:2011/4/15 16:20:00
--  
因为此时行数不多。
--  作者:lihe60
--  发布时间:2011/4/15 16:32:00
--  
以下是引用lihe60在2011-4-15 16:11:00的发言:
如果按“手册名称”、“存货代码”为分组列,“期初数量”、“入库数量”、“出库数量”和“期末数量”为统计列,如何写代码,速度可以容忍的?

但是,有这个需求!

 

现在有上万种产品,总不能让领导少发明些产品品种!!!

[此贴子已经被作者于2011-4-15 16:33:54编辑过]

--  作者:lihe60
--  发布时间:2011/4/15 16:35:00
--  
以下是引用狐狸爸爸在2011-4-15 15:34:00的发言:

哈哈,不是死,是慢,一直在高速运行,没有办法做出相应,你等24小时可能会ok.

 

图片点击可在新窗口打开查看

如果让领导等24个小时,软件就会被否掉的。


--  作者:狐狸爸爸
--  发布时间:2011/4/15 16:36:00
--  

呵呵,既然事实和理论已经证明这个设计不行,你就调整思路啊。

FoxTable自身的统计速度,不也曾经有过上千倍的提升吗,设计嘛,就得不断地摸索调整。

[此贴子已经被作者于2011-4-15 16:38:45编辑过]

--  作者:lihe60
--  发布时间:2011/4/15 16:39:00
--  

按“手册名称”、“存货代码”为分组列,“期初数量”、“入库数量”、“出库数量”和“期末数量”为统计列

 

我今天想了一整天,想破了脑袋,也没有想出来。还要贺老师出马。

[此贴子已经被作者于2011-4-15 16:55:48编辑过]