Foxtable(狐表)用户栏目专家坐堂 → 分页加载与流水账


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

主题:分页加载与流水账

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
分页加载与流水账  发帖心情 Post By: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编辑过]

 回到顶部