以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  跨表统计的运算速度  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=108052)

--  作者:zhangxl1964
--  发布时间:2017/10/15 9:52:00
--  跨表统计的运算速度
有点甜老师:你好!
     帮助看看下面跨表统计的代码,3000多行的数据统计需花费20分钟,如何修改代码提高运算速度?
Dim dr As DataRow = e.DataRow

If e.DataCol.Name = "存货编码"  Then
    Dim QueryMonth As Date \'自定义日期
    Dim QueryMonth1 As Date \'自定义日期
    Dim CKQueryMonth As Date \'自定义日期
    Dim CKJQueryMonth As Date \'自定义日期
    CKJQueryMonth=Forms("进销存统计").Controls("结束日期").value
    CKQueryMonth =Forms("进销存统计").Controls("起始日期").value
    Dim StartDate As New Date(QueryMonth.Today.Year, 1, 1) \'当前日期的年度第一天
    Dim EndDate As New Date(QueryMonth.Today.Year, 12 ,31) \'当前日期的年度最后一天
    Dim ShangDate As New Date(QueryMonth.Today.Year-1) \'当前日期的上一年
    Dim SDStartDate As New Date(QueryMonth.Today.Year-1, 1, 1) \'当前日期的上年度第一天
    Dim SZEndDate As New Date(QueryMonth.Today.Year-1, 12 ,31) \'当前日期的上年度最后一天
    Dim StartMonth As Date \'月份第一天
    \'Dim khNum As String \'员工编号
    \'khNum=e.DataRow("客户编码")
    Dim Num As String \'员工编号
    Num=e.DataRow("存货编码")
    QueryMonth=e.DataRow("日期")
    StartMonth=CStr(Year(QueryMonth)) & "-" & CStr(Month(QueryMonth)) & "-1"
    Dim FirstDay As Date = New Date(QueryMonth.Year,QueryMonth.Month,1) \'当前月度第一天
    Dim LastDay As Date = New Date(QueryMonth.Year,QueryMonth.Month,Date.DaysInMonth(QueryMonth.Year,QueryMonth.Month)) \'当前月度最后一天
    \'Dim sFirstDay As Date = FirstDay.AddMonths(-1)\'上月第一天
    \'Dim sLastDay As Date = New Date(QueryMonth.AddMonths(-1).Year,QueryMonth.AddMonths(-1).Month,Date.DaysInMonth(QueryMonth.AddMonths(-1).Year,QueryMonth.AddMonths(-1).Month)) \'上月最后一天
    Dim sFirstDay As Date = New Date(QueryMonth.Year,QueryMonth.Month-1,1) \'上月第一天
    Dim sLastDay As Date = New Date(QueryMonth.Year,QueryMonth.Month-1,Date.DaysInMonth(QueryMonth.Year,QueryMonth.Month-1)) \'上月最后一天
    Dim rksl As Double
    Dim qcsl As Double
    Dim cksl As Double
    Dim ckje As Double
    Dim rkje As Double
    Dim qcje As Double
    Dim ckdj As Double
    Dim thsl As Double
    Dim thje As Double
    Dim tlsl As Double
    Dim tlje As Double
    Dim kcsl As Double
    Dim kcje As Double
    Dim sgcksl As Double
    Dim sgckje As Double
    Dim rq =dr("日期")
    
    
    
    \'提取当前日期前,期初库存中的期初数量
    Dim cmd3 As New SQLCommand
    cmd3.C
    Dim dt3 As DataTable
    If rq >= "2017-09-01 "   
    cmd3.CommandText = "SELECT sum([库存数量]) As 期初数量 F rom {进销存统计} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & sFirstDay & "\' And [日期] <= \'" & sLastDay & "\' "
    Else
    cmd3.CommandText = "SELECT sum([期初数量]) As 期初数量 F rom {期初库存} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & sFirstDay & "\' And [日期] <= \'" & sLastDay & "\' "
     End If
     dt3 = cmd3.ExecuteReader
    If dt3.DataRows.Count > 0 Then
        qcsl = Math.Round((dt3.DataRows(0)("期初数量")),2)
        \'dr("期初数量") = qcsl
    End If
    
    \'提取当前日期前,期初库存中的期初金额
    Dim cmd4 As New SQLCommand
    cmd4.C
    Dim dt4 As DataTable
    If rq >= "2017-09-01 " 
    cmd4.CommandText = "SELECT sum([库存金额]) As 期初金额 F rom {进销存统计} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & sFirstDay & "\' And [日期] <= \'" & sLastDay & "\' "
    Else
    cmd4.CommandText = "SELECT sum([期初金额]) As 期初金额 F rom {期初库存} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & sFirstDay & "\' And [日期] <= \'" & sLastDay & "\' "
   
    End If
    dt4 = cmd4.ExecuteReader
    If dt4.DataRows.Count > 0 Then
        \'qcje = dt4.DataRows(0)("期初金额")
        qcje = Math.Round((dt4.DataRows(0)("期初金额")),2)
        \'dr("期初金额") = qcje
    End If
    
    \'提取当前日期前,出库明细中的入库数量
    Dim cmd5 As New SQLCommand
    cmd5.C
    Dim dt5 As DataTable
    cmd5.CommandText = "SELECT sum([入库数量]) As 入库数量 F rom {入库明细} Where [存货编码] = \'" & num & "\' And [日期] >= \'" & FirstDay & "\' And [日期] <= \'" & LastDay & "\' and [客户编码] is null  "
    dt5 = cmd5.ExecuteReader
    If dt5.DataRows.Count > 0 Then
        rksl = Math.Round((dt5.DataRows(0)("入库数量")),2)
        \'dr("入库数量") = rksl
    End If
    \'提取当前日期前,出库明细中的入库金额
    Dim cmd6 As New SQLCommand
    cmd6.C
    Dim dt6 As DataTable
    cmd6.CommandText = "SELECT sum([入库金额]) As 入库金额 F rom {入库明细} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & FirstDay & "\' And [日期] <= \'" & LastDay & "\' and [客户编码] is null "
    dt6 = cmd6.ExecuteReader
    If dt6.DataRows.Count > 0 Then
        rkje = Math.Round((dt6.DataRows(0)("入库金额")),2)
        \'dr("入库金额") = rkje
    End If

    \'
    \'提取当前日期前,退货明细中的入库数量
    Dim cmd7 As New SQLCommand
    cmd7.C
    Dim dt7 As DataTable
    cmd7.CommandText = "SELECT sum([退货数量]) As 退货数量 F rom {退货明细} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & FirstDay & "\' And [日期] <= \'" & LastDay & "\' "
    dt7 = cmd7.ExecuteReader
    If dt7.DataRows.Count > 0 Then
        thsl = Math.Round((dt7.DataRows(0)("退货数量")),2)
        \'dr("退货数量") = thsl
    End If
    
    \'提取当前日期前,退货明细中的入库金额
    Dim cmd8 As New SQLCommand
    cmd8.C
    Dim dt8 As DataTable
    cmd8.CommandText = "SELECT sum([金额]) As 金额 F rom {退货明细} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & FirstDay & "\' And [日期] <= \'" & LastDay & "\' "
    dt8 = cmd8.ExecuteReader
    If dt8.DataRows.Count > 0 Then
        thje = Math.Round((dt8.DataRows(0)("金额")),2)
        \'dr("退货金额") = thje
    End If
    
    \'提取当前日期前,出库明细中的入库数量
    Dim cmd1 As New SQLCommand
    cmd1.C
    Dim dt1 As DataTable
    cmd1.CommandText = "SELECT sum([出库数量]) As 出库数量 F rom {申购明细} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & FirstDay & "\' And [日期] <= \'" & LastDay & "\' and [AB分类] = \'A\' "
    dt1 = cmd1.ExecuteReader
    If dt1.DataRows.Count > 0 Then
        cksl = Math.Round((dt1.DataRows(0)("出库数量")),2)
        \'dr("出库数量") = cksl
        \'rksl = cksl
        \'dr("入库数量") = rksl
    End If
    \'提取当前日期前,出库明细中的入库金额
    Dim cmd2 As New SQLCommand
    cmd2.C
    Dim dt2 As DataTable
    cmd2.CommandText = "SELECT sum([进货金额]) As 进货金额 F rom {申购明细} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & FirstDay & "\' And [日期] <= \'" & LastDay & "\' and [AB分类] = \'A\' "
    dt2 = cmd2.ExecuteReader
    If dt2.DataRows.Count > 0 Then
        ckje = Math.Round((dt2.DataRows(0)("进货金额")),2)
        \'dr("出库金额") = ckje
        \'rkje = ckje
        \'dr("入库金额") = rkje
    End If

    \'提取当前日期前,退料明细中的入库数量
    Dim cmd9 As New SQLCommand
    cmd9.C
    Dim dt9 As DataTable
    cmd9.CommandText = "SELECT sum([退料数量]) As 退料数量 F rom {退料明细} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & FirstDay & "\' And [日期] <= \'" & LastDay & "\' "
    dt9 = cmd9.ExecuteReader
    If dt9.DataRows.Count > 0 Then
        tlsl = Math.Round((dt9.DataRows(0)("退料数量")),2)
        \'dr("退料数量") = tlsl
    End If
    \'提取当前日期前,退料明细中的入库金额
    Dim cmd10 As New SQLCommand
    cmd10.C
    Dim dt10 As DataTable
    cmd10.CommandText = "SELECT sum([金额]) As 金额 F rom {退料明细} Where  [存货编码] = \'" & num & "\' And [日期] >= \'" & FirstDay & "\' And [日期] <= \'" & LastDay & "\' "
    dt10 = cmd10.ExecuteReader
    If dt10.DataRows.Count > 0 Then
        tlje = Math.Round((dt10.DataRows(0)("金额")),2)
        \'dr("退料金额") = tlje
    End If
    
    dr("期初金额") = qcje
    dr("期初数量") = qcsl

    If qcsl <> 0 Then
        dr("期初单价") = qcje / qcsl
    Else
        dr("期初单价") = 0
    End If
    
    If rksl-thsl <> 0 Then
        dr("入库数量") = rksl - thsl
        dr("入库金额") = rkje - thje
        dr("入库单价") = (rkje - thje) / (rksl - thsl)
        
    Else
        dr("入库单价") = 0
    End If
    
    If cksl - tlsl <> 0 Then
        dr("出库数量") = cksl - tlsl
        dr("出库金额") = ckje - tlje
        dr("出库单价") = (ckje - tlje) / (cksl - tlsl)
        
    Else
        dr("出库单价") = 0
    End If
    \'
End If

Select Case e.DataCol.Name
    Case "存货编码"

        dr("库存数量") =  dr("期初数量") + dr("入库数量") - dr("出库数量")
        dr("库存金额") =  dr("期初金额") + dr("入库金额") - dr("出库金额")
        
        dr("库存单价") = Math.Abs(dr("库存金额") / dr("库存数量"))
        
End Select

Select Case e.DataCol.Name
    Case "盘点数量"
        If dr.IsNull("盘点数量")  Then
            dr("盘点金额") = Nothing
        Else
            dr("库存数量") = dr("盘点数量")
            dr("出库数量") = dr("入库数量") - dr("库存数量")
            dr("出库金额") = Math.Round(dr("出库数量") * dr("出库单价"),2)
            dr("库存单价") = Math.Round((dr("期初金额") + dr("入库金额") ) / (dr("期初数量") + dr("入库数量") ),4)
            dr("库存金额") = dr("库存单价") * dr("库存数量")
            dr("盘点金额") = dr("库存金额")
        End If
End Select

--  作者:有点甜
--  发布时间:2017/10/15 14:43:00
--  

1、你使用重置列的方式?

 

2、不要频繁使用sqlcommand,如果你datacolchanged使用了,那请不要麻木使用重置列。

 

3、sqlcommand的效率是很低的,比如执行一个,有可能要1秒。那3000行,就很长时间了。如果需要把表数据重新计算一次,那单独做个按钮,把需要统计的数据先加载出来,不要每次都去后台查。