Foxtable(狐表)用户栏目专家坐堂 → 求助


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

主题:求助

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


加好友 发短信
等级:三尾狐 帖子:759 积分:7038 威望:0 精华:1 注册:2008/9/2 20:04:00
求助  发帖心情 Post By:2020/12/23 15:51:00 [只看该作者]

资金流水表中DataColChanged 事件中,对余额计算是以SortKey排序计算。
输入时日期是随机输入,因为不是按照日期从小到大增加,但每次进入资金流水表,想按日期排序后,再计算一次余额,达到程序余额和银行对账单金额一致。
因此在项目属性MainTableChanged事件中运行以下代码
       Tables("资金流水").Filter = ""
        Tables("资金流水").Sort = "日期"       
        For Each r As Row In Tables("资金流水").Rows
            If r("_sortkey") <>  r.Index Then
                r("_sortkey") = r.Index
            End If
        Next
        
        Tables("资金流水").Sort = ""
        DataTables("资金流水").dataCols("流入金额").RaiseDataColChanged()

该代码可以达到目的,但是随着数据量增加,每次进入资金流水表时,程序响应时间变长,因此,想找出第一个r("_sortkey") <>  r.Index 的行,然后只对该行执行额").RaiseDataColChanged,只触发该行就可以重算后面所有行,而达到减少程序响应时间目的。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试.zip


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


加好友 发短信
等级:超级版主 帖子:109505 积分:557193 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/23 16:11:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:地材账务管理.zip


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


加好友 发短信
等级:三尾狐 帖子:759 积分:7038 威望:0 精华:1 注册:2008/9/2 20:04:00
  发帖心情 Post By:2020/12/23 17:37:00 [只看该作者]

谢谢。你把资金流水表的事件修改如下,表事件没有修改。这个方案不能解决我想解决的问题:

      dr = e.DataTable.Find("[_SortKey] < " & e.DataRow("_SortKey") & " and 日期 <= #" & e.DataRow("日期") & "#", "日期 desc,[_SortKey] Desc") '找出上一行
        If dr Is Nothing Then '如果没有找到上一行,说明本行就是第一行
            e.DataRow("余额") = e.DataRow("流入金额") - e.DataRow("流出金额")
            dr = e.DataRow
        End If       
        
        drs = e.DataTable.Select("[_SortKey] >= " & dr("_SortKey") & " And 日期 >= #" & e.DataRow("日期") & "#", "日期,[_SortKey]")
        For i As Integer = 1 To drs.Count - 1 '重算余下行的余额
            drs(i)("余额") = drs(i-1)("余额") + drs(i)("流入金额") - drs(i)("流出金额")
        Next
假设上一行有数据 ,新增加一行数据,日期为2020年10月13日,流出金额150,上一行日期为2020年11月28日,余额为200,因为是新增加行,所以该行_SortKey肯定大于上一行_SortKey,因此代码执行后新增加行的余额应该是50。当离开此表,再进入此表时,我希望将该表数据按日期重新排序,并执行以下代码
       Tables("资金流水").Filter = ""
        Tables("资金流水").Sort = "日期"       
        For Each r As Row In Tables("资金流水").Rows
            If r("_sortkey") <>  r.Index Then
                r("_sortkey") = r.Index
            End If
        Next
        
        Tables("资金流水").Sort = ""

那么新增加行的余额应该重新计算,不能再是50,此时表事件代码已经不能再计算该 行余额,因此在项目切换主表事件中执行以下代码来重算余额
        DataTables("资金流水").dataCols("流入金额").RaiseDataColChanged()
该代码对所有行进行重算,效率很低,我想只针对新增加行进行重算,新增加行日期以后的余额就会自动计算,从而提高效率



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


加好友 发短信
等级:超级版主 帖子:109505 积分:557193 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/12/24 8:43:00 [只看该作者]

    Case "流入金额","流出金额"
        dr = e.DataTable.Find("[_SortKey] < " & e.DataRow("_SortKey") & " and 日期 <= #" & e.DataRow("日期") & "#", "日期 desc,[_SortKey] Desc") '找出上一行
        If dr Is Nothing Then '如果没有找到上一行,说明本行就是第一行
            e.DataRow("余额") = e.DataRow("流入金额") - e.DataRow("流出金额")
            dr = e.DataRow
        Else
            e.DataRow("余额") = dr("余额") + e.DataRow("流入金额") - e.DataRow("流出金额")
        End If
        
        
        drs = e.DataTable.Select("日期 >= #" & e.DataRow("日期") & "#", "日期,[_SortKey]")
        For i As Integer = 1 To drs.Count - 1 '重算余下行的余额
            drs(i)("余额") = drs(i-1)("余额") + drs(i)("流入金额") - drs(i)("流出金额")
        Next

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


加好友 发短信
等级:幼狐 帖子:84 积分:679 威望:0 精华:0 注册:2020/12/25 0:49:00
  发帖心情 Post By:2021/1/23 19:21:00 [只看该作者]

Case "流入金额","流出金额"
    dr = e.DataTable.Find("[_SortKey] < " & e.DataRow("_SortKey") & " and 日期 <= #" & e.DataRow("日期") & "#", "日期 desc,[_SortKey] Desc") '找出上一行

If dr Is Nothing Then '如果没有找到上一行,说明本行就是第一行
    e.DataRow("余额") = e.DataRow("流入金额") - e.DataRow("流出金额")
    dr = e.DataRow
Else
    e.DataRow("余额") = dr("余额") + e.DataRow("流入金额") - e.DataRow("流出金额")
End If
End Select

drs = e.DataTable.Select("日期 >= #" & e.DataRow("日期") & "#", "日期,[_SortKey]")
For i As Integer = 1 To drs.Count - 1 '重算余下行的余额
    drs(i)("余额") = drs(i-1)("余额") + drs(i)("流入金额") - drs(i)("流出金额")
Next

这个代码不完整啊,能补充完整吗?

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


加好友 发短信
等级:超级版主 帖子:109505 积分:557193 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/1/24 20:30:00 [只看该作者]

在2楼项目实例的基础上。原来的代码里改动

 回到顶部