以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]新手问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=13657)

--  作者:cuiler
--  发布时间:2011/10/21 15:28:00
--  [求助]新手问题
 
以下两段文字是从帮助文件中复制过来。
【第一段】
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事件,重算 此行的数量和金额。

========================================
我的问题是: 为什么第一段中红颜色部分是“[品名]”,第二段中红颜色部分是“产品”?谢谢!

--  作者:狐狸爸爸
--  发布时间:2011/10/21 15:52:00
--  

参考:
 
http://www.foxtable.com/help/topics/1580.htm


 


--  作者:don
--  发布时间:2011/10/21 15:57:00
--  
呵呵,[品名]對品名,[產品]對產品,沒問題,只要對應即可.
--  作者:cuiler
--  发布时间:2011/10/21 16:00:00
--  

2、字段名可以直接使用,也可以用方括号括起来,例如:

SELECT [客户],[产品],[日期],[数量] FROM {订单}

SELECT 客户,产品,日期,数量 FROM {订单}

 

============================

按上面的说法,非特殊的字段名,用方括号,或者不用方括号,其实是随意的!完全是个噱头

让我这个从易表过来的程序员,情以何堪啊!!

[此贴子已经被作者于2011-10-21 16:00:47编辑过]

--  作者:don
--  发布时间:2011/10/21 16:05:00
--  
呵呵,用方括号絕對準確,一般情況下可不用方括号,但列名稱有特殊符號(如"_")或空格,則必須用方括号