以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]代码耗时问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=184607)

--  作者:lgj716330
--  发布时间:2022/12/15 17:29:00
--  [求助]代码耗时问题
For Each dr As DataRow In DataTables("净进货核算差额调整").DataRows
    If dr("店铺性质") = "正价店" Then
        If dr("新季节属性") = "当季新款" Then
            Dim pr As DataRow
            Dim filter As String
            filter = "货品年份 = \'" & dr("款式年份") & "\' And 货品季节 = \'" & dr("款式季度") & "\' And 仓店编号 = \'" & dr("仓店编号") & "\' and 退货截止日期 is not null"
            pr = DataTables("客户当季货品退货核算标准").Find(filter)
            If pr IsNot Nothing Then
                If (pr("退货截止年份") = N1 And pr("退货截止月份") <= y1) Or pr("退货截止年份") < N1 Then
                    dr("退货完成标记") = "完成退货"
                    dr("核算年份") = pr("退货截止年份")
                    dr("核算月份") = pr("退货截止月份")
                Else
                    dr("退货完成标记") = "未完成退货"
                    dr("核算年份") = Nothing
                    dr("核算月份") = Nothing
                End If
            Else
                dr("退货完成标记") = "未完成退货"
                dr("核算年份") = Nothing
                dr("核算月份") = Nothing
            End If
        End If
        If dr("新季节属性") = "往年旧款" Then
            Dim pr1 As DataRow
            Dim filter1 As String
            filter1 = "款式季度 = \'" & dr("款式季度") & "\' And 仓店编号 = \'" & dr("仓店编号") & "\' and ((年份= \'" & dr("年份") & "\' and 月份>= " & dr("月份") & ")  or 年份> \'" & dr("年份") & "\') and 退货完成标记=\'完成退货\' and 新季节属性=\'当季新款\'"
            pr1 = DataTables("净进货核算差额调整").Find(filter1)
            If pr1 IsNot Nothing Then
                dr("退货完成标记") = "完成退货"
                dr("核算年份") = pr1("核算年份")
                dr("核算月份") = pr1("核算月份")
            Else
                dr("退货完成标记") = "未完成退货"
                dr("核算年份") = Nothing
                dr("核算月份") = Nothing
            End If
        End If
    ElseIf dr("店铺性质") = "非正价店" Then
        Dim pr2 As DataRow
        Dim filter2 As String
        filter2 = "款式季度 = \'" & dr("款式季度") & "\' And 品牌名称 = \'" & dr("品牌名称") & "\' and ((调整退市年份= \'" & dr("年份") & "\' and 调整退市月份>= " & dr("月份") & ")  or 调整退市年份> \'" & dr("年份") & "\')"
        pr2 = DataTables("商品上市退市时间档案").Find(filter2, "调整退货日期")
        If pr2 IsNot Nothing Then 
            If (pr2("调整退市年份") = N1 And pr2("调整退市月份") <= y1) Or pr2("调整退市年份") < N1 Then
                dr("退货完成标记") = "完成退货"
                dr("核算年份") = pr2("调整退市年份")
                dr("核算月份") = pr2("调整退市月份")
            Else
                dr("退货完成标记") = "未完成退货"
                dr("核算年份") = Nothing
                dr("核算月份") = Nothing
            End If
        Else
            dr("退货完成标记") = "未完成退货"
            dr("核算年份") = Nothing
            dr("核算月份") = Nothing
        End If
    Else
            dr("退货完成标记") = "未完成退货"
            dr("核算年份") = Nothing
            dr("核算月份") = Nothing 
    End If
Next

两万来条记录,结果出来差不多个把小时,如何调整可以效率高一些

--  作者:有点蓝
--  发布时间:2022/12/15 17:39:00
--  
看看:http://www.foxtable.com/webhelp/topics/2225.htm
--  作者:lgj716330
--  发布时间:2022/12/15 17:43:00
--  
帮助中要求是同一个表内查找赋值,不同表也可以这样处理吗
--  作者:lgj716330
--  发布时间:2022/12/15 18:58:00
--  
Dim lst1 As New List(Of DataRow)
Dim lst2 As New List(Of DataRow)
Dim lst3 As New List(Of DataRow)
Dim lst4 As New List(Of DataRow)
Dim pr1 As DataRow
Dim pr2 As DataRow
Dim pr3 As DataRow

For Each dr As DataRow In DataTables("净进货核算差额调整").DataRows
    If dr("店铺性质") = "正价店" Then
        If dr("新季节属性") = "当季新款" Then
            Dim filter As String
            filter = "货品年份 = \'" & dr("款式年份") & "\' And 货品季节 = \'" & dr("款式季度") & "\' And 仓店编号 = \'" & dr("仓店编号") & "\' and 退货截止日期 is not null"
            pr1 = DataTables("客户当季货品退货核算标准").Find(filter)
            If pr1 IsNot Nothing Then
                If (pr1("退货截止年份") = N1 And pr1("退货截止月份") <= y1) Or pr1("退货截止年份") < N1 Then
                    lst1.Add(dr)
                Else
                    lst4.Add(dr)
                End If
            Else
                lst4.Add(dr)
            End If
        End If
        If dr("新季节属性") = "往年旧款" Then
            Dim filter1 As String
            filter1 = "款式季度 = \'" & dr("款式季度") & "\' And 仓店编号 = \'" & dr("仓店编号") & "\' and ((年份= \'" & dr("年份") & "\' and 月份>= " & dr("月份") & ")  or 年份> \'" & dr("年份") & "\') and 退货完成标记=\'完成退货\' and 新季节属性=\'当季新款\'"
            pr2 = DataTables("净进货核算差额调整").Find(filter1)
            If pr2 IsNot Nothing Then
                lst2.Add(dr)
            Else
                lst4.Add(dr)
            End If
        End If
    ElseIf dr("店铺性质") = "非正价店" Then
        Dim filter2 As String
        filter2 = "款式季度 = \'" & dr("款式季度") & "\' And 品牌名称 = \'" & dr("品牌名称") & "\' and ((调整退市年份= \'" & dr("年份") & "\' and 调整退市月份>= " & dr("月份") & ")  or 调整退市年份> \'" & dr("年份") & "\')"
        pr3 = DataTables("商品上市退市时间档案").Find(filter2, "调整退货日期")
        If pr3 IsNot Nothing Then 
            If (pr3("调整退市年份") = N1 And pr3("调整退市月份") <= y1) Or pr3("调整退市年份") < N1 Then
                lst3.Add(dr)
            Else
                lst4.Add(dr)
            End If
        Else
            lst4.Add(dr)
        End If
    Else
            lst4.Add(dr) 
    End If
Next
For Each dr As DataRow In lst1
    dr("退货完成标记") = "完成退货"
    dr("核算年份") = pr1("退货截止年份")
    dr("核算月份") = pr1("退货截止月份")
Next
For Each dr As DataRow In lst2
    dr("退货完成标记") = "完成退货"
    dr("核算年份") = pr2("核算年份")
    dr("核算月份") = pr2("核算月份")
Next
For Each dr As DataRow In lst3
    dr("退货完成标记") = "完成退货"
    dr("核算年份") = pr3("调整退市年份")
    dr("核算月份") = pr3("调整退市月份")
Next
For Each dr As DataRow In lst4
    dr("退货完成标记") = "未完成退货"
    dr("核算年份") = Nothing
    dr("核算月份") = Nothing
Next

调整成这样,快是快了很多,就是结果不对

--  作者:有点蓝
--  发布时间:2022/12/15 20:22:00
--  
Dim dz1 As New Dictionary(Of DataRow, DataRow)
Dim dz2 As New Dictionary(Of DataRow, DataRow)
Dim dz3 As New Dictionary(Of DataRow, DataRow)
Dim dznull As New List(Of DataRow)


For Each dr As DataRow In DataTables("净进货核算差额调整").DataRows
    If dr("店铺性质") = "正价店" Then
        If dr("新季节属性") = "当季新款" Then
            Dim pr As DataRow
            Dim filter As String
            filter = "货品年份 = \'" & dr("款式年份") & "\' And 货品季节 = \'" & dr("款式季度") & "\' And 仓店编号 = \'" & dr("仓店编号") & "\' and 退货截止日期 is not null"
            pr = DataTables("客户当季货品退货核算标准").Find(filter)
            If pr IsNot Nothing Then
                If (pr("退货截止年份") = N1 And pr("退货截止月份") <= y1) Or pr("退货截止年份") < N1 Then
                    dz1.Add(dr, pr)
                Else
                    dznull.Add(dr)
                End If
            Else
                dznull.Add(dr)
            End If
        ElseIf dr("新季节属性") = "往年旧款" Then
            Dim pr1 As DataRow
            Dim filter1 As String
            filter1 = "款式季度 = \'" & dr("款式季度") & "\' And 仓店编号 = \'" & dr("仓店编号") & "\' and ((年份= \'" & dr("年份") & "\' and 月份>= " & dr("月份") & ")  or 年份> \'" & dr("年份") & "\') and 退货完成标记=\'完成退货\' and 新季节属性=\'当季新款\'"
            pr1 = DataTables("净进货核算差额调整").Find(filter1)
            If pr1 IsNot Nothing Then
                dz2.Add(dr, pr1)
            Else
                dznull.Add(dr)
            End If
        End If
    ElseIf dr("店铺性质") = "非正价店" Then
        Dim pr2 As DataRow
        Dim filter2 As String
        filter2 = "款式季度 = \'" & dr("款式季度") & "\' And 品牌名称 = \'" & dr("品牌名称") & "\' and ((调整退市年份= \'" & dr("年份") & "\' and 调整退市月份>= " & dr("月份") & ")  or 调整退市年份> \'" & dr("年份") & "\')"
        pr2 = DataTables("商品上市退市时间档案").Find(filter2, "调整退货日期")
        If pr2 IsNot Nothing Then 
            If (pr2("调整退市年份") = N1 And pr2("调整退市月份") <= y1) Or pr2("调整退市年份") < N1 Then
                dz3.Add(dr, pr2)
            Else
                dznull.Add(dr)
            End If
        Else
            dznull.Add(dr)
        End If
    Else
        dznull.Add(dr)
    End If
Next

For Each dr As DataRow In dz1.Keys
    dr("退货完成标记") = "完成退货"
    dr("核算年份") = dz1(dr)("退货截止年份")
    dr("核算月份") = dz1(dr)("退货截止月份")
Next

For Each dr As DataRow In dz2.Keys
    dr("退货完成标记") = "完成退货"
    dr("核算年份") = dz2(dr)("核算年份")
    dr("核算月份") = dz2(dr)("核算月份")
Next

For Each dr As DataRow In dz3.Keys
    dr("退货完成标记") = "完成退货"
    dr("核算年份") = dz3(dr)("调整退市年份")
    dr("核算月份") = dz3(dr)("调整退市月份")
Next

For Each dr As DataRow In dznull
    dr("退货完成标记") = "未完成退货"
    dr("核算年份") = Nothing
    dr("核算月份") = Nothing
Next