谢谢。你把资金流水表的事件修改如下,表事件没有修改。这个方案不能解决我想解决的问题:
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()
该代码对所有行进行重算,效率很低,我想只针对新增加行进行重算,新增加行日期以后的余额就会自动计算,从而提高效率