同名列的处理

SQLGroupTableBuilder和SQLCrossTableBuilder可以统计多个表的数据,如果某一列同时存在于参与统计的多个表中,那么可能会产生冲突。

首先请打开CaseStudy目录下的文件:多表统计.Table。

然后在命令窗口执行下面的代码:

Dim b As New SQLGroupTableBuilder("统计表1","订单")
b
.ConnectionName = "Sale"
b
.AddTable("订单","产品ID","产品","产品ID") '添加统计表
b.Groups.AddDef(
"产品ID" '根据产品ID分组
b.Totals.AddDef(
"数量") '对数量进行统计
b.Build
'生成统计表
MainTable
= Tables("统计表1") '打开生成的统计表


你会发现Foxtable会报错,出问题的是这行代码:


b.Groups.AddDef(
"产品ID" '根据产品ID分组


因为订单表和产品表,都有产品ID列,Foxtable无法判断应该用哪个表的产品ID列,所以报错。


对于这种多个表都存在的列,我们应该明确指定此列来自于哪个表,下面是正确的代码:

Dim b As New SQLGroupTableBuilder("统计表1","订单")
b.ConnectionName =
"Sale"
b.AddTable(
"订单","产品ID","产品","产品ID") '添加统计表
b.Groups.AddDef(
"{订单}.产品ID") '根据订单表产品ID分组
b.Totals.AddDef(
"数量") '对数量进行统计
b.Build
'生成统计表
MainTable
= Tables("统计表1"
) '打开生成的统计表

注意这行代码中,表名必须用大括号括起来:

b.Groups.AddDef("{订单}.产品ID") '根据订单表产品ID分组

再例如,假定产品表和订单表都有单价列,那么统计金额的时候,就必须明确指定单价列的来源表:

b.Totals.AddExp("金额","数量 * {订单}.单价")

 

同样在设置统计条件的时候,遇上同名列,也必须指定来源表,例如:

b.Filter = "{订单}.客户ID = 'C01'"

 

以上代码基于SQLGroupTableBuilder演示,SQLCrossTableBuilder存在同样的问题,处理方法也完全一样。


本页地址:http://www.foxtable.com/webhelp/topics/3299.htm