以下两段文字是从帮助文件中复制过来。
【第一段】
3.4.2.4.3.9 跨表引用
假定产品表和订单表已经通过品名建立了关联,关联的名称为“产品_订单”。
产品表和订单表都有单价列,其中订单表中的单价数据来自于产品表。
通常我们会在订单表新建一个名为“单价”的表达式列,将其表达式设为:
Parent(产品_订单).单价。
这样订单表就可以引用产品表中对应产品的单价。
但是采用表达式列会有以下棘手的问题:
1、如果产品表没有某产品的资料,需要在订单表中手工输入单价的时候,你会发现你是没有办法在订单表的单价列输入数据的。
2、如果这是一个特殊的订单,需要一个例外的价格,同样你会发现,订单表的单价数据是无法修改的。
3、如果从某一天开始,需要按照新的价格销售产品,于是你修改产品表的单价数据,但是修改后你会发现订单表原有订单的单价数据会全部自动更新为新的单价,显然这不是我们所希望的。
上述问题不是表达式列所能解决的,更甚的是,我们可能因为某些特殊原因,并没有在产品表和订单表之间建立关联,此时采用表达式列来引用产品单价根本就无从谈起。
所以我们有必要介绍另一种跨表引用数据的方法,这个方法不使用表达式,而且不管这两个表之间是否建立了关联,此方法应该同样有效。
以上面介绍的订单表引用产品表的单价为例,首先要确保订单表中的单价列不是表达式列,而是标准的数据列,然后在订单表的DataColChanged事件中设置如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 |
If e.DataCol.Name = "品名" Then '如果内容发生变动的是品名列 If e.NewValue Is Nothing Then '如果新值是空白,也就是品名列的内容为空 e.DataRow("单价") = Nothing '那么清空此行单价列的内容 Else Dim dr As DataRow '否则在产品表查找同名的产品行,将找到的行赋值给变量dr dr = DataTables("产品").Find("[品名] = '" & e.NewValue & "'") If dr IsNot Nothing Then '如果找到了同名的产品行,也就是dr不是Nothing e.DataRow("单价") = dr("单价") End If End If End If |
【第二段】
3.4.2.4.3.12 跨表统计的自动更新
……………
现在要求在订单表输入或修改某订单的数量后,能够即时更新统计表对应产品的数量统计值。
为此可将订单表的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事件,重算 此行的数量和金额。
========================================
我的问题是: 为什么第一段中红颜色部分是“[品名]”,第二段中红颜色部分是“产品”?谢谢!