以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]带统计的筛选树,如果是年,季度,产品,季度的代码应该如何写  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=69443)

--  作者:ehomecd
--  发布时间:2015/6/5 10:40:00
--  [求助]带统计的筛选树,如果是年,季度,产品,季度的代码应该如何写


图片点击可在新窗口打开查看此主题相关图片如下:筛选树.jpg
图片点击可在新窗口打开查看


设计步骤:

1、新建一个窗口,窗口类型设为主窗口,在窗口中插入一个分区面板。
2、在右分区插入一个Table(表),将其绑定到主表(订单表),并将其停靠属性设置为Fill。
3、在左分区插入一个TreeView(目录树),并将其停靠属性设置为Fill。
4、将分区面板的停靠属性也设为Fill。
5、将窗口的AfterLoad事件设为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

\'首先生成统计表
Dim
dt As DataTable
Dim
b As New GroupTableBuilder("统计表1",DataTables("订单"))
b
.Groups.AddDef("日期",DateGroupEnum.Year,"年")
b
.Groups.AddDef("日期",DateGroupEnum.Month,"")
b
.Groups.AddDef("产品")
b
.Totals.AddDef("客户",AggregateEnum.Count,"订单数") \'根据客户列来统计记录数,也就是订单数
dt
= b.Build(False) \'参数设置为False,生成一个临时表,不在主界面显示
\'然后根据统计表生成目录树

Dim
trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv
.BuildTree(dt, "||产品")
trv
.StopRedraw
For
Each nd As WinForm.TreeNode In trv.AllNodes
   
Dim Year As Integer = nd.DataRow("")
   
Dim Month As Integer = nd.DataRow("")
   
Dim Product As String = nd.DataRow("产品")
   
Select Case nd.Level
       
Case 0
           
nd.Text = nd.text & "(" & dt.Compute("Sum(订单数)"," = " & Year) & ")"
       
Case 1
           
nd.Text = nd.text & "(" & dt.Compute("Sum(订单数)"," = " & Year & " And = " & Month) & ")"
       
Case 2
           
nd.Text = nd.text & "(" & nd.DataRow("订单数") & ")"
   
End Select
Next

trv
.Nodes.Insert("显示所有行","显示所有行(" & dt.Compute("Sum(订单数)") & "条)",0)
trv
.ResumeRedraw

上面的代码中,请留意第8行代码:

dt = b.Build(False) \'参数设置为False,生成一个临时表,不在主界面显示

加上参数False后,Build生成的表,不会在主界面显示,当不再有地方引用这个表或这个表中的行和列时,这个表就会被自动销毁,参考不显示生成的表
以本节的例子来说,由于根据这个表生成了目录树,目录树节点的DataRow属性会引用这个表中的行,所以直到关闭窗口,这个表才会被自动销毁。

6、将目录树的NodeMouseDoubleClick事件设为:

Dim Filter As String = ""
If
e.node.Name <> "显示所有行" Then \'要用Name属性,不能用Text属性
   
Dim d1 As Date
    Dim
d2 As Date
    Dim
Year As Integer = e.Node.DataRow("")
    Dim
Month As Integer = e.Node.DataRow("")
    Dim
Product As String = e.Node.DataRow("产品")
    Select Case
e.Node.Level
        Case
0
           
d1 = New Date(Year,1,1) \'取得该年的第一天
           
d2 = new Date(Year,12,31) \'取得该年的最后一天
           
Filter = "日期 >= #" & d1 & "# And 日期 <= #" & d2 & "#"
        Case
1
           
d1 = New Date(Year, Month, 1) \'取得该月的第一天
           
d2 = new Date(Year, Month, Date.DaysInMonth(Year,Month)) \'取得该月的最后一天
           
Filter = "日期 >= #" & d1 & "# And 日期 <= #" & d2 & "#"
        Case
2
           
d1 = New Date(Year, Month, 1) \'取得该月的第一天
           
d2 = new Date(Year, Month, Date.DaysInMonth(Year,Month)) \'取得该月的最后一天
           
Filter = "日期 >= #" & d1 & "# And 日期 <= #" & d2 & "# And 产品 = \'" & Product & "\'"
    End Select
End If
Tables(
"订单").Filter = Filter

 


--  作者:Bin
--  发布时间:2015/6/5 10:48:00
--  
DateGroupDateGroupEnum型枚举,指定日期列的分组方式,包括以下可选值:

None:无
Year: 按年
Quarter:按季度
Month:按月
Week:按周
Day:按天
Hour:按小时
Minute:按分
Second:按秒