Foxtable(狐表)用户栏目专家坐堂 → [灌水]珍惜生命远离关联!


  共有21007人关注过本帖树形打印复制链接

主题:[灌水]珍惜生命远离关联!

帅哥哟,离线,有人找我吗?
狐狸爸爸
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/6/15 15:48:00 [显示全部帖子]

以下是引用fox在2009-6-15 15:46:00的发言:

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


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

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

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/6/15 16:45:00 [显示全部帖子]

以下是引用blackzhu在2009-6-15 16:42:00的发言:
 我想我的问题也是不行的.没有关联我那个表达式不起作用啊!


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


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/6/15 17:06:00 [显示全部帖子]

以下是引用听雪落的声音在2009-6-15 16:59:00的发言:
如果用datacolchange的话,导入数据肯定有大量运算,和关联差不多,不知道会不会影响运行速度。
今晚测试一下看看再说!


这是自然的,但是谁会经常导入大量数据呢?

如果你用的是外部数据源,可以考虑另一个方案:

用OuterTableBuilder生成一个临时外部表,不加载任何数据,专门用于导入数据,因为没有关联和表达式列,所以导入的速度应该很快,导入后再用代码删除这个临时表。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/6/15 17:53:00 [显示全部帖子]

看看DataTable的Compute方法。

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47480 积分:251289 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/6/15 18:26:00 [显示全部帖子]

楼主要么是晕了,要么应该看帮助了,一般表事件才会有e.DataRow这样的e参数的,你写代码的时候,至少应该看一下这个事件有什么e参数属性啊?
而且你这段代码需要e.DataRow吗,明明就是根据循环变量dr计算的啊,正确代码:


For Each dr As DataRow in DataTables("人员信息").DataRows
    dr("退休费")=DataTables("工资变动记录").Compute("Sum(退休费)", "[职工代码] = '" & dr("职工代码") & "'")
    dr("基础性养老金")=DataTables("工资变动记录").Compute("Sum(基础性养老金)", "[职工代码] = '" & dr("职工代码") & "'")
    dr("个人账户养老金")=DataTables("工资变动记录").Compute("Sum(个人账户养老金)", "[职工代码] = '" & dr("职工代码") & "'")
    dr("过渡性养老金")=DataTables("工资变动记录").Compute("Sum(过渡性养老金)", "[职工代码] = '" & dr("职工代码") & "'")
    dr("调节金")=DataTables("工资变动记录").Compute("Sum(调节金)", "[职工代码] = '" & dr("职工代码") & "'")
    dr("福利补贴")=DataTables("工资变动记录").Compute("Sum(福利补贴)", "[职工代码] = '" & dr("职工代码") & "'")
    dr("其他工资")=DataTables("工资变动记录").Compute("Sum(其他工资)", "[职工代码] = '" & dr("职工代码") & "'")
    dr("护理费")=DataTables("工资变动记录").Compute("Sum(护理费)", "[职工代码] = '" & dr("职工代码") & "'")
    dr("自然增长")=DataTables("工资变动记录").Compute("Sum(自然增长)", "[职工代码] = '" & dr("职工代码") & "'")
next

[此贴子已经被作者于2009-6-15 18:26:43编辑过]

 回到顶部