以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  分页加载与流水账  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=48879)

--  作者:狐狸爸爸
--  发布时间:2014/4/8 10:07:00
--  分页加载与流水账

示例文件:
 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:分页流水账.table


 
由于分页加载往往意味着大数据量、网络环境、多用户等元素,所以帮助介绍的流水账设计方案将不再适用,需要重新设计。
好消息是分页加载同时也意味着每次加载的数据量有限,我们可以充分利用这个优势,在每次加载数据后重算余额,其实这样的设计更加符合实际应用的需求。
 
同样假定有个简单的流水帐式的表格,希望在分页加载的情况下,输入收入和支出,能够自动计算出余额:
 
 图片点击可在新窗口打开查看


设计步骤:
 
1、删除原来的余额列,然后在项目事件Initialize中设置代码:


DataTables("例子一").DataCols.Add("余额",Gettype(Double))  \'添加余额列,用于动态显示余额
 
技巧:


A、由于余额是每次加载数据后动态计算得出的,所以这里应该采用表达式列,而不是数据列;这样不仅可以节省存储空间,更重要的是,不会因为重算余额导致系统误认为此行被修改了,需要保存。
B、当然这个表达式列和我们平时的表达式列不同,因为没有给它设置表达式;没有设置表达式的表达式列,可以用代码向该列赋值,希望大家能记住这一点。
C、也许有人会问,为什么要在Initialize事件,而不是AfterOpenProject事件添加列?这是因为在Initialize事件添加的列,可以保存列宽和列位置。

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("例子一").SQLCompute("Sum(收入) - Sum(支出)","[_SortKey] < " & e.DataRow("_SortKey"))
            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)("支出")
        Next
End Select
 
上述代码的原理:

A、如果修改的是第一行,那么就先用SQLCompute方法,从后台计算出此行之前的结存,第一行的收入减去支出,再加上之前的结存,就是第一行的余额。
B、如果不是第一行数据,那么该行的收入减去支出,再加上上一行的结存,就是此行的余额。
 
可以看出,由于有了SQLCompute等后台数据处理行数,设计这么一个分页加载的流水账,变得轻松起来了。
 
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("例子一")
    .LoadOver = "_SortKey" \'清除加载条件
    .LoadFilter = "" \'设置分页加载依据列
End With
Forms("窗口1").Open() \'打开设计好的分页加载窗口

提示: 由于我们的流水账是根据_SortKey的顺序计算的,所以分页加载的语句列必须设置为_SortKey列。

[此贴子已经被作者于2014-4-8 10:08:05编辑过]

--  作者:Bin
--  发布时间:2014/4/8 10:08:00
--  
顶!~~~图片点击可在新窗口打开查看
--  作者:lsy
--  发布时间:2014/4/8 10:10:00
--  
顶,好。
--  作者:jspta
--  发布时间:2014/4/8 11:13:00
--  
B、当然这个表达式列和我们平时的表达式列不同,因为没有给它设置表达式;没有设置表达式的表达式列,可以用代码向该列赋值,希望大家能记住这一点。

精华之一

--  作者:e-png
--  发布时间:2014/4/8 13:20:00
--  
 众生当果断收下····· 图片点击可在新窗口打开查看
--  作者:lhxlhx
--  发布时间:2014/4/8 14:52:00
--  
顶!!大家都来学习
--  作者:逛逛
--  发布时间:2014/4/8 16:53:00
--  
踹一脚,留个爪印。
--  作者:yinyb36
--  发布时间:2014/4/8 20:00:00
--  
顶!!
--  作者:Gryvip
--  发布时间:2014/4/8 20:05:00
--  
谢谢狐爸,顶上去。
--  作者:sydli
--  发布时间:2014/4/8 21:45:00
--  
xuexi 
学习