以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [灌水]珍惜生命远离关联!  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=3149)

--  作者:听雪落的声音
--  发布时间:2009/6/15 15:34:00
--  [灌水]珍惜生命远离关联!
两个表,父表5000多条记录,子表将近40000,每个表十几列,导入数据半个小时了,硬是没有反应。没办法,删除关联重新导入,大概花了十分钟。
然后重新建立关联,打开窗口,窗口中有一个datalist控件,然后又是十几分钟的等待,没有反应,删除关联,重新应用窗口,三秒左右打开。
额滴神啊!为啥差距咋恁大呢?

--  作者:狐狸爸爸
--  发布时间:2009/6/15 15:43:00
--  

你有多少个关联啊?影响这么大? 可以考虑动态建立和删除关联。

也可以看看下面的,完全不用关联:

 

关联和性能。


Foxtable的双向关联功能,使得相关数据信手拈来,为我们查看数据带来了极大的便利。
但是关联较多的时候,对于性能是有较大影响的,会使打开项目的速度变慢,系统的反映也变得迟钝。
在批量修改数据、同步表、以及导入和合并数据时,这种影响更为明显。
我们可以关闭双向功能,减轻这种影响。

如果你追求极致的性能,或者觉得关联带来的影响已经严重拖累了系统性能,仅仅靠关闭双向关联还不足以解决这个问题,但是又离不开关联,毕竟关联是数据管理的基本功能,那么该怎么办呢?鱼和熊掌能够兼得吗?
当然可以,首先我们可以通过代码动态建立和删除关联,只有在需要的时候才建立某个关联,而在进行特定的操作之前,则删除这个关联,这样就不至于因为关联的存在而影响性能。
但是动态建立和删除关联,对于一般用户较难掌控,所以本节介绍一下如何在不建立关联的情况下,一一实现关联带来的所有功能,让我们鱼和熊掌兼得。


方案一


首先请打开CaseStudy目录下的文件:关联的替代.Table
在这个文件中,产品表和订单表没有建立关联,但是我们希望能够象已经建立关联一样,在产品表选择一个产品的时候,自动显式该产品的所有订单。
 

实现步骤:


1、新建一个窗口,窗口类型为停靠,停靠位置为底端。

2、插入一个Table控件,绑定到订单表

3、窗口的AfterLoad事件设为:


With
Tables("产品")
   
If .Current Is Nothing Then
        Tables
("订单").Filter = "False"
   
Else
        Tables
("订单").Filter = "产品编号 = " & .Current("产品编号")
   
End IF
End
With


4、关闭窗口设计器,回到产品表,打开表属性设置窗口,将其CurrentChanged事件设为:


If
Forms("窗口1").Opened Then
    If
e.Table.Current Is Nothing Then
        Tables
("订单").Filter = "False"
   
Else
        Tables
("订单").Filter = "产品编号 = " & e.Table.Current("产品编号")
   
End IF
End
If


5、现在我们打开窗口1,可以看到在产品表选择一个产品,窗口1中的Table能够自动列出该产品的订单。
此方案实际上是直接将订单表,也就是
Tables("订单")插入到产品表的窗口1中,然后在产品表中选择不同的产品时,动态修改订Tables("订单")的Filter属性,使得Tables("订单")只显示选定产品的订单。
因为直接用
Tables("订单")来模拟实现关联表Tables("产品.订单"),所以我们可以直接在产品表中调用订单表的原窗口来输入数据;我们已经在订单表设计了一个窗口,名为"订单编辑",你可以在窗口1中选择一个订单,然后单击按钮“编辑订单”,即可编辑此选定的订单。


6、到目前为止,还有一个不足,就是选择窗口1的Table,然后增加一个订单,不能象关联表一样,新增行自动输入产品编号。
要做到这一点很简单,选择订单表,将其DataRowAdding事件的代码设为:


If
MainTable.Name = "产品" Then
    e.
DataRow("产品编号") = MainTable.Current("产品编号")
End
If


这样在窗口1中新增一个订单时,能够自动输入订单编号。


7、最后我们希望订单表能够自动调用产品表的单价,为此将订单表的DataColChanged事件设为:


If
e.DataCol.Name = "产品编号" Then
    Dim dr As DataRow = DataTables("产品").Find("产品编号 = " & e.DataRow("产品编号"))
    If
dr IsNot nothing
Then
        e.
DataRow("单价") = dr("单价")
    End
If
End
If


经过上述设置,窗口1中的Table控件,表现得完全就像一个关联表。

 

这个方案有一个不足:当我们将主表切换到订单表的时候,你会发现,什么也看不到,因为Tables("订单")被挪到产品表的窗口1了。
当然我们可以通过MainTableChanged事件,实现相关窗口的自动关闭和打开,来解决这个问题。
但是这样还是有不足,至少维护起来较为苦难,而且切换主表的时候,屏幕闪烁也是一个难题,所以接下来我们看看方案二。

 

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:关联的替代.table

[此贴子已经被作者于2009-6-15 16:49:40编辑过]

--  作者:fox
--  发布时间:2009/6/15 15:46:00
--  

建议兄弟用一下 后台数据库自己的关联 ,比如SQL ACCESS 自己带的关联 比FOXTABLE的关联专业点


--  作者:yangming
--  发布时间:2009/6/15 15:48:00
--  

楼主是不是关联列比较多?


--  作者:狐狸爸爸
--  发布时间:2009/6/15 15:48:00
--  
以下是引用fox在2009-6-15 15:46:00的发言:

建议兄弟用一下 后台数据库自己的关联 ,比如SQL ACCESS 自己带的关联 比FOXTABLE的关联专业点


这话说得真是的,你这样很容易误导人的。

[此贴子已经被作者于2009-6-15 15:48:28编辑过]

--  作者:mr725
--  发布时间:2009/6/15 16:05:00
--  
是呀,有时就是不知道什么原因,我原来生成总帐的一个按钮,一般情况下5-10秒内就能生成,但有好几次要用1、2分钟,最长用了我5分钟生成完总帐,全是内部表。可最近又特神了,1、2秒中就可以生成了!~  主要的代码基本没有修改(原来的)。原因可能有两个:
1、是狐表性能提高了; 2、是使用了压缩功能。其他就不知道为什么了!!!

--  作者:blackzhu
--  发布时间:2009/6/15 16:32:00
--  

 关联的替代,会不会影响做在报表和表中表达式?
举例:[@订单.订单明细,XS]. 或者 Sum(Child.金额).如不影响,我就可以将关联删除.这样打开的速度可以快一点.


--  作者:mr725
--  发布时间:2009/6/15 16:35:00
--  
2楼的例子 连关联列在子表(或窗口)中也可以修改? 这个成问题了,最少要给个提示,如:你真想修改关联列数据吗?
不然会找不到这个关联了。。。。
--  作者:blackzhu
--  发布时间:2009/6/15 16:42:00
--  
 我想我的问题也是不行的.没有关联我那个表达式不起作用啊!
--  作者:狐狸爸爸
--  发布时间:2009/6/15 16:45:00
--  
以下是引用blackzhu在2009-6-15 16:42:00的发言:
 我想我的问题也是不行的.没有关联我那个表达式不起作用啊!


可以不用表达式列,用数据列加代码解决。
也不用对这个过敏,大多数时候,这种影响并没有什么关系的。