Foxtable(狐表)用户栏目专家坐堂 → 汇总求助


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

主题:汇总求助

帅哥哟,离线,有人找我吗?
实话实说
  31楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2649 积分:19384 威望:0 精华:1 注册:2008/9/12 9:19:00
  发帖心情 Post By:2012/9/1 15:11:00 [只看该作者]

以下是引用lin_hailun在2012-9-1 14:29:00的发言:

如果是这个问题的话,帮你稍微替换了下原先的代码,测试有效,效率自己测试。

Dim s As String = e.Form.Controls("月份").Value
If s <> "" Then
    Dim n As Integer = e.Form.Controls("月份").Value
    DataTables("月报表").DataRows.Clear
    Dim Arys As List(Of String())
    Arys = DataTables("入仓").GetUniqueValues("", "型号","规格")
    For Each Ary As String() In Arys
        Dim r As Row = Tables("月报表").AddNew
        r("型号") = Ary(0)
        r("规格") = Ary(1)
    Next
    For Each dr As DataRow In DataTables("月报表").DataRows
        Dim s1 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 = '" & s & "'"
        'Dim s2 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 < " & n
        'Dim Sum,Sum1 As Double

        dr("本月入仓_数量") = DataTables("入仓").Compute("Sum(入仓数量)",s1)
        dr("本月入仓_金额") = DataTables("入仓").Compute("Sum(入仓金额)",s1)
        dr("本月出仓_数量") = DataTables("出仓").Compute("Sum(出仓数量)",s1)
      
        '自己进行统计
        Dim s2 As String =  "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "'"
        Dim Sum, Sum1, Sum2 As Double
        Sum = 0
        Sum1 = 0
        Sum2 = 0
        Dim drs As List(Of DataRow)
        drs = DataTables("入仓").Select(s2, "月份")
        Dim mdr As DataRow
        For Each mdr In drs
            If mdr("月份") >= s Then
                Exit For
            End If
            Sum = Sum + mdr("入仓金额")
            Sum1 = Sum1 + mdr("入仓数量")
        Next
      
        drs = DataTables("出仓").Select(s2, "月份")
        For Each mdr In drs
            If mdr("月份") >= s Then
                Exit For
            End If
            Sum2 = Sum2 + mdr("出仓数量")
        Next


        'Sum = DataTables("入仓").Compute("Sum(入仓金额)",s2)
        'Sum1 = DataTables("入仓").Compute("Sum(入仓数量)",s2)
        'dr("上月结存_数量") = Sum1 - DataTables("出仓").Compute("Sum(出仓数量)",s2)

        dr("上月结存_数量") = Sum1 - Sum2      

        '-----------------------计算上月结存金额
        dr("上月结存_金额") = Sum / Sum1 * dr("上月结存_数量")
        '-----------------------
      
        dr("本月加权平均单价") = (dr("上月结存_金额") + dr("本月入仓_金额"))/(dr("上月结存_数量") + dr("本月入仓_数量"))
        dr("本月结存_数量") = dr("上月结存_数量") + dr("本月入仓_数量") - dr("本月出仓_数量")
      
        dr("本月结存_金额") = dr("本月加权平均单价") * dr("本月结存_数量")
        dr("本月出仓_金额") = dr("本月加权平均单价") * dr("本月出仓_数量")
      
    Next
End If

3000记录25秒,有一点改善,还不能满足要求,希望10000条记录5秒以下,3000条记录2秒以下


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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/9/1 15:51:00 [只看该作者]

输入3000行数据,给大家测试


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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/9/1 16:01:00 [只看该作者]

应该是这个原因:

http://www.foxtable.com/help/topics/2225.htm

 

 

我没有测试,你自己测试下面的代码:

 

DataTables("月报表").DataRows.Clear
Dim s As String = e.Form.controls("月份").Value
Tables("月报表").StopRedraw
If s <> "" Then
    Dim n As Integer = e.Form.controls("月份").Value
    DataTables("月报表").DataRows.Clear
    Dim Arys As List(Of String())
    Arys = DataTables("入仓").GetUniqueValues("", "型号","规格")
   
    Dim drs As New List(of DataRow)
    For Each Ary As String() In Arys
        Dim r As DataRow = DataTables("月报表").AddNew
        r("型号") = Ary(0)
        r("规格") = Ary(1)
        drs.add(r)
    Next
    For Each dr As DataRow In drs
        Dim s1 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 = '" & s & "'"
        Dim s2 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 < " & n
        Dim Sum,Sum1 As Double
        dr("本月入仓_数量") = DataTables("入仓").Compute("Sum(入仓数量)",s1)
        dr("本月入仓_金额") = DataTables("入仓").Compute("Sum(入仓金额)",s1)
        dr("本月出仓_数量") = DataTables("出仓").Compute("Sum(出仓数量)",s1)
       
        Sum = DataTables("入仓").Compute("Sum(入仓金额)",s2)
        Sum1 = DataTables("入仓").Compute("Sum(入仓数量)",s2)
        dr("上月结存_数量") = Sum1 - DataTables("出仓").Compute("Sum(出仓数量)",s2)
       
        '-----------------------计算上月结存金额
        dr("上月结存_金额") = Sum / Sum1 * dr("上月结存_数量")
        '-----------------------
       
        dr("本月加权平均单价") = (dr("上月结存_金额") + dr("本月入仓_金额"))/(dr("上月结存_数量") + dr("本月入仓_数量"))
        dr("本月结存_数量") = dr("上月结存_数量") + dr("本月入仓_数量") - dr("本月出仓_数量")
       
        dr("本月结存_金额") = dr("本月加权平均单价") * dr("本月结存_数量")
        dr("本月出仓_金额") = dr("本月加权平均单价") * dr("本月出仓_数量")
    Next
End If
Tables("月报表").ResumeRedraw

[此贴子已经被作者于2012-9-1 16:03:05编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2649 积分:19384 威望:0 精华:1 注册:2008/9/12 9:19:00
  发帖心情 Post By:2012/9/1 16:34:00 [只看该作者]

以下是引用狐狸爸爸在2012-9-1 15:51:00的发言:

输入3000行数据,给大家测试

我整理一下


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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/9/1 16:35:00 [只看该作者]

上面的不行,这次应该可以了:

 

DataTables("月报表").DataRows.Clear
Dim s As String = e.Form.Controls("月份").Value
If s <> "" Then
    Dim n As Integer = e.Form.Controls("月份").Value
    DataTables("月报表").DataRows.Clear
    Dim Arys As List(Of String())
    Arys = DataTables("入仓").GetUniqueValues("", "型号","规格")
    For Each Ary As String() In Arys
        Dim r As Row = Tables("月报表").AddNew
        r("型号") = Ary(0)
        r("规格") = Ary(1)
    Next
    Dim drs As new Dictionary(of DataRow,String())
    For Each dr As DataRow In DataTables("月报表").DataRows
        Dim vals(8) As String
        Dim s1 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 = '" & s & "'"
        Dim s2 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 < " & n
        Dim Sum,Sum1 As Double
        vals(0) = DataTables("入仓").Compute("Sum(入仓数量)",s1)
        vals(1) = DataTables("入仓").Compute("Sum(入仓金额)",s1)
        vals(2) = DataTables("出仓").Compute("Sum(出仓数量)",s1)
       
        Sum = DataTables("入仓").Compute("Sum(入仓金额)",s2)
        Sum1 = DataTables("入仓").Compute("Sum(入仓数量)",s2)
        vals(3) = Sum1 - DataTables("出仓").Compute("Sum(出仓数量)",s2)
       
        '-----------------------计算上月结存金额
        vals(4) = Sum / Sum1 * dr("上月结存_数量")
        '-----------------------
       
        vals(5) = (dr("上月结存_金额") + dr("本月入仓_金额"))/(dr("上月结存_数量") + dr("本月入仓_数量"))
        vals(6) = dr("上月结存_数量") + dr("本月入仓_数量") - dr("本月出仓_数量")
       
        vals(7) = dr("本月加权平均单价") * dr("本月结存_数量")
        vals(8) = dr("本月加权平均单价") * dr("本月出仓_数量")
        drs.add(dr,vals)
    Next
    For Each dr As DataRow In drs.Keys
        Dim vals As String() = drs(dr)
        dr("本月入仓_数量") =vals(0)
        dr("本月入仓_金额") = vals(1)
        dr("本月出仓_数量") = vals(2)
        dr("上月结存_数量") = vals(3)
        dr("上月结存_金额") = vals(4)
        dr("本月加权平均单价") = vals(5)
        dr("本月结存_数量") = vals(6)
        dr("本月结存_金额") = vals(7)
        dr("本月出仓_金额") = vals(8)
    Next
End If


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


加好友 发短信
等级:九尾狐 帖子:2649 积分:19384 威望:0 精华:1 注册:2008/9/12 9:19:00
  发帖心情 Post By:2012/9/1 16:36:00 [只看该作者]

以下是引用狐狸爸爸在2012-9-1 16:01:00的发言:

应该是这个原因:

http://www.foxtable.com/help/topics/2225.htm

 

 

我没有测试,你自己测试下面的代码:

 

DataTables("月报表").DataRows.Clear
Dim s As String = e.Form.controls("月份").Value
Tables("月报表").StopRedraw
If s <> "" Then
    Dim n As Integer = e.Form.controls("月份").Value
    DataTables("月报表").DataRows.Clear
    Dim Arys As List(Of String())
    Arys = DataTables("入仓").GetUniqueValues("", "型号","规格")
   
    Dim drs As New List(of DataRow)
    For Each Ary As String() In Arys
        Dim r As DataRow = DataTables("月报表").AddNew
        r("型号") = Ary(0)
        r("规格") = Ary(1)
        drs.add(r)
    Next
    For Each dr As DataRow In drs
        Dim s1 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 = '" & s & "'"
        Dim s2 As String = "型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "' And 月份 < " & n
        Dim Sum,Sum1 As Double
        dr("本月入仓_数量") = DataTables("入仓").Compute("Sum(入仓数量)",s1)
        dr("本月入仓_金额") = DataTables("入仓").Compute("Sum(入仓金额)",s1)
        dr("本月出仓_数量") = DataTables("出仓").Compute("Sum(出仓数量)",s1)
       
        Sum = DataTables("入仓").Compute("Sum(入仓金额)",s2)
        Sum1 = DataTables("入仓").Compute("Sum(入仓数量)",s2)
        dr("上月结存_数量") = Sum1 - DataTables("出仓").Compute("Sum(出仓数量)",s2)
       
        '-----------------------计算上月结存金额
        dr("上月结存_金额") = Sum / Sum1 * dr("上月结存_数量")
        '-----------------------
       
        dr("本月加权平均单价") = (dr("上月结存_金额") + dr("本月入仓_金额"))/(dr("上月结存_数量") + dr("本月入仓_数量"))
        dr("本月结存_数量") = dr("上月结存_数量") + dr("本月入仓_数量") - dr("本月出仓_数量")
       
        dr("本月结存_金额") = dr("本月加权平均单价") * dr("本月结存_数量")
        dr("本月出仓_金额") = dr("本月加权平均单价") * dr("本月出仓_数量")
    Next
End If
Tables("月报表").ResumeRedraw

[此贴子已经被作者于2012-9-1 16:03:05编辑过]

还是25秒,估计还是30楼描述的:"非等于比较"问题


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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/9/1 16:57:00 [只看该作者]

看35楼

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


加好友 发短信
等级:九尾狐 帖子:2649 积分:19384 威望:0 精华:1 注册:2008/9/12 9:19:00
  发帖心情 Post By:2012/9/1 18:10:00 [只看该作者]

以下是引用狐狸爸爸在2012-9-1 16:57:00的发言:
看35楼

还是不行,现整理数据上传

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:月结表.table


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33945 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2012/9/1 22:23:00 [只看该作者]

加是e.Form.StopRedraw,选择8月份数据,耗时7.4秒,可以接受啊。

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33945 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2012/9/1 22:25:00 [只看该作者]

以下是引用实话实说在2012-9-1 15:11:00的发言:

3000记录25秒,有一点改善,还不能满足要求,希望10000条记录5秒以下,3000条记录2秒以下

 

如果要求这个速度,你要改变思路,每月的结存单独做一张表,计算下月数据时从该表提取,应该能达到你想要的速度。


 回到顶部
总数 47 上一页 1 2 3 4 5 下一页