以文本方式查看主题 - Foxtable(狐表) (http://www.foxtable.com/bbs/index.asp) -- 专家坐堂 (http://www.foxtable.com/bbs/list.asp?boardid=2) ---- 求助 (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=159357) |
||||
-- 作者:shixia -- 发布时间: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,只触发该行就可以重算后面所有行,而达到减少程序响应时间目的。
|
||||
-- 作者:有点蓝 -- 发布时间:2020/12/23 16:11:00 --
|
||||
-- 作者:shixia -- 发布时间: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() 该代码对所有行进行重算,效率很低,我想只针对新增加行进行重算,新增加行日期以后的余额就会自动计算,从而提高效率 |
||||
-- 作者:有点蓝 -- 发布时间: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 -- 发布时间: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 这个代码不完整啊,能补充完整吗?
|
||||
-- 作者:有点蓝 -- 发布时间:2021/1/24 20:30:00 -- 在2楼项目实例的基础上。原来的代码里改动 |