Foxtable(狐表)用户栏目专家坐堂 → 请教一个程序效率过低的问题


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

主题:请教一个程序效率过低的问题

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


加好友 发短信
等级:二尾狐 帖子:560 积分:4273 威望:0 精华:0 注册:2014/6/12 19:15:00
请教一个程序效率过低的问题  发帖心情 Post By: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


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


加好友 发短信
等级:超级版主 帖子:107718 积分:547917 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/7/31 16:55:00 [只看该作者]

代码不完整,请上传实例测试

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


加好友 发短信
等级:二尾狐 帖子:560 积分:4273 威望:0 精华:0 注册:2014/6/12 19:15:00
  发帖心情 Post By:2018/7/31 19:07:00 [只看该作者]

SQL Server的数据库,不知道咋上传啊

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


加好友 发短信
等级:超级版主 帖子:107718 积分:547917 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/7/31 20:32:00 [只看该作者]

导出为access数据库或者内部表上传

 回到顶部