以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  统计后台数据,慢。怎么办呢?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=93813)

--  作者:yancheng
--  发布时间: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("发票费") = 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("实分红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("发票费") = 0
                dr("设计费") = 0
                dr("财务分摊") = 0
                dr("现场经费") =0
                dr("借款利息") = 0
                dr("导支票手续费") = 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秒。我是设置在,切换 到当前表,就重置:审核,列的。

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


--  作者:有点色
--  发布时间:2016/12/7 18:45:00
--  

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

 

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

 


--  作者:yancheng
--  发布时间:2016/12/8 10:10:00
--  
我感觉做按钮是一个次级的方法。有没有更好的方法?
--  作者:有点色
--  发布时间:2016/12/8 11:36:00
--  
以下是引用yancheng在2016/12/8 10:10:00的发言:
我感觉做按钮是一个次级的方法。有没有更好的方法?

 

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

 

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

 


--  作者:yancheng
--  发布时间:2016/12/8 12:15:00
--  
不还是按钮吗?
--  作者:blackzhu
--  发布时间:2016/12/8 13:48:00
--  
 我去 你这个算法 如果去重置一下,那不不要等半天

--  作者:blackzhu
--  发布时间: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
--  发布时间:2016/12/8 13:58:00
--  
这个就是SQL用Group by 进行Sum统计,直接就能得到结果了,那要这么复杂的计算。 1秒钟都不要的事情
--  作者:有点色
--  发布时间:2016/12/8 14:42:00
--  
以下是引用yancheng在2016/12/8 12:15:00的发言:
不还是按钮吗?

 

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

 

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

 


--  作者:yancheng
--  发布时间: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语句可以,让上面的计算更快?