以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  流水账相关  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=150266)

--  作者:cd_tdh
--  发布时间:2020/5/25 15:55:00
--  流水账相关

老师,按照帮助做了一个流水账,代码如下:

但是交易日期在之前时,余额就不对了,怎么弄呢?

Select Case e.DataCol.Name
    Case "项目名称","收入","支出"
        Dim dr As DataRow
        Dim mr As DataRow = e.DataRow
        Dim drs As List(of DataRow)
        Dim jk As Integer
        Dim ck As Integer
        dr = e.DataTable.Find("[_Identify] < " & mr("_Identify") & " And [项目名称] = \'" & mr("项目名称") & "\'", "[_Identify] Desc")
        If dr Is Nothing Then \'如果是第一行,计算结存
            jk =  DataTables("项目流水账").SQLCompute("Sum(收入)","[_Identify] < " & mr("_Identify") & " And 项目名称 = \'" & mr("项目名称") & "\'")
            ck =  DataTables("项目流水账").SQLCompute("Sum(支出)","[_Identify] < " & mr("_Identify") & " And 项目名称 = \'" & mr("项目名称") & "\'")
            mr("余额") = e.DataRow("收入") - e.DataRow("支出") + jk - ck
            dr = mr
        End If
        drs = e.DataTable.Select("[_Identify] >= " & dr("_Identify") & " And [项目名称] = \'" & dr("项目名称") & "\'", "[_Identify]")
        For i As Integer = 1 To drs.Count - 1
            drs(i)("余额") = drs(i-1)("余额") + drs(i)("收入") - drs(i)("支出")
        Next
        If e.DataCol.Name = "项目名称" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then \'如果修改的是项目名称列
            dr = e.DataTable.Find("[_Identify] < " & mr("_Identify") & " And [项目名称] = \'" & e.OldValue & "\'", "[_Identify] Desc") \'找出旧项目名称的上一行
            If dr Is Nothing Then \'如果不存在上一行,那么本行就是旧项目名称的第一行,由于已经被修改为新项目名称,需要找出旧项目名称现在的第一行
                dr = e.DataTable.Find("[项目名称] = \'" & e.OldValue & "\'", "[_Identify]") \'找出旧项目名称现在的第一行
                If dr IsNot Nothing Then \'如果找到,计算余额
                    jk =  DataTables("项目流水账").SQLCompute("Sum(收入)","[_Identify] < " & mr("_Identify") & " And 项目名称 = \'" & e.OldValue & "\'")
                    ck =  DataTables("项目流水账").SQLCompute("Sum(支出)","[_Identify] < " & mr("_Identify") & " And 项目名称 = \'" & e.OldValue & "\'")
                    dr("余额") = dr("收入") - dr("支出") + jk - ck
                End If
            End If
            If dr IsNot Nothing Then
                drs = e.DataTable.Select("[_Identify] >= " & dr("_Identify") & " And [项目名称] = \'" & dr("项目名称") & "\'", "[_Identify]")
                For i As Integer = 1 To drs.Count - 1
                    drs(i)("余额") = drs(i-1)("余额") + drs(i)("收入") - drs(i)("支出")
                Next
            End If
        End If
End Select

 

[_Identify]来计算设涉及到一个问题就是,有可能某个日期登记掉一笔,后面补上,计算出来的余额就不是准确的值。

[此贴子已经被作者于2020/5/25 16:07:21编辑过]

--  作者:有点蓝
--  发布时间:2020/5/25 16:17:00
--  
"日期 Desc[_Identify] Desc"
--  作者:cd_tdh
--  发布时间:2020/5/25 16:53:00
--  

老师,刚好就是后面补录的一笔不对,余额少了112元,到最后显示余额是:316712.01,刚好是补录后,在月里面在增加进去,这一笔的余额也不对。最后余额显示到补录的那一列了。

 


图片点击可在新窗口打开查看此主题相关图片如下:qq截图20200525165221.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2020/5/25 17:03:51编辑过]

--  作者:有点蓝
--  发布时间:2020/5/25 17:03:00
--  
上传实例说明
--  作者:cd_tdh
--  发布时间:2020/5/25 17:15:00
--  

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目2.table

老师,第41条记录是后面补录的,我按照交易日期排序后,余额需要按照排序后的计算。

 

老师修改了麻烦直接给代码,没升级5.18,打开不方便,有需要去安装,看了又卸载安回旧版本。

[此贴子已经被作者于2020/5/25 17:16:10编辑过]

--  作者:有点蓝
--  发布时间:2020/5/25 17:32:00
--  
Select Case e.DataCol.Name
    Case "项目名称","收入","支出"
        Dim dr As DataRow
        Dim mr As DataRow = e.DataRow
        Dim drs As List(of DataRow)
        Dim jk As Integer
        Dim ck As Integer
        dr = e.DataTable.Find("日期 < #" & mr("日期") & "# and [_Identify] < " & mr("_Identify") & " And [项目名称] = \'" & mr("项目名称") & "\'", "日期 Desc,[_Identify] Desc")
        If dr Is Nothing Then \'如果是第一行,计算结存
            jk =  DataTables("表A").SQLCompute("Sum(收入)","日期 < #" & mr("日期") & "# and [_Identify] < " & mr("_Identify") & " And 项目名称 = \'" & mr("项目名称") & "\'")
            ck =  DataTables("表A").SQLCompute("Sum(支出)","日期 < #" & mr("日期") & "# and [_Identify] < " & mr("_Identify") & " And 项目名称 = \'" & mr("项目名称") & "\'")
            mr("余额") = e.DataRow("收入") - e.DataRow("支出") + jk - ck
            dr = mr
        End If
        drs = e.DataTable.Select("日期 >= #" & dr("日期") & "# and [_Identify] >= " & dr("_Identify") & " And [项目名称] = \'" & dr("项目名称") & "\'", "日期,[_Identify]")
        For i As Integer = 1 To drs.Count - 1
            drs(i)("余额") = drs(i-1)("余额") + drs(i)("收入") - drs(i)("支出")
        Next
        If e.DataCol.Name = "项目名称" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then \'如果修改的是项目名称列
            dr = e.DataTable.Find("日期 < #" & mr("日期") & "# and [_Identify] < " & mr("_Identify") & " And [项目名称] = \'" & e.OldValue & "\'", "日期 Desc,[_Identify] Desc") \'找出旧项目名称的上一行
            If dr Is Nothing Then \'如果不存在上一行,那么本行就是旧项目名称的第一行,由于已经被修改为新项目名称,需要找出旧项目名称现在的第一行
                dr = e.DataTable.Find("[项目名称] = \'" & e.OldValue & "\'", "日期,[_Identify]") \'找出旧项目名称现在的第一行
                If dr IsNot Nothing Then \'如果找到,计算余额
                    jk =  DataTables("表A").SQLCompute("Sum(收入)","日期 < #" & mr("日期") & "# and [_Identify] < " & mr("_Identify") & " And 项目名称 = \'" & e.OldValue & "\'")
                    ck =  DataTables("表A").SQLCompute("Sum(支出)","日期 < #" & mr("日期") & "# and [_Identify] < " & mr("_Identify") & " And 项目名称 = \'" & e.OldValue & "\'")
                    dr("余额") = dr("收入") - dr("支出") + jk - ck
                End If
            End If
            If dr IsNot Nothing Then
                drs = e.DataTable.Select("日期 >= #" & dr("日期") & "# and [_Identify] >= " & dr("_Identify") & " And [项目名称] = \'" & dr("项目名称") & "\'", "日期,[_Identify]")
                For i As Integer = 1 To drs.Count - 1
                    drs(i)("余额") = drs(i-1)("余额") + drs(i)("收入") - drs(i)("支出")
                Next
            End If
        End If
End Select

--  作者:cd_tdh
--  发布时间:2020/5/25 17:41:00
--  

老师,支出累计和最后一行余额差了第一个40元呢,第2行余额不对

开始重置列不对,我重新修改了第一行金额后面就对了

[此贴子已经被作者于2020/5/25 17:53:37编辑过]

--  作者:cd_tdh
--  发布时间:2020/5/26 10:08:00
--  

老师,还是那个问题,重置列后,第一个40元没每进入到第二条余额

 


--  作者:有点蓝
--  发布时间:2020/5/26 10:17:00
--  
日期 < #" & mr("日期")

全部改为

日期 <= #" & mr("日期")