Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
假定产品表和订单表已经通过品名建立了关联,关联的名称为“产品_订单”。
产品表和订单表都有单价列,其中订单表中的单价数据来自于产品表。
通常我们会在订单表新建一个名为“单价”的表达式列,将其表达式设为:
Parent(产品_订单).单价。
这样订单表就可以引用产品表中对应产品的单价。
但是采用表达式列会有以下棘手的问题:
1、如果产品表没有某产品的资料,需要在订单表中手工输入单价的时候,你会发现你是没有办法在订单表的单价列输入数据的。
2、如果这是一个特殊的订单,需要一个例外的价格,同样你会发现,订单表的单价数据是无法修改的。
3、如果从某一天开始,需要按照新的价格销售产品,于是你修改产品表的单价数据,但是修改后你会发现订单表原有订单的单价数据会全部自动更新为新的单价,显然这不是我们所希望的。
上述问题不是表达式列所能解决的,更甚的是,我们可能因为某些特殊原因,并没有在产品表和订单表之间建立关联,此时采用表达式列来引用产品单价根本就无从谈起。
所以我们有必要介绍另一种跨表引用数据的方法,这个方法不使用表达式,而且不管这两个表之间是否建立了关联,此方法应该同样有效。
以上面介绍的订单表引用产品表的单价为例,首先要确保订单表中的单价列不是表达式列,而是标准的数据列,然后在订单表的DataColChanged事件中设置如下代码:
1 |
If e.DataCol.Name = "品名" Then '如果内容发生变动的是品名列 |
现在要求在订单表输入或修改某订单的数量后,能够即时更新统计表对应产品的数量统计值。
为此可将订单表的DataColChanged事件代码设置为:
If e.DataCol.Name = "数量" Then
Dim pr As DataRow
pr = DataTables("统计").Find("产品 = '" & e.DataRow("产品") & "'")
If pr IsNot Nothing Then
pr("数量")= pr("数量") + e.NewValue - e.OldValue
End If
……………………
将订单表的DataColChanged事件代码设置为:
Select Case e.DataCol.Name
Case "数量","单价","折扣"
Dim pr As DataRow
pr = DataTables("统计").Find("产品 = '" & e.DataRow("产品") & "'")
If pr IsNot Nothing Then
DataTables("统计").DataCols("产品").RaiseDataColChanged(pr)
End If
End Select
代码的原理是,当订单表中数量、单价、折扣三列中任何一列的内容发生变化,就从统计表中找出对应产品所在的行,然后“欺骗性”地通知系统该行的产品列内容发生了变化,于是触发统计表的DataColChanged事件,重算 此行的数量和金额。
2、字段名可以直接使用,也可以用方括号括起来,例如:
SELECT [客户],[产品],[日期],[数量] FROM {订单}
或
SELECT 客户,产品,日期,数量 FROM {订单}
============================
按上面的说法,非特殊的字段名,用方括号,或者不用方括号,其实是随意的!完全是个噱头?
让我这个从易表过来的程序员,情以何堪啊!!