查询表与加载树
查询表也可以使用加载树,而且也可以分页加载,不过要注意:
1、用于生成加载树的列不可以是表达式列。
2、如果查询表的数据来自于多个表,那么在设置查询表的时候,建议请将子表作为左表,父表作为右表。
3、选择查询表所包括的列时,最好包含子表的主键列,因为默认使用此列作为分页列。
4、如果查询表没有包括子表的主键列,或者子表的主键列名称不是"_Identify",那么在设置加载树时,必须明确指定分页列。
如果不想使用查询表生成器,而是直接编写Select语句来生成查询表,也请注意2、3点。
既然使用加载树,通常就希望查询表默认不加载全部数据, 如果你用Select语句直接定义查询表,可以用Top参数指定默认加载的行数,例如:
Select Top 100 * From {表名} Order By 日期 Desc
表示按日期顺序默认加载最近的100行。
如果使用的是可视化的查询表设计器,可以直接指定加载行数,参考:限制加载行数
使用后台数据库视图
如果查询表的Select语句比较复杂,有时即使满足上面的4个条件,可能也无法正常使用加载树。
我们可以将复杂的Select语句定义为后台数据库的一个视图(Access称之为查询),这样我们就可以将这个Select语句当做一个普通的表使用,以常规的方式来显示加载树。
以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中用这段语句定义一个查询表,将没有办法正常使用加载树功能。
我们可以这样解决:
1、用Access打开这个数据库文件,然后定义一个查询,查询的名称为"销售分析",查询的SQL语句就设置为上面这段Select语句。
2、在Foxtable增加一个查询表,用Select语句定义:
Select Top 30 * From {销售分析}
提示:定义的查询表默认加载30行数据。
3、现在选择这个查询表,就可以按下图所示正常设置加载树:
提示:由于本例的查询表没有_Identify列,所以设置加载树的时候,要选择分页依据列,否则无法正常分页加载,这里选择的是“订单ID”作为分页依据。
总结:
通过在后台数据库定义查询(SQL Server称之为视图),将复杂的Select查询语句当做一个普通的表来使用,让Foxtable只处理自己所擅长的部分,可以大大提高动态加载的兼容性。