以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]年月日目录树多选筛选  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=161452)

--  作者:xongyijd
--  发布时间:2021/3/17 23:21:00
--  [求助]年月日目录树多选筛选
用日期列,直接生成年,月,日目录树,因需要多选框筛选功能和统计单据数量,怎样写筛选代码,难道非要在表中增加临时列?

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

--  作者:有点蓝
--  发布时间:2021/3/18 8:56:00
--  
参考:http://www.foxtable.com/webhelp/topics/2503.htm
--  作者:xongyijd
--  发布时间:2021/3/21 19:14:00
--  
请教版主,按照帮助写了一下,还是无法达到要求,只有单选,不能多选,是怎么回事,实在想不出来哪里错了?
筛选树代码:
Dim du1 As WinForm.Table = e.Form.Controls("Table1")

Dim dt As DataTable
Dim b As New GroupTableBuilder("统计表1",du1.Table.DataTable)
b.Groups.AddDef("来往单位")
b.Groups.AddDef("日期",DateGroupEnum.Year,"年")
b.Groups.AddDef("日期",DateGroupEnum.Month,"月")
b.Groups.AddDef("日期",DateGroupEnum.Day,"日")
b.Totals.AddDef("单据编号",AggregateEnum.Count,"单据数")
dt = b.Build(True)
Dim tv As WinForm.TreeView = e.Form.Controls("TreeView1")
tv.BuildTree(dt,"来往单位|年|月|日")
tv.StopRedraw
For Each nd As WinForm.TreeNode In tv.AllNodes
    Dim Product As String = nd.DataRow("来往单位")
    Dim Year As Integer = nd.DataRow("年")
    Dim Month As Integer = nd.DataRow("月")
    Dim  Day As Integer = nd.DataRow("日")
    Select Case nd.Level
        Case 0
            nd.Text = nd.text & "单据(" & dt.Compute("Sum(单据数)","来往单位 = \'" & Product & "\'") & "条)"
        Case 1
            nd.Text = nd.text & "年(" & dt.Compute("Sum(单据数)","来往单位 = \'" & Product & "\'And 年 = " & Year) & "条)"
        Case 2
            nd.Text = nd.text & "月(" & dt.Compute("Sum(单据数)","来往单位 = \'" & Product & "\'And 年 = " & Year & " And 月 = " & Month) & "条)"
        Case 3
            nd.Text = nd.text & "日(" & dt.Compute("Sum(单据数)","来往单位 = \'" & Product & "\'And 年 = " & Year & " And 月 = " & Month & " And 日 = " & Day) & "条)"
    End Select
Next
tv.Nodes.Insert("显示所有行","显示所有条件行(" & dt.Compute("Sum(单据数)") & "条)",0)
tv.ResumeRedraw
筛选代码:
Dim flt As String
Dim d1,d2,d3,d4,d5 As Date
Dim Year As Integer = e.Node.DataRow("年")
Dim Month As Integer = e.Node.DataRow("月")
Dim Day As Integer = e.Node.DataRow("日")
d1 = New Date(Year,1,1) \'取得该年的第一天
d2 = new Date(Year,12,31) \'取得该年的最后一天
d3 = New Date(Year, Month, 1) \'取得该月的第一天
d4 = new Date(Year, Month, Date.DaysInMonth(Year,Month)) \'取得该月的最后一天
d5 = New Date(Year, Month,Day)
For Each nd As WinForm.TreeNode In e.Sender.AllNodes
    If nd.Checked = True Then
        If flt > "" Then
            flt = flt & " Or "
        End If
        If nd.Level = 0 Then
            flt = flt & "(来往单位 = \'" & nd.Name & "\')"
        End If
        If  nd.Level = 1 Then
            flt = flt & "(来往单位 = \'" & nd.ParentNode.Name & "\'And 日期 >= #" & d1 & "# And 日期 <= #" & d2 & "#)"
        End If
        If  nd.Level = 2Then
            flt = flt & "(来往单位 = \'" & nd.ParentNode.ParentNode.Name & "\'And  日期 >= #" & d3 & "# And 日期 <= #" & d4 & "#)"
        End If
        If  nd.Level = 3 Then
            flt = flt & "(来往单位 = \'" & nd.ParentNode.ParentNode.ParentNode.Name & "\'And 日期 = #" & d5 & "#)"
        End If
    End If

e.Form.Controls("Table1").Table.Filter = flt
Next
MessageBox.Show(flt)

--  作者:有点蓝
--  发布时间:2021/3/21 22:10:00
--  
MessageBox.Show(flt)显示什么条件?
--  作者:xongyijd
--  发布时间:2021/3/21 22:32:00
--  
多选时条件表达式显示都是最后选择框的一样日期,就好像没有遍历多选,只有单选

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

[此贴子已经被作者于2021/3/21 22:35:20编辑过]

--  作者:有点蓝
--  发布时间:2021/3/21 22:38:00
--  
筛选代码:
Dim flt As String
For Each nd As WinForm.TreeNode In e.Sender.AllNodes

Dim d1,d2,d3,d4,d5 As Date
Dim Year As Integer = nd.DataRow("年")
Dim Month As Integer = nd.DataRow("月")
Dim Day As Integer = nd.DataRow("日")
d1 = New Date(Year,1,1) \'取得该年的第一天
d2 = new Date(Year,12,31) \'取得该年的最后一天
d3 = New Date(Year, Month, 1) \'取得该月的第一天
d4 = new Date(Year, Month, Date.DaysInMonth(Year,Month)) \'取得该月的最后一天
d5 = New Date(Year, Month,Day)
    If nd.Checked = True Then
        If flt > "" Then
            flt = flt & " Or "
        End If
        If nd.Level = 0 Then
            flt = flt & "(来往单位 = \'" & nd.Name & "\')"
        elseIf  nd.Level = 1 Then
            flt = flt & "(来往单位 = \'" & nd.ParentNode.Name & "\'And 日期 >= #" & d1 & "# And 日期 <= #" & d2 & "#)"
        elseIf  nd.Level = 2Then
            flt = flt & "(来往单位 = \'" & nd.ParentNode.ParentNode.Name & "\'And  日期 >= #" & d3 & "# And 日期 <= #" & d4 & "#)"
        elseIf  nd.Level = 3 Then
            flt = flt & "(来往单位 = \'" & nd.ParentNode.ParentNode.ParentNode.Name & "\'And 日期 = #" & d5 & "#)"
        End If
    End If

e.Form.Controls("Table1").Table.Filter = flt
Next
MessageBox.Show(flt)

--  作者:xongyijd
--  发布时间:2021/3/21 22:55:00
--  
遍历放到前面也是一样的问题,遍历选择框值我也看了,没有问题,合并条件后就是不行,我做个例子帮助我看看吧,弄了好几天了,还是弄不好


--  作者:有点蓝
--  发布时间:2021/3/21 23:01:00
--  
e.Form.Controls("Table1").Table.Filter = flt放到最后,遍历之外

重新弹出筛选条件看看

--  作者:xongyijd
--  发布时间:2021/3/21 23:15:00
--  
不行,我做了一个例子发你看看
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:筛选测试项目.foxdb



--  作者:有点蓝
--  发布时间:2021/3/21 23:28:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:筛选测试项目.zip