Foxtable(狐表)用户栏目专家坐堂 → 关于流水账式表的计算效率问题求助(已解决)


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

主题:关于流水账式表的计算效率问题求助(已解决)

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


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
关于流水账式表的计算效率问题求助(已解决)  发帖心情 Post By:2014/5/7 16:29:00 [显示全部帖子]

我有一个表,有62359行数据,现在执行以下代码,半个小时过去了,还没完成,有没有更好的方法?

 

Select Case e.DataCol.Name
    Case "入库量","分摊数量","结存量","余量","标识"
        Dim dr As DataRow
        Dim mr As DataRow = e.DataRow
        Dim drs As List(of DataRow)
        dr = e.DataTable.Find("[_SortKey] < " & mr("_SortKey") & " And [标识] = '" & mr("标识") & "'  ")
        If dr Is Nothing Then '如果没有上一行,说明本行就是同产品的第一行
            mr("余量") = mr("结存量") - mr("入库量")
            If mr("余量") >= 0 Then
                mr("分摊数量") =  mr("入库量")
            Else
                mr("分摊数量") = mr("结存量")
            End If
            dr = mr
        End If
        drs = e.DataTable.Select("[_SortKey] >= " & dr("_SortKey") & " And [标识] = '" & mr("标识") & "' ")
        For i As Integer = 1 To drs.Count - 1 '重算余下行的余额
            drs(i)("余量") = drs(i-1)("余量") - drs(i)("入库量")
            If drs(i)("余量") > = 0 Then
                drs(i)("分摊数量") = drs(i)("入库量")
            Else
                drs(i)("分摊数量") = drs(i-1)("余量")
            End If
        Next
End Select

[此贴子已经被作者于2014-5-18 22:22:30编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
jiterp
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
  发帖心情 Post By:2014/5/7 18:24:00 [显示全部帖子]

以下是引用有点甜在2014-5-7 17:00:00的发言:

 这句,余量和分摊数量不应该写,改一下。

 

Select Case e.DataCol.Name
    Case "入库量","结存量","标识"

这里改了计算没结果,我要计算分摊数量与余量结果。

[此贴子已经被作者于2014-5-7 18:24:48编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
jiterp
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
  发帖心情 Post By:2014/5/7 18:49:00 [显示全部帖子]

以下是引用Bin在2014-5-7 16:30:00的发言:
分页加载流水账看这里http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=48879

我不能采用分页模式,因为这个表是用来计算库龄的,计算出结果后,会按照计算结果删除分摊数量<=0的数据,也就是说6万多行,到最后最多可能留下几千行数据的记录行。


 回到顶部
帅哥哟,离线,有人找我吗?
jiterp
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
  发帖心情 Post By:2014/5/7 20:32:00 [显示全部帖子]

下面是数据测试例子,执行计算后,到最后自己退出了程序。

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:数据测试.rar

 


 回到顶部
帅哥哟,离线,有人找我吗?
jiterp
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:715 积分:8574 威望:0 精华:0 注册:2011/11/13 15:49:00
  发帖心情 Post By:2014/5/7 22:09:00 [显示全部帖子]

以下是引用有点甜在2014-5-7 21:32:00的发言:

 没办法,不能用datacolchanged,太慢了,直接计算吧。1-2分钟,等一下。

 

SystemReady = False
DataTables("表A").StopRedraw
Dim drs As List(of DataRow) = DataTables("表A").Select("", "标识")
Dim prevBZ As String = ""
For i As Integer = 0 To drs.Count - 1
    If drs(i)("标识") <> prevBZ Then
        Dim mr As DataRow = drs(i)
        mr("余量") = mr("结存量") - mr("入库量")
        If mr("余量") >= 0 Then
            mr("分摊数量") =  mr("入库量")
        Else
            mr("分摊数量") = mr("结存量")
        End If
        prevBZ = mr("标识")
    Else
        drs(i)("余量") = drs(i-1)("余量") - drs(i)("入库量")
        If drs(i)("余量") > = 0 Then
            drs(i)("分摊数量") = drs(i)("入库量")
        Else
            drs(i)("分摊数量") = drs(i-1)("余量")
        End If
    End If
Next
DataTables("表A").ResumeRedraw
SystemReady = True

这就是需要这样的效果,太谢谢你了。


 回到顶部