综合使用SQL语句和统计工具

如果你已经对SQL语言有所了解,可以看看本节内容,否则可以先跳过。
关于SQL语言,后面会用专门的一章给大家讲述。

FoxTable的统计可以让用户无需掌握SQL语言,也能随心所欲地进行统计。
不过如果你熟练SQL语言,那么可以将二者双剑合璧,充分发挥各自的优势,完成一些二者难以独立承担的任务。

示例一

我们知道,通过SQLCommand的ExecuteReader方法,可以根据指定的SQL语句生成一个临时的DataTable对象,而GroupTableBuilder和CrossTableBuilder都可以对这种临时的DataTable进行统计。

打开CaseStudy目录下的文件"多表统计.Table",然后在命令窗口测试下面的代码:

'用SQL语句生成临时表
Dim
cmd As New SQLCommand
Dim
dt As DataTable
cmd.ConnectionName =
"Sale"
cmd
.CommandText = "Select 产品名称,数量,日期 FROM {订单} INNER JOIN {产品} ON {订单}.产品ID = {产品}.产品ID"
dt = cmd.ExecuteReader()

'
对临时进行分组统计
Dim
b As New CrossTableBuilder("统计表1",dt)
b
.HGroups.AddDef("产品名称")
b
.VGroups.AddDef("日期","{0}")
b.Totals.AddDef(
"数量")
b.HorizontalTotal =
True
b.VerticalTotal =
True
b.Build()

MainTable = Tables(
"统计表1")

可以得到下图所示的统计结果:

代码的关键在于定义CrossTableBuilder的时候,指定用ExecuteReader生成的临时表dt作为要统计的数据表:

Dim b As New CrossTableBuilder("统计表1",dt)

当然用SQLCrossTableBuilder也可以直接完成同样的统计任务,本节只是用一个简单的例子,告诉你如何结合使用SQL语句和Foxtable特有的统计工具。

示例二

上面的方法并不是一个高效的方法,假定有10万个订单,上面的方法会将10万行加载到FoxTable再统计,效率极低;如果是100万行呢? 那么后果就只有一个:系统崩溃。
所以我们还需要有更好的办法。

其实不管是GroupTableBuilder还是CrossTableBuilder,都可以直接使用Select语句作为统计数据来源。
例如要完成示例一的统计任务,代码为:

Dim sql As String = "Select 产品名称,数量,日期 FROM {订单} INNER JOIN {产品} ON {订单}.产品ID = {产品}.产品ID"
Dim
b As New CrossTableBuilder("统计表1",sql, "Sale")
b
.HGroups.AddDef("产品名称")
b
.VGroups.AddDef("日期","{0}月")
b
.Totals.AddDef("数量")
b
.HorizontalTotal = True
b
.VerticalTotal = True
b
.Build()
MainTable
= Tables("统计表1")

不仅代码更为简洁, 效率更有天壤之别。

上述代码的关键在于:

Dim b As New CrossTableBuilder("统计表1",sql, "Sale")

第一个参数指定统计表名称,第二个参数指定Select语句,第三个参数指定数据源名称。

如果是内部数据源,代码为:

Dim b As New CrossTableBuilder("统计表1",sql)

 

 

 


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