以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  下拉选项的筛选统计问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=179646)

--  作者:采菊东篱下
--  发布时间:2022/9/1 15:34:00
--  下拉选项的筛选统计问题
下面的代码实现了组合统计,交果如下:
 
图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20220901150441.jpg
图片点击可在新窗口打开查看
我想下拉选择空白选项,如图分类统计出所有数据,此效果已实现,我想实现选项中e.Form.Controls("ComboBox1").Value.Split("-")(0) = DataTables("分类").DataRows(0)("分类")就只统计月租缴费组列的数据,临时缴费组列的不统计,同理,下拉选项中e.Form.Controls("ComboBox1").Value.Split("-")(0) = DataTables("分类").DataRows(1)("分类")就只统计临时缴费组列的数据,月租缴费组列的不统计,改为红色注识的代码全部没数据显示,改为红色没识代码效果如图,请教应如何改?
   Case "所有收费汇总"
        If e.Form.Controls("StartDate").Value = Nothing OrElse e.Form.Controls("EndDate").Value = Nothing Then \'当日期为空取消保存操作
            messagebox.show("请选择起止日期")
            Return
        End If
        With Tables("安费用所属期查询统计_Table1")
            .SubtotalGroups.Clear()
            LockBaseMainForm() \'锁定主界面
            .StopRedraw()
            Dim cmd As New SQLCommand
            cmd.CommandText = "Select * Fro m {缴费情况} Where [_Identify] Is null"
            Dim dt0 As DataTable = cmd.ExecuteReader()
            If dt0.DataCols.Contains("查询_月租_所属日期") = False Then
                dt0.DataCols.add("查询_月租_所属日期", GetType(Date))
            End If
            If dt0.DataCols.Contains("查询_月租缴费_业主缴费金额") = False Then
                dt0.DataCols.add("查询_月租缴费_业主缴费金额", GetType(Double))
            End If
            If dt0.DataCols.Contains("查询_月租缴费_租户缴费金额") = False Then
                dt0.DataCols.add("查询_月租缴费_租户缴费金额", GetType(Double))
            End If
            If dt0.DataCols.Contains("查询_月租缴费_外来缴费金额") = False Then
                dt0.DataCols.add("查询_月租缴费_外来缴费金额", GetType(Double))
            End If
            Dim Filter1 As String
            With e.Form.Controls("ComboBox1")
                If .Value IsNot Nothing Then
                    Dim Parts() As String = .Value.Split("-")
                    If Parts(0) = DataTables("分类").DataRows(0)("分类") Then
                        Filter1 = "分类 = \'" & Parts(0) & "\'"
                        If Parts.length > 1 Then
                            Filter1 = Filter1 & " And 明细分类 = \'" & Parts(1) & "\'"
                        End If                
                    End If
                ElseIf .Value Is Nothing Then
                    Filter1 = "分类 = \'" & DataTables("分类").DataRows(0)("分类") & "\'"
                End If
            End With
            With e.Form.Controls("StartDate")
                If .Value IsNot Nothing Then
                    If Filter1 > "" Then
                        Filter1 = Filter1 & " And "
                    End If
                    Filter1 = Filter1 & "[缴费_月租_起计日期] >= #" & .Value & "#"
                End If
            End With
            With e.Form.Controls("EndDate")
                If .Value IsNot Nothing Then
                    If Filter1 > "" Then
                        Filter1 = Filter1 & " And "
                    End If
                    Filter1 = Filter1 & "[缴费_月租_止计日期] <= #" & .Value & "#"
                End If
            End With
            With e.Form.Controls("DropBox1")
                If .Value IsNot Nothing Then
                    If Filter1 > "" Then
                        Filter1 = Filter1 & " And "
                    End If
                    Filter1 = Filter1 & "车牌号码 = \'" & .Value & "\'"
                End If
            End With
            \'            If (e.Form.Controls("ComboBox1").Value.Split("-")(0) = DataTables("分类").DataRows(0)("分类") Or e.Form.Controls("ComboBox1").Value Is Nothing) And Filter1 > "" Then
            If Filter1 > "" Then
                Dim drs0 As List(Of DataRow) = DataTables("缴费情况").SQLSelect(Filter1)
                Dim a As Integer
                For a = 0 To drs0.count - 1
                    Dim b As Integer
                    For b = 0 To drs0(a)("缴费_月租_缴费月数") - 1
                        Dim da0 As DataRow = dt0.AddNew()               
                        da0("分类") = drs0(a)("分类")
                        da0("明细分类") = drs0(a)("明细分类")
                        da0("住址_巷") = drs0(a)("住址_巷")
                        da0("住址_号") = drs0(a)("住址_号")
                        da0("住址_房") = drs0(a)("住址_房")
                        da0("姓名") = drs0(a)("姓名")
                        da0("手机号码") = drs0(a)("手机号码")
                        da0("车牌号码") = drs0(a)("车牌号码")
                        da0("缴费_月租_起计日期") = "#" & drs0(a)("缴费_月租_起计日期") & "#"
                        da0("缴费_月租_止计日期") = "#" & drs0(a)("缴费_月租_止计日期") & "#"
                        da0("查询_月租_所属日期") = drs0(a)("缴费_月租_起计日期").AddMonths(b)
                        da0("缴费_月租_月租单价") = drs0(a)("缴费_月租_月租单价")
                        If da0("明细分类") = DataTables("用户明细分类").DataRows(0)("用户明细分类") Then
                            da0("查询_月租缴费_业主缴费金额") = drs0(a)("缴费_月租_月租单价")
                        ElseIf da0("明细分类") = DataTables("用户明细分类").DataRows(1)("用户明细分类") Then
                            da0("查询_月租缴费_租户缴费金额") = drs0(a)("缴费_月租_月租单价")
                        ElseIf da0("明细分类") = DataTables("用户明细分类").DataRows(2)("用户明细分类") Then
                            da0("查询_月租缴费_外来缴费金额") = drs0(a)("缴费_月租_月租单价")
                        End If
                    Next
                Next
                Dim bc As New GroupTableBuilder("统计表2", dt0)
                Dim dt1 As fxDataSource
                bc.Filter = Filter1
                bc.Groups.AddDef("查询_月租_所属日期", DateGroupEnum.Year, "年")
                bc.Groups.AddDef("查询_月租_所属日期", DateGroupEnum.Month, "月")
                bc.Totals.AddDef("查询_月租缴费_业主缴费金额")
                bc.Totals.AddDef("查询_月租缴费_租户缴费金额")
                bc.Totals.AddDef("查询_月租缴费_外来缴费金额")
                dt1 = bc.BuildDataSource()
                Dim cmd01 As New SQLCommand
                cmd01.CommandText = "Select * Fro m {缴费情况} Where [_Identify] Is null"
                Dim dt01 As DataTable = cmd01.ExecuteReader()
                If dt01.DataCols.Contains("查询_临时缴费_亲情缴费金额") = False Then
                    dt01.DataCols.add("查询_临时缴费_亲情缴费金额", GetType(Double))
                End If
                If dt01.DataCols.Contains("查询_临时缴费_外来缴费金额") = False Then
                    dt01.DataCols.add("查询_临时缴费_外来缴费金额", GetType(Double))
                End If
                Dim Filter2 As String
                With e.Form.Controls("ComboBox1")
                    If .Value IsNot Nothing Then
                        Dim Parts() As String = .Value.Split("-")
                        If Parts(0) = DataTables("分类").DataRows(1)("分类") Then
                            Filter2 = "分类 = \'" & Parts(0) & "\'"
                            If Parts.length > 1 Then
                                Filter2 = Filter2 & " And 明细分类 = \'" & Parts(1) & "\'"
                            End If
                        End If
                    ElseIf .Value Is Nothing Then
                        Filter2 = "分类 = \'" & DataTables("分类").DataRows(1)("分类") & "\'"
                    End If
                End With
                If e.Form.Controls("StartDate").Value IsNot Nothing Then
                    If Filter2 > "" Then
                        Filter2 = Filter2 & " And "
                    End If
                    Filter2 = Filter2 & "[日期] >= #" & e.Form.Controls("StartDate").Value & "#"
                End If
                If e.Form.Controls("EndDate").Value IsNot Nothing Then
                    If Filter2 > "" Then
                        Filter2 = Filter2 & " And "
                    End If
                    Filter2 = Filter2 & "[日期] <= #" & e.Form.Controls("EndDate").Value & "#"
                End If
                With e.Form.Controls("DropBox1")
                    If .Value IsNot Nothing Then
                        If Filter2 > "" Then
                            Filter2 = Filter2 & " And "
                        End If
                        Filter2 = Filter2 & "车牌号码 = \'" & .Value & "\'"
                    End If
                End With
                \'                If (e.Form.Controls("ComboBox1").Value.Split("-")(0) = DataTables("分类").DataRows(1)("分类") Or e.Form.Controls("ComboBox1").Value Is Nothing) And Filter2 > "" Then
                If Filter2 > "" Then
                    Dim drs01 As List(Of DataRow) = DataTables("缴费情况").SQLSelect(Filter2)
                    Dim a01 As Integer
                    For a01 = 0 To drs01.count - 1
                        Dim b As Integer
                        Dim da01 As DataRow = dt01.AddNew()
                        da01("日期") = drs01(a01)("日期")
                        da01("分类") = drs01(a01)("分类")
                        da01("明细分类") = drs01(a01)("明细分类")
                        da01("住址_巷") = drs01(a01)("住址_巷")
                        da01("住址_号") = drs01(a01)("住址_号")
                        da01("住址_房") = drs01(a01)("住址_房")
                        da01("姓名") = drs01(a01)("姓名")
                        da01("手机号码") = drs01(a01)("手机号码")
                        da01("车牌号码") = drs01(a01)("车牌号码")
                        If da01("明细分类") = DataTables("用户明细分类").DataRows(3)("用户明细分类") Then
                            da01("查询_临时缴费_亲情缴费金额") = drs01(a01)("缴费_临时停放_缴费金额")
                        ElseIf da01("明细分类") = DataTables("用户明细分类").DataRows(4)("用户明细分类") Then
                            da01("查询_临时缴费_外来缴费金额") = drs01(a01)("缴费_临时停放_缴费金额")
                        End If
                    Next
                    Dim bc1 As New GroupTableBuilder("统计表3", dt01)
                    Dim dt2 As fxDataSource
                    bc1.Filter = Filter2
                    bc1.Groups.AddDef("日期", DateGroupEnum.Year, "年")
                    bc1.Groups.AddDef("日期", DateGroupEnum.Month, "月")
                    bc1.Totals.AddDef("查询_临时缴费_亲情缴费金额")
                    bc1.Totals.AddDef("查询_临时缴费_外来缴费金额")
                    dt2 = bc1.BuildDataSource()
                    Dim Filter3 As String
                    With e.Form.Controls("ComboBox1")
                        If .Value Is Nothing Then
                            Filter3 = "[分类] = \'" & DataTables("分类").DataRows(2)("分类") & "\' Or [分类] = \'" & DataTables("分类").DataRows(3)("分类") & "\'"
                        End If
                    End With
                    If e.Form.Controls("StartDate").Value IsNot Nothing Then
                        If Filter3 > "" Then
                            Filter3 = Filter3 & " And "
                        End If
                        Filter3 = Filter3 & "[日期] >= #" & e.Form.Controls("StartDate").Value & "#"
                    End If
                    If e.Form.Controls("EndDate").Value IsNot Nothing Then
                        If Filter3 > "" Then
                            Filter3 = Filter3 & " And "
                        End If
                        Filter3 = Filter3 & "[日期] <= #" & e.Form.Controls("EndDate").Value & "#"
                    End If
                    If Filter3 > "" Then
                        Dim bc2 As New SQLGroupTableBuilder("统计表4", "缴费情况")
                        Dim dt3 As fxDataSource
                        bc2.Filter = Filter3
                        bc2.Groups.AddDef("日期", DateGroupEnum.Year, "年")
                        bc2.Groups.AddDef("日期", DateGroupEnum.Month, "月")
                        bc2.Totals.AddDef("缴费_其他收入_金额")
                        dt3 = bc2.BuildDataSource()
                        Dim nms As String() = {"年", "月"} \'指定连接列
                        dt1.Combine(nms, dt2, nms) \'将销售统计数据组合到进货统计数据
                        dt1.Combine(nms, dt3, nms) \'将销售统计数据组合到进货统计数据
                        .DataSource = dt1
                        DataTables("安费用所属期查询统计_Table1").DataCols.Add("当月总收入", GetType(Double), "IsNull([查询_月租缴费_业主缴费金额],0) + IsNull([查询_月租缴费_租户缴费金额],0) + IsNull([查询_月租缴费_外来缴费金额],0) + IsNull([查询_临时缴费_亲情缴费金额],0) + ISNULL([查询_临时缴费_外来缴费金额],0) + ISNULL([缴费_其他收入_金额],0)")
                        Dim g1 As New Subtotalgroup
                        g1.GroupOn = "年" \'分组列为客户列
                        g1.TotalOn = "查询_月租缴费_业主缴费金额,查询_月租缴费_租户缴费金额,查询_月租缴费_外来缴费金额,查询_临时缴费_亲情缴费金额,查询_临时缴费_外来缴费金额,缴费_其他收入_金额,当月总收入" \'对数量和金额进行统计
                        g1.Caption = "本年累计"
                        .SubtotalGroups.Add(g1)
                        \'定义总计分组
                        Dim g2 As New Subtotalgroup
                        g2.GroupOn = "*"
                        g2.TotalOn = "查询_月租缴费_业主缴费金额,查询_月租缴费_租户缴费金额,查询_月租缴费_外来缴费金额,查询_临时缴费_亲情缴费金额,查询_临时缴费_外来缴费金额,缴费_其他收入_金额,当月总收入"
                        .SubtotalGroups.Add(g2)
                        .Subtotal() \'生成汇总模式
                        .SetColVisibleWidth("年|70|月|60|查询_月租缴费_业主缴费金额|90|查询_月租缴费_租户缴费金额|90|查询_月租缴费_外来缴费金额|90|查询_临时缴费_亲情缴费金额|90|查询_临时缴费_外来缴费金额|90|缴费_其他收入_金额|90|当月总收入|110")
                        .SetHeaderRowHeight(0, 25, 25)
                        .DataTable.DataCols("查询_月租缴费_业主缴费金额").SetFormat("#,###.##")
                        .DataTable.DataCols("查询_月租缴费_租户缴费金额").SetFormat("#,###.##")
                        .DataTable.DataCols("查询_月租缴费_外来缴费金额").SetFormat("#,###.##")
                        .DataTable.DataCols("查询_临时缴费_亲情缴费金额").SetFormat("#,###.##")
                        .DataTable.DataCols("查询_临时缴费_外来缴费金额").SetFormat("#,###.##")
                        .DataTable.DataCols("缴费_其他收入_金额").SetFormat("#,###.##")
                        .DataTable.DataCols("当月总收入").SetFormat("#,###.##")
                        .ResumeRedraw()
                        UnLockBaseMainForm() \'解锁主界面
                    End If
                End If
            End If
        End With

--  作者:有点蓝
--  发布时间:2022/9/1 15:40:00
--  
不需要红色的代码

                With e.Form.Controls("ComboBox1")
                    If .Value IsNot Nothing Then
                        Dim Parts() As String = .Value.Split("-")
                        If Parts(0) = DataTables("分类").DataRows(1)("分类") Then
                            Filter2 = "分类 = \'" & Parts(0) & "\'"
                            If Parts.length > 1 Then
                                Filter2 = Filter2 & " And 明细分类 = \'" & Parts(1) & "\'"
                            End If
                        End If
                    ElseIf .Value Is Nothing Then
                        Filter2 = "分类 = \'" & DataTables("分类").DataRows(1)("分类") & "\'"
                    End If
                End With
改为
                With e.Form.Controls("ComboBox1")
                    If .Value IsNot Nothing Then
                        Dim Parts() As String = .Value.Split("-")
                            Filter2 = "分类 = \'" & Parts(0) & "\'"
                            If Parts.length > 1 Then
                                Filter2 = Filter2 & " And 明细分类 = \'" & Parts(1) & "\'"
                            End If
                    ElseIf .Value Is Nothing Then
                        Filter2 = "分类 = \'" & DataTables("分类").DataRows(1)("分类") & "\'"
                    End If
                End With

--  作者:采菊东篱下
--  发布时间:2022/9/1 16:06:00
--  
不能这样写,Filter1是筛选月租缴费的条件,Filter2是筛选临时缴费的条件,你这样写就会把月租的筛选条件合成到临时缴费的条件里去了,所在一定判定If Parts(0) = DataTables("分类").DataRows(1)("分类") Then,如果不是就不统计临时缴费数据,我用Return语句直接什么数据都没有了,连月租缴费都没有。
--  作者:有点蓝
--  发布时间:2022/9/1 16:15:00
--  
没看懂这么别扭的判断逻辑意义在哪。

既然下拉项目都已经有月租、临时这些分类了,直接从选择的内容判断就行了。何必多此一举
[此贴子已经被作者于2022/9/1 16:14:50编辑过]

--  作者:采菊东篱下
--  发布时间:2022/9/1 16:21:00
--  
分组啊,数据源月租和临时的是分开在不同列中的,所以要组合成上面的效果。
图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20220901161712.png
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2022/9/1 16:33:00
--  
看不懂。自己减少代码,先测试其中一个分支,没有问题了在加上另外一个分支的代码。结合调试代码,看看各种条件,分析查询的结果
--  作者:采菊东篱下
--  发布时间:2022/9/1 16:50:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:统计.foxdb

你看一下。

--  作者:有点蓝
--  发布时间:2022/9/1 17:06:00
--  
我看不懂您处理问题的逻辑,请自行调试