Foxtable(狐表)用户栏目专家坐堂 → 统计后台数据,慢。怎么办呢?


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

主题:统计后台数据,慢。怎么办呢?

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


加好友 发短信
等级:四尾狐 帖子:843 积分:5982 威望:0 精华:0 注册:2013/6/29 9:36:00
统计后台数据,慢。怎么办呢?  发帖心情 Post By:2016/12/7 17:50:00 [只看该作者]

Sele ct Case e.DataCol.name
    Case "审核"
        If e.DataRow("结帐") = False Then
            Dim dr As DataRow = e.DataRow
            
            Dim cmd1 As New SQLCommand
            cmd1.C
            cmd1.CommandText = "Sele ct 洽商增加预算额,洽商增加结算额,洽商减少预算额,洽商减少结算额,合同编号 From {洽商汇总} Where 合同编号= '" & e.DataRow("合同编号") & "'" '注意要包括主键列
            Dim dt1 As DataTable = cmd1.ExecuteReader() '注意可选参数设置为True
            If dt1.DataRows.Count > 0 Then 
                dr("洽商增加预算额")=dt1.Compute("sum(洽商增加预算额)","合同编号= '" & dr("合同编号") & "'")
                dr("洽商增加结算额")=dt1.Compute("sum(洽商增加结算额)","合同编号= '" & dr("合同编号") & "'")
                dr("洽商减少预算额")=dt1.Compute("sum(洽商减少预算额)","合同编号= '" & dr("合同编号") & "'")
                dr("洽商减少结算额")=dt1.Compute("sum(洽商减少结算额)","合同编号= '" & dr("合同编号") & "'")
            Else
                dr("洽商增加预算额")=0
                dr("洽商增加结算额")=0
                dr("洽商减少预算额")=0
                dr("洽商减少结算额")=0
            End If
            
            Dim cmd2 As New SQLCommand
            cmd2.C
            cmd2.CommandText = "Sele ct 设计费预算,设计费结算,合同编号 From {设计汇总} Where 合同编号= '" & e.DataRow("合同编号") & "'" '注意要包括主键列
            Dim dt2 As DataTable = cmd2.ExecuteReader() '注意可选参数设置为True
            If dt2.DataRows.Count > 0 Then 
                dr("设计费预算")=dt2.Compute("sum(设计费预算)","合同编号='" & e.DataRow("合同编号") & "'")
                dr("设计费结算")=dt2.Compute("sum(设计费结算)","合同编号='" & e.DataRow("合同编号") & "'")
            Else
                dr("设计费预算")=0
                dr("设计费结算")=0
            End If
            
            Dim cmd3 As New SQLCommand
            cmd3.C
            cmd3.CommandText = "Sele ct 金额,用途,主类别,往来单位,合同编号 From {收支管理} Where 合同编号= '" & e.DataRow("合同编号") & "'" '注意要包括主键列
            Dim dt3 As DataTable = cmd3.ExecuteReader() '注意可选参数设置为True
            If dt3.DataRows.Count > 0 Then 
                dr("质保金实收") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '质保金'")
                dr("甲方预付款") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '甲方付款' And [主类别] = '预付款'")
                dr("甲方进度款") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '甲方付款' And [主类别] = '进度款'")
                dr("甲方洽商款") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '甲方付款' And [主类别] = '洽商款'")
                dr("甲方结算款") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '甲方付款' And [主类别] = '结算款'")
                dr("财务费用") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '公司运营' And [主类别] = '财务费用'")
                dr("管理费用") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '公司运营' And [主类别] = '管理费用'")
                dr("销售费用") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '公司运营' And [主类别] = '销售费用'")
                dr("资质挂靠费") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '资质挂靠费'")
                dr("总包管理费") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '总包管理费'")
                dr("交际费") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '项目交际费'")
                dr("税金") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '税金'")
                dr("fa piao费") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = 'fa piao费'")
                dr("设计费") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '设计费'")
                dr("财务分摊") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '财务分摊'")
                dr("现场经费") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '现场经费'")
                dr("借款利息") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '借款利息'")
                dr("导支piao手续费") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '导支piao手续费'")
                dr("实分红1") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '利润分红' and 往来单位 ='闫廷勇'")
                dr("实分红2") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '利润分红' and 往来单位 ='闫春'")
                dr("分包预付款") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '分包付款' And [主类别] = '预付款'")
                dr("分包进度款") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '分包付款' And [主类别] = '进度款'")
                dr("分包洽商款") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '分包付款' And [主类别] = '洽商款'")
                dr("分包结算款") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '分包付款' And [主类别] = '结算款'")
            Else
                dr("质保金实收") = 0
                dr("甲方预付款") = 0
                dr("甲方进度款") = 0
                dr("甲方洽商款") = 0
                dr("甲方结算款") =0
                dr("财务费用") =0
                dr("管理费用") = 0
                dr("销售费用") =0
                dr("资质挂靠费") =0
                dr("总包管理费") =0
                dr("交际费") =0
                dr("税金") = 0
                dr("fa piao费") = 0
                dr("设计费") = 0
                dr("财务分摊") = 0
                dr("现场经费") =0
                dr("借款利息") = 0
                dr("导支piao手续费") = 0
                dr("实分红1") = 0
                dr("实分红2") = 0
                dr("分包预付款") = 0
                dr("分包进度款") =0
                dr("分包洽商款") = 0
                dr("分包结算款") = 0
            End If
            
            Dim cmd4 As New SQLCommand
            cmd4.C
            cmd4.CommandText = "Sel ect  已付金额,欠款金额,合同编号 From {采购入库} Where 合同编号= '" & e.DataRow("合同编号") & "'" '注意要包括主键列
            Dim dt4 As DataTable = cmd4.ExecuteReader() '注意可选参数设置为True
            If dt4.DataRows.Count > 0 Then 
                dr("材料费") = dt4.Compute("Sum(已付金额)"," 合同编号 = '" & e.DataRow("合同编号") & "'")
                dr("材料费欠款") = dt4.Compute("Sum(欠款金额)","合同编号 = '" & e.DataRow("合同编号") & "'")
            Else
                
                dr("材料费") = 0
                dr("材料费欠款") = 0
            End If
            
            Dim cmd5 As New SQLCommand
            cmd5.C
            cmd5.CommandText = "Sel ect  本次付款,欠款金额,合同编号 From {工资发放} Where 合同编号= '" & e.DataRow("合同编号") & "'" '注意要包括主键列
            Dim dt5 As DataTable = cmd5.ExecuteReader() '注意可选参数设置为True
            If dt5.DataRows.Count > 0 Then 
                dr("人工费") = dt5.Compute("sum(本次付款)","[合同编号]='" & e.DataRow("合同编号") & "'")
                dr("人工费欠款") = dt5.Compute("sum(欠款金额)","[合同编号]='" & e.DataRow("合同编号") & "'")
            Else
                dr("人工费") = 0
                dr("人工费欠款") = 0
            End If
            
            Dim cmd6 As New SQLCommand
            cmd6.C
            cmd6.CommandText = "Se lect  本次付款,欠款金额,合同编号 From {机具订单} Where 合同编号= '" & e.DataRow("合同编号") & "'" '注意要包括主键列
            Dim dt6 As DataTable = cmd6.ExecuteReader() '注意可选参数设置为True
            If dt6.DataRows.Count > 0 Then 
                dr("机械费")=dt6.Compute("sum(本次付款)","合同编号 = '" & e.DataRow("合同编号") & "'")
                dr("机具费欠款")=dt6.Compute("sum(欠款金额)","合同编号 = '" & e.DataRow("合同编号") & "'")
            Else
                dr("机械费")=0
                dr("机具费欠款")=0
            End If
            dr.save
        End If
End Se lect

审核列,重置时,有:20行,数据需要从后台统计,每一行,计算后面的数据,大概平均:500行;(未加载的数据)
运行时间:10秒。我是设置在,切换 到当前表,就重置:审核,列的。

请问,老师这样的代码,写法上有没有更优的方法?
还有,统计方式对吗?有没有更快的方法?


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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/7 18:45:00 [只看该作者]

一起计算的时候,不要重置列,可以单独做一个按钮的。

 

把需要的数据线加载出来(一次),然后循环各行,查询统计。

 


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


加好友 发短信
等级:四尾狐 帖子:843 积分:5982 威望:0 精华:0 注册:2013/6/29 9:36:00
  发帖心情 Post By:2016/12/8 10:10:00 [只看该作者]

我感觉做按钮是一个次级的方法。有没有更好的方法?

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/8 11:36:00 [只看该作者]

以下是引用yancheng在2016/12/8 10:10:00的发言:
我感觉做按钮是一个次级的方法。有没有更好的方法?

 

把重置列按钮的代码改成你按钮的代码

 

http://www.foxtable.com/webhelp/scr/1079.htm

 


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


加好友 发短信
等级:四尾狐 帖子:843 积分:5982 威望:0 精华:0 注册:2013/6/29 9:36:00
  发帖心情 Post By:2016/12/8 12:15:00 [只看该作者]

不还是按钮吗?

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


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57634 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2016/12/8 13:48:00 [只看该作者]

 我去 你这个算法 如果去重置一下,那不不要等半天

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


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57634 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2016/12/8 13:49:00 [只看该作者]

dr("实分红1") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '利润分红' and 往来单位 ='闫廷勇'")
                dr("实分红2") = dt3.compute("Sum(金额)","[合同编号]= '" & e.DataRow("合同编号") & "' and [用途] = '项目运营' And [主类别] = '利润分红' and 往来单位 ='闫春'")


万一这两个老兄不在了,怎么办?

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


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2016/12/8 13:58:00 [只看该作者]

这个就是SQL用Group by 进行Sum统计,直接就能得到结果了,那要这么复杂的计算。 1秒钟都不要的事情

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/8 14:42:00 [只看该作者]

以下是引用yancheng在2016/12/8 12:15:00的发言:
不还是按钮吗?

 

那你想怎样?不要用 SQLCommand,全部改成SqlCompute

 

http://www.foxtable.com/webhelp/scr/2897.htm

 


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


加好友 发短信
等级:四尾狐 帖子:843 积分:5982 威望:0 精华:0 注册:2013/6/29 9:36:00
  发帖心情 Post By:2016/12/9 17:47:00 [只看该作者]

Dim cmd4 As New SQLCommand
cmd4.C
cmd4.CommandText = "Sel ect sum(已付金额) as 已付金额合计,sum(欠款金额) as 欠款金额合计 From {采购入库} Where 合同编号= '" & e.DataRow("合同编号") & "'"
Dim dt4 As DataTable = cmd4.ExecuteReader() '注意可选参数设置为True
If dt4.DataRows.Count  > 0 Then
    dr("材料费") = dt4.DataRows(0)("已付金额合计")
    dr("材料费欠款") = dt4.DataRows(0)("欠款金额合计")
Else
    
    dr("材料费") = 0
    ' dr("材料费欠款") = 0
End If

我把上面的代码改成这样了,也一样的计算时间:10秒。慢得受不了。 我是切换一个当前表,就执行重置:审核 。

有点色,老师说的:用:SqlCompute,我第一次就改的这个,超级慢,都等于死机了。

帅哥哟,离线,有人找我吗?
jspta  说的:SQL用Group by 进行Sum统计,  我想跟我现在用的上面的代码一样作用吧。请问一下,有没有其它 的SELECT语句可以,让上面的计算更快?

 回到顶部
总数 11 1 2 下一页