以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  分页加载与流水账,代码问题,老师帮忙看下!  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=51457)

--  作者:身份不明
--  发布时间:2014/5/27 9:10:00
--  分页加载与流水账,代码问题,老师帮忙看下!

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



--  作者:Bin
--  发布时间:2014/5/27 9:13:00
--  
出现什么问题吗?
--  作者:有点甜
--  发布时间:2014/5/27 9:14:00
--  

 把例子传上来。

 

 你只有修改了 结余 列,才会计算总库存的,表达式列不会触发 DataColChanged。表达式列如果要触发DataColChanged,看这里 http://www.foxtable.com/help/topics/2381.htm

 


--  作者:身份不明
--  发布时间:2014/5/27 9:44:00
--  

为什么我的外部数据源上传不上来呢。mdb格式的,提示文件类型不正确!!


--  作者:Bin
--  发布时间:2014/5/27 9:47:00
--  
压缩打包文件.
--  作者:身份不明
--  发布时间:2014/5/27 11:01:00
--  

 

例子已经上传,请老师帮忙做下具体的代码,改了一上午了,问题还是没解决。

目前开发遇到的问题如下:

1. 我的辅材出库界面已经录了1000多行,如果数据量再大的话,启动速度会慢,如果不全部加载数据的话,那主表

总库存统计的数量就不准确。所以要采用分页加载与流水账的形式来做,甜老师说是表达式列无法触发datacolchanged事件,

所以代码就不知道改如何修改了。

请老师麻烦些,帮我实现这个例子,因为我有好个表都存在这样的问题,都需要修改。谢谢老师了!!

 

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

--  作者:身份不明
--  发布时间:2014/5/27 11:02:00
--  
超过2M传不上来,所以删了好多东西!
--  作者:Bin
--  发布时间:2014/5/27 11:34:00
--  
你做个例子发上来吧,项目打开就报错.而且东西多有点乱.



--  作者:有点甜
--  发布时间:2014/5/27 11:37:00
--  

 看了一下,不明白你为什么要做流水账?明明直接统计即可的。

 

1、删除结余列,入库数量和出库数量改成数据列

 

2、编写datacolchanged的代码

 

Select Case e.DataCol.Name
    Case "辅材编号"
        Dim filter As String = "辅材编号 = \'" & e.DataRow("辅材编号") & "\'"
        e.DataRow("入库数量") = DataTables("fucairuku").SQLCompute("sum(入库数量)", filter)
        e.DataRow("出库数量") = DataTables("fucairuku").SQLCompute("sum(出库数量)", filter)
        e.DataRow("库存总量") = e.DataRow("入库数量") - e.DataRow("出库数量")
End Select


--  作者:身份不明
--  发布时间:2014/5/27 11:47:00
--  

明白了,甜老师,绕了个弯路。可以不删除结余列统计吗?