以文本方式查看主题 - 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数据库或者内部表上传 |