使用后台数据库的视图
前面已经提到,对于复杂的Selelct语句,Foxtable的分页加载和加载树往往无能为力,尽管提供了一个SQLLoad方法来实现分页加载,但是使用上还是不够便利,而且也无法解决加载树的问题。
其实我们可以将复杂的Select语句定义为后台数据库的一个视图(Access称之为查询),这样我们就可以将这个Select语句当做一个普通的表使用,以常规的方式来实现分页加 载和显示加载树。
示例
1、以Access数据源为例,假定有一段如下所示用于销售分析的Select语句:
SELECT 订单.[订单ID], 订单.订单日期,
员工扩展信息.员工姓名 AS 员工, 客户扩展信息.公司 AS 客户名称, 产品.产品名称, 扩展订单明细.总价 AS 销售,
客户扩展信息.[省/市/自治区], 客户扩展信息.[国家/地区], 员工扩展信息.ID AS [员工ID], 产品.ID AS [产品ID],
客户扩展信息.ID AS [客户ID], Year([订单日期]) AS 年份, Month([订单日期]) AS 月份, DatePart("q",[订单日期])
AS 季度, Format([订单日期],"mmmm") AS 月份名, 产品.类别, 产品.产品名称 AS 产品, 客户扩展信息.公司 AS 客户,
(Month([订单日期]) Mod 3) AS 季度月
FROM ((((订单 INNER JOIN 客户扩展信息 ON 订单.[客户ID] = 客户扩展信息.ID) LEFT JOIN 员工扩展信息 ON
订单.[员工ID] = 员工扩展信息.ID) INNER JOIN 扩展订单明细 ON 订单.[订单ID] = 扩展订单明细.[订单ID]) INNER
JOIN 产品 ON 扩展订单明细.[产品ID] = 产品.ID) INNER JOIN 发票 ON 订单.[订单ID] = 发票.[订单ID];
显然这段语句过于复杂了,如果在Foxtable中用这段语句生成一个查询表,将没有办法正常实现分页加载和加载树等动能。
2、用Access打开这个数据库文件,然后定义一个查询,查询的名称为"销售分析",查询的SQL语句就设置为上面这段Select语句。
3、在Foxtable增加一个名为"销售分析"的查询表,用Select语句定义:
Select * From {销售分析} Where 产品名称 Is null
提示:加上一个不可能成立的条件“产品名称 Is Null”,使得这个查询表默认不会加载任何数据。
DataTables("销售分析").LoadOver
= "订单ID"
Tables("销售分析").OpenLoadTree("订单日期
YM",150,30,True)
这样打开项目之后,就会自动打开加载树,每页30行,并自动加载第一页数据。
提示:由于本例的查询表没有_Identify列,所以设置分页加载的时候,要用LoadLover属性明确指定分页依据列。
5、我们可以在任何地方使用这个后台查询,例如:
Tables("窗口1_Table1").Fill("Select * From {销售分析} Where 产品名称 = '葡萄干'","nwnd",True)
总结:
通过在后台数据库定义查询(SQL Server称之为视图),将复杂的SQL语句当做一个普通的表来使用,让Foxtable只处理自己所擅长的部分,可以大大提高动态加载的兼容性。