用SQL语句设计加载树
Foxtable内置了加载树功能,可以轻松地管理大容量数据。
本节我们将自行编写代码设计一个加载树,并非多此一举,毕竟有时我们会有一些特殊的要求,内置的加载树不一定能满足我们的需要。
本示例可以参考CaseStudy目录下的文件“动态加载演示.Table”
假定你有一个订单表,也许有几百个产品,上十万个订单,那么将其全部载入到Foxtable中是不现实的。
下面我们将设计一个目录树列出所有的产品和客户,当我们双击某个产品或客户时,
自动加载对应的订单。
实现这样的功能,其实很简单:
1、首先参考限制初始加载量,使得打开项目的时候,订单表不会加载任何数据。
本示例使用的是内部数据表,为了初始不加载任何定订单数据,我们在项目事件BeforeLoadInnerTable设置了如下的代码:
If
e.DataTableName
= "订单" Then
e.Filter
= "[_Identify] Is Null"
End
If
2、然后新建一个窗口,窗口中插入一个目录树(TreeView),窗口的AfterLod事件代码设为:
Dim
cmd As
New SQLCommand
Dim
dt As
DataTable
cmd.CommandText
= "SELECT DISTINCT
产品,客户
From {订单}"
dt =
cmd.ExecuteReader()
Dim
trv As
WinForm.TreeView
= e.Form.Controls("TreeView1")
trv.BuildTree(dt,"产品|客户")
trv.Nodes.Insert("加载所有数据",0)
这样一旦打开窗口,该目录树列出所有的产品和客户。
由于订单表只是加载了部分数据,所以我们不能直接根据订单表来生成目录树,因为订单表的数据不完整,只能用ExecuteReader方法直接从后台提取完整的产品和客户数据。
注意Select语句中,一定要有DISTINCT关键词,这样返回的才是不重复的产品和客户名单,虽然对目录树的生成没有影响,但是会大大降低数据加载量,对于网络环境,这是非常重要的。
3、最后将目录树的NodeMouseDoubleClick事件设为:
Dim
Filter As
String
If
e.node.Text
= "加载所有数据" Then
Filter =
""
Else
Dim dr
As DataRow =
e.Node.DataRow
'获取生成此节点的DataRow
Select
Case e.Node.Level
Case 0
Filter ="[产品]
= '"
& dr("产品")
& "'"
Case 1
Filter ="[产品]
= '"
& dr("产品")
& "' And [客户]
= '"
& dr("客户")
& "'"
End Select
End
If
DataTables("订单").LoadFilter
= Filter
DataTables("订单").Load()
这样我们只需双击某个节点,既可动态加载对应的订单。
日期列与加载树
如果需要根据年月来加载不同的产品:
可以如下修改代码。
1、窗口的AfterLoad事件代码改为:
Dim
cmd As
New SQLCommand
Dim
dt As
DataTable
cmd.CommandText
= "SELECT DISTINCT Year(日期)
As 年,
Month(日期)
As 月,
产品
From {订单}"
dt =
cmd.ExecuteReader()
Dim
trv As
WinForm.TreeView
= e.Form.Controls("TreeView1")
trv.BuildTree(dt,
"年|月|产品")
2、目录树的NodeMouseDoubleClick事件代码改为:
Dim
dr
As
DataRow =
e.Node.DataRow
'获取生成此节点的行
Dim Filter
As String
Dim Year
As
Integer =
dr("年")
Dim
Month
As
Integer
=
dr("月")
Dim
Product
As
String
=
dr("产品")
Select Case
e.Node.Level
Case
0
Filter
="Year(日期)
= "
&
Year
Case
1
Filter
="Year(日期)
= "
&
Year
&
" And
Month(日期)
= "
&
Month
Case
2
Filter
="Year(日期)
= "
&
Year
&
" And
Month(日期)
= "
&
Month
&
" And
产品
= '"
&
Product
&
"'"
End Select
DataTables("订单").LoadFilter
=
Filter
DataTables("订单").Load()