Foxtable(狐表)用户栏目专家坐堂 → 多选的筛选树,怎么把日期拆成月和日?


  共有4330人关注过本帖树形打印复制链接

主题:多选的筛选树,怎么把日期拆成月和日?

帅哥哟,离线,有人找我吗?
小刚
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:590 积分:3858 威望:0 精华:0 注册:2012/10/15 20:39:00
多选的筛选树,怎么把日期拆成月和日?  发帖心情 Post By:2014/2/14 18:21:00 [只看该作者]

通用设计

上述常规编码方式,目录树的层级越多,代码就越复杂,下面我们提供一个通用的筛选树代码,不过有多少层,代码都一样。

设计步骤同样很简单:

1、新建一个窗口,插入一个目录树控件,将目录树的“显示复选框”属性设置为True。

2、将窗口的AfterLoad事件代码设置为:

e.Form.Controls("TreeView1").BuildTree("订单", "产品|客户|雇员")

3、目录树的AfterCheckNode事件代码设置为:

Dim nms As String() = {"产品","客户","雇员"} '指定生成目录树的各列
Dim
qts As String() = {"'","'","'"} '指定将各列的值括起来的符号,这里都是字符型,所以都是单引号
Dim
trv As WinForm.TreeView = e.Sender
Dim
flt As String
Dim
nd As WinForm.TreeNode
For
Each nd In e.node.allNodes '清除子节点的选中标记
   
nd.Checked = False
Next

nd
= e.Node.ParentNode
Do
While nd IsNot Nothing '清除父节点的选中标记
   
nd.Checked = False
   
nd = nd.ParentNode
Loop

For
Each nd In trv.AllNodes
   
If nd.Checked  Then
       
Dim rts() As String = nd.FullPath.Split("\")
        Dim
val As String = ""
        For
i As Integer = 0 To rts.length - 1
            If
val > "" Then
               
val = val & " And "
            End If
           
val = val & nms(i) & " = " & qts(i) & rts(i) & qts(i)
        Next
        If
flt > "" Then
           
flt = flt & " Or (" & val & ")"
        Else
           
flt = val
        End If
    End If

Next
Tables(
"订单").Filter  = flt



我想把可选的筛选树改成   客户名称|出货月份|出货日期  三个目录树

但是  【订表】里面只有 “客户名称”和“出货日期”,没有“出货月份”的,不知道是否可以改?该如何改?


 回到顶部
帅哥哟,离线,有人找我吗?
kylin
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 F6
等级:狐精 帖子:3036 积分:19223 威望:0 精华:2 注册:2008/9/1 7:50:00
  发帖心情 Post By:2014/2/15 8:17:00 [只看该作者]

简单的办法:自己添加两个列“月”和“日”,从“出货日期”中计算出“月”和“日”,之后按你设想的重新建一个筛选树
[此贴子已经被作者于2014-2-15 8:17:58编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
Bin
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/2/15 8:53:00 [只看该作者]

参考帮助,利用SQL语句生成一个新的 月 日分开的表http://www.foxtable.com/help/topics/0917.htm

 回到顶部
帅哥哟,离线,有人找我吗?
小刚
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:590 积分:3858 威望:0 精华:0 注册:2012/10/15 20:39:00
  发帖心情 Post By:2014/2/15 10:53:00 [只看该作者]

帮忙修改一下,谢谢!
Dim trv As WinForm.TreeView = e.Sender
Dim flt As String
For Each nd As WinForm.TreeNode In e.node.Nodes '清除子节点选中状态
    nd.Checked = False
Next
If e.node.ParentNode IsNot Nothing Then '去掉父节点选中状态
    e.node.ParentNode.Checked = False
End If
Dim Value()As String
    Value = e.Node.FullName.Split("\")
For Each nd As WinForm.TreeNode In trv.AllNodes
      If nd.Checked Then
        If flt > "" Then
            flt = flt & " Or "  '注意用or而不是And
        End If
        If nd.Level = 0 Then '注意下面的条件都要用括号括起来
            flt = flt & "( 客户名称 = '" & nd.Text & "')"
        ElseIf nd.Level = 1 
            flt = flt & "( 客户名称 = '" & nd.ParentNode.Text & "') & " And "Year(下单日期) = " & Value(0)
        ElseIf nd.Level = 2 
            flt = flt & "( 客户名称 = '" & nd.ParentNode.Text & "') & " And "Year(下单日期) = " & Value(0) & " And Month(下单日期) = " & Value(1)
        ElseIf nd.Level = 3 
            flt = flt & "( 客户名称 = '" & nd.ParentNode.Text & "') & " And "Year(下单日期) = " & Value(0) & " And Month(下单日期) = " & Value(1) & " And day(下单日期) = " & Value(2)

        End If
    End If    
Next
Tables("财务").Filter = flt

想要的效果如图:

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


 回到顶部
帅哥哟,离线,有人找我吗?
Bin
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/2/15 10:55:00 [只看该作者]

如上代码本来就是只选中单项的啊?  

 回到顶部
帅哥哟,离线,有人找我吗?
小刚
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:590 积分:3858 威望:0 精华:0 注册:2012/10/15 20:39:00
  发帖心情 Post By:2014/2/15 11:10:00 [只看该作者]

我不会改,要选多项的。帮忙改一下,谢谢!那是效果图,意思是可以多项也可以单项,也可以整月选的。就这个意思。
[此贴子已经被作者于2014-2-15 11:10:45编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
Bin
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/2/15 11:11:00 [只看该作者]

For Each nd As WinForm.TreeNode In e.node.Nodes '清除子节点选中状态
    nd.Checked = False
Next
If e.node.ParentNode IsNot Nothing Then '去掉父节点选中状态
    e.node.ParentNode.Checked = False
End If

这两段代码不是有注译么,根据自身需求去掉即可,  你分别去掉 还有两段都去掉,  看看那个才是符合你需求的效果.

 回到顶部