以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  目录树双击筛选  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=8818)

--  作者:实话实说
--  发布时间:2010/12/10 20:48:00
--  目录树双击筛选

以下是产品表目录树双击节点筛选代码,双击后约10多秒才筛选出来,而产品表只有2000条记录,如果是2万条记录,岂不更长时间,而双击筛选是经常操作。

Dim Value()As String
Value = e.Node.FullPath.Split("\\")
Select Case e.Node.Level
    Case 0
        Tables("产品").Filter ="[产品分类] = \'" & Value(0) & "\'"
    Case 1
        Tables("产品").Filter ="[产品分类] = \'" & Value(0) & "\' And [型号] = \'" & Value(1) & "\'"
End Select


--  作者:狐狸爸爸
--  发布时间:2010/12/11 0:11:00
--  

你厉害,别说是筛选2000行,就是加载2000行,也不应该超过0.3秒,你居然整出个10秒来。

这和双击还是单击,没有任何关系的,自己好好找找原因吧,搞不定就做例子传上来。
要善于运用排除法,既然你怀疑双击不行,那就将代码设置在单击事件中,如果效果一样,不就排除了双击的原因吗?

 

下面这个表就是2000行,双击目录树节点筛选,快的时候是0秒,慢的时候是0.015秒,也比你快666倍:

 

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

[此贴子已经被作者于2010-12-11 1:17:49编辑过]

--  作者:实话实说
--  发布时间:2010/12/11 8:28:00
--  

我准确计算了一下,目录树筛选要5-6秒。先说明一下,我现在是2个表:[产品]表和[用料]表,[用料]表是[产品]表的子表,目录树筛选的是[产品]表,当子表没有记录时,筛选很快,现在子表有8000条记录,所以筛选慢了,是这样吗?2表是关联表。

 

我的案例是开发版做的,需要的话我发上来。

[此贴子已经被作者于2010-12-11 8:29:22编辑过]

--  作者:狐狸爸爸
--  发布时间:2010/12/11 10:10:00
--  

这个文件有关联,父表2000行,子表8000行,筛选一样很快啊: 

 

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

 

开发版的狗也支持商业版的foxtable,你将数据导出,用商业版做个例子吧。

既然现在排除了双击和关联的影响,你也可以继续用排除法,逐个删除可能有影响的表事件来测试,看看原因到底在哪,这通常都是因为存在不合理的代码造成的。

[此贴子已经被作者于2010-12-11 10:16:14编辑过]

--  作者:实话实说
--  发布时间:2010/12/11 10:46:00
--  

我想代码应该不会有问题,都是按照帮助做的,而且关联数据少的时候目录树筛选也很快,问题可能出在关联,[产品]表和[用料]表的关联我是用了三个字段[产品分类]、[型号]、[规格],会不会是关联字段太多影响了筛选速度。

 

之前,我也是用主表的_Identify与子表的ID进行关联,但操作人员不愿意在子表一个一个的录入,而是希望通过复制EXCEL表的数据,这样就修改成现在的关联,实在没办法。


--  作者:狐狸爸爸
--  发布时间:2010/12/11 10:59:00
--  

1、那就先改为一个字段关联,看看究竟是不是关联的原因,怀疑什么,就去验证什么,不要只停留在猜想阶段。

2、即使用主表的_Identify与子表的ID关联,子表的[产品分类]、[型号]、[规格]一样可以自动输入,甚至连代码也不用写,直接在子表加入三个表达式列,引用父表数据即可。

[此贴子已经被作者于2010-12-11 11:05:25编辑过]

--  作者:实话实说
--  发布时间:2010/12/11 11:11:00
--  

1、我等下去验证;

2、我需要的不是[产品分类]、[型号]、[规格]的自动录入,而是大批量从EXCEL表复制,由于ID关联,所以不行。


--  作者:狐狸爸爸
--  发布时间:2010/12/11 11:53:00
--  

呵呵,我用多列关联也一样啊:

 

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


--  作者:实话实说
--  发布时间:2010/12/11 12:15:00
--  

我还是传上来,请狐爸帮我看一下

窗口表:BOM窗口

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


--  作者:狐狸爸爸
--  发布时间:2010/12/11 13:14:00
--  

1、这个问题和窗口、目录树已经是否双击,都没有任何关系,因为你就是在产品表直接通过菜单筛选都是很慢的。

2、将用料表的计算用料和单价两列的表达式删除,筛选即可回到正常速度。

3、你的设计不太好,就这么几个表,居然有这么多关联,而且全是多列关联。

4、意外的一个发现,用料表的PrepareEdit事件为:

 

Dim tb As New DropTreeBuilder
tb.SourceTable = DataTables("材料") \'指定目录树表
tb.TreeCols = "材料分类|材料名称|型号规格" \'指定用于生成目录树的列
tb.ReceiveCols = "材料分类|材料名称|型号规格" \'指定数据接收列
Tables("用料").Cols("材料分类").DropTree = tb.Build() 

 

居然没有进行任何的判断,例如是否是材料分类列,是否是焦点单元格,等于每选择一个单元格就执行一次这样的代码,效率极低,这样的代码最多在MainTableChanged设置即可,而且还要判断一下主表是否是用料表,才予以执行。

[此贴子已经被作者于2010-12-11 13:16:34编辑过]