http://www.foxtable.com/help/index.html?n=2926.htm
例子上只有收入和支出2个列。如果我的系统里多了一列“结余”,“入库数量”和“出库数量”都是表达式列!如下图:
此主题相关图片如下:qq图片20140527090352.jpg

我的代码如下:
1、删除原来的余额列,然后在项目事件Initialize中设置代码:
DataTables("fucai").DataCols.Add("总库存",Gettype(Double)) '添加余额列,用于动态显示余额
2、将DataColChanged事件设为: (因为结余列是最初的原始库存,不是表达式列,这个代码我不知道结余列这样写对不对?)
Select Case e.DataCol.Name
Case "结余","出库数量","入库数量"
Dim dr As DataRow
Dim drs As List(of DataRow)
dr = e.DataTable.Find("[_SortKey] < " & e.DataRow("_SortKey"), "[_SortKey] Desc") '找出上一行
If dr Is Nothing Then '如果没有找到上一行,说明本行就是第一行
Dim jc As Double '计算之前的结存
jc = DataTables("fucai").SQLCompute("Sun(结余) + Sum(入库数量) - Sum(出库数量)","[_SortKey] < " & e.DataRow("_SortKey"))
e.DataRow("总库存") = e.DataRow("结余") + e.DataRow("入库数量") - e.DataRow("出库数量") + jc
dr = e.DataRow
End If
drs = e.DataTable.Select("[_SortKey] >= " & dr("_SortKey"), "[_SortKey]")
For i As Integer = 1 To drs.Count - 1 '重算余下行的余额,注意i是从1开始遍历的.
drs(i)("总库存") = drs(i-1)("总库存") + drs(i)("入库数量") - drs(i)("出库数量") + drs(i)("结余")
Next
End Select
3、表事件AfterMoveRow的代码保持不变:
Dim
Key As Decimal
Dim Index As Integer
Dim dc As DataCol
Index = Math.Min(e.OldIndex, e.NewIndex)
Key = e.Table.Rows(Index)("_SortKey")
dc = e.Table.DataTable.DataCols("入库数量")
dc.RaiseDataColChanged("[_SortKey] >= " & Key)
4、表事件DataRowDeleting的代码同样保持不变:
e.DataRow("入库数量") = 0
e.DataRow("出库数量") = 0
5、最后AfterOpenproject事件代码设置为:(分页加载这里我用的是自定义的加载树,按条件加载的,这样对下面的代码有影响吗?)
With DataTables("fucai")
.LoadOver = "_SortKey" '设置分页加载依据列
.LoadFilter = "" '清除加载条件
End With