以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  请教一个程序效率过低的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=122706)

--  作者:蓝色理想
--  发布时间:2018/7/31 16:27:00
--  请教一个程序效率过低的问题
代码功能描述:遍历一张《基础表》,依据基础表的数据去其他表查找数据填入基础表。
当发现《基础表》当前行的“支付状态”为 已支付时,做一个 集合,用于返回 《原始表_支付_订单明细表》中的,与当前行信息一致的付款信息(主要为订单号 和 门店名称),返回付款信息可能有多行,按金额大小排序,第一次付款的信息就放到“新商家实收1”等相关列中,第二次放到第二次,第三次及以后的付款信息,合并放到第三次。

问题是,现在这类代码效率太低,当存在10万行数据时,一晚上都算不完,请高手帮我看看,如何解决啊。




  Select Case r("支付状态")

        Case "已支付"

            Dim drs As List (of DataRow) = DataTables("原始表_支付_订单明细表").Select("[批次] = " & MaxPc &  " and [门店名称] = \'" & r("门店名称") & "\' And [订单号] = \'" & r("单据号") & "\'"  & " and ([是否填写] is Null or [是否填写] <> \'已填写\') and [商家实收] >= 0 " ,"商家实收 Desc") \'得到按 商家实收 高低排列的行的集合            Output.Show("[订单号] = \'" & r("单据号") & "\'"  & " and [是否填写] <> \'已填写\' and [商家实收] >= 0" )

            Dim NumI As Integer

            For i As Integer = 0 To drs.Count - 1

                NumI = i+1

                If Numi <=3 Then

                    r("新支付状态" & NumI) = drs(i)("支付状态")

                    r("新支付方式" & NumI) = drs(i)("支付方式")

                    r("新资金结算方" & NumI) = drs(i)("资金结算方")

                    r("新支付金额" & NumI) = drs(i)("支付金额")

                    r("新商家实收" & NumI) = drs(i)("商家实收")

                   

                    If  r("新支付状态" & NumI) > "" And zd.ContainsKey(r("新支付方式" & NumI))  Then

                        r("支付平台手续费费率" & NumI) = zd(r("新支付方式" & NumI))

                        r("支付平台手续费" & NumI) = r("新商家实收" & NumI) * r("支付平台手续费费率" & NumI)

                    Else

                        Dim Er As Row = Tables("错误警告信息日志").AddNew()

                        Er("批次") = r("批次")

                        Er("门店名称") = r("门店名称")

                        Er("表名") = r.Table.Name

                        Er("生成时间") = Date.Today()

                        Er("信息类型") = "警告"

                        Er("问题描述") = r.Table.Name & "表中存在 《费率明细表》中没有的项目:"  &  r("新支付方式" & NumI)  & "!"

                    End If

                   

                Else

                    r("新支付金额3") =r("新支付金额3")  + drs(i)("支付金额")

                    r("新商家实收3") =r("新商家实收3") + drs(i)("商家实收")

                End If

                drs(i)("是否填写") = "已填写"

            Next

        Case "已退款"

            Dim drs As List (of DataRow) = DataTables("原始表_支付_订单明细表").Select("[批次] = " & MaxPc  &  " and [门店名称] = \'" & r("门店名称") & "\'  And [订单号] = \'" & r("单据号") & "\'"  & " and ([是否填写] is Null or [是否填写] <> \'已填写\') and [商家实收] < 0 " ,"商家实收 Desc") \'得到按 商家实收 高低排列的行的集合.

            Dim NumI As Integer

            For i As Integer = 0 To drs.Count - 1

                NumI = i+1

                If Numi <=3 Then

                    r("新支付状态" & NumI) = drs(i)("支付状态")

                    r("新支付方式" & NumI) = drs(i)("支付方式")

                    r("新资金结算方" & NumI) = drs(i)("资金结算方")

                    r("新支付金额" & NumI) = drs(i)("支付金额")

                    r("新商家实收" & NumI) = drs(i)("商家实收")

                   

                    If  r("新支付状态" & NumI) > "" And zd.ContainsKey(r("新支付方式" & NumI))  Then

                        r("支付平台手续费费率" & NumI) = zd(r("新支付方式" & NumI))

                        r("支付平台手续费" & NumI) = r("新商家实收" & NumI) * r("支付平台手续费费率" & NumI)

                    Else

                        Dim Er As Row = Tables("错误警告信息日志").AddNew()

                        Er("批次") = r("批次")

                        Er("门店名称") = r("门店名称")

                        Er("表名") = r.Table.Name

                        Er("生成时间") = Date.Today()

                        Er("信息类型") = "警告"

                        Er("问题描述") = r.Table.Name & "表中存在 《费率明细表》中没有的项目:"  &  r("新支付方式" & NumI)  & "!"

                    End If

                   

                Else

                    r("新支付金额3") =r("新支付金额3")  + drs(i)("支付金额")

                    r("新商家实收3") =r("新商家实收3") + drs(i)("商家实收")

                    r("支付平台手续费3") = r("新商家实收3") * r("支付平台手续费费率3")

                   

                End If

                drs(i)("是否填写") = "已填写"

            Next

        Case Else

            r("备注") = "警告: 此行\'支付状态\'不等于 \'已支付\' 或 \'已退款\'"

    End Select

   

   

    r("新商家实收合计") =r("新商家实收1") + r("新商家实收2") + r("新商家实收3")

   

    r("支付平台手续费合计") =r("支付平台手续费1") + r("支付平台手续费2") + r("支付平台手续费3")

   

    If  r("新商家实收合计") <>  r("商户实收金额") Then

        Dim Er As Row = Tables("错误警告信息日志").AddNew()

        Er("批次") = r("批次")

        Er("门店名称") = r("门店名称")

        Er("表名") = r.Table.Name

        Er("生成时间") = Date.Today()

        Er("信息类型") = "错误"

        Er("问题描述") = "商户实收列  与 新商家实收合计  金额不一致,前者与后者差额为" &  (r("商户实收金额")-r("新商家实收合计")) & "元"

    End If

   

    If NSgfZd.ContainsKey(r("门店名称"))= False   Then

        r("商管费费率")=zd("商管费费率")

        r("商管费")=r("新商家实收合计") * r("商管费费率")

    End If


--  作者:有点蓝
--  发布时间:2018/7/31 16:55:00
--  
代码不完整,请上传实例测试
--  作者:蓝色理想
--  发布时间:2018/7/31 19:07:00
--  
SQL Server的数据库,不知道咋上传啊
--  作者:有点蓝
--  发布时间:2018/7/31 20:32:00
--  
导出为access数据库或者内部表上传