以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助] 优化代码 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=153777) |
-- 作者:susanhe -- 发布时间:2020/8/22 13:52:00 -- [求助] 优化代码 老师,请帮忙, 以下代码能否帮忙优化一下,运行起来很慢,谢谢。 DataTables("Pricelist").Load Dim int As Integer = 0 For Each r As Row In Tables ("t_Purchasing") If r("FNeg") = True int = int+1 End If Next If Int = 0 msgbox (" ...需先选择单号 !!!") Else For Each rr As DataRow In DataTables("t_Purchasing").Se lect("[FNeg] = True") rr("FSupID") = Nothing rr("FName1") = Nothing rr("FAuxPrice") = Nothing rr("VATPrice") = Nothing rr("Tax") = Nothing rr("Currency") = Nothing Dim dr As DataRow = DataTables("Pricelist").Find("FItemID1=" & rr("FItemID") & " and FUsed = true and FPrioritized = true and FStartQty<=" & rr("FAuxQty") & " and FEndQty >= " & rr("FAuxQty") & "","FQuoteTime desc") If dr IsNot Nothing Then rr("FSupID") = dr("FSupID") rr("FName1") = dr("FName") rr("FAuxPrice") = dr("FPrice") rr("VATPrice") = dr("VATPrice") rr("Tax") = dr("FTax") rr("Currency") = dr("FName2") rr("FNeg") = False Else Dim drz As DataRow = DataTables("Pricelist").Find("FItemID1=" & rr("FItemID") & " and FUsed = true and FPrioritized = true and FStartQty = 0 And FEndQty = 0" ,"FQuoteTime desc") If drz IsNot Nothing Then rr("FSupID") = drz("FSupID") rr("FName1") = drz("FName") rr("FAuxPrice") = drz("FPrice") rr("VATPrice") = drz("VATPrice") rr("Tax") = drz("FTax") rr("Currency") = drz("FName2") rr("FNeg") = False End If End If Dim cmd As new SQLCommand cmd.CommandText = "Se lect F_103,F_102 From {t_Supplier} Where FItemID = \'" & rr("FSupID") & "\'" cmd.C Dim Values = cmd.ExecuteValues If Values.Count > 0 Then rr("Buyer") = Values("F_103") rr("SE") = Values("F_102") End If Dim cmd1 As new SQLCommand cmd1.C Dim dt As DataTable cmd1.CommandText = "Se lect * From {PORequestEntry}" dt = cmd1.ExecuteReader(True) Dim fdr As DataRow = dt.Find("FDetailID=" & rr("FDetailID") & "") If fdr IsNot Nothing Then fdr("FEntrySelfP0131") = rr("FAuxPrice") fdr("FSupplyID") = rr("FSupID") fdr("FEntrySelfP0132") = rr("VATPrice") fdr("FEntrySelfP0133") = rr("Tax") fdr("FEntrySelfP0134") = rr("Currency") End If dt.Save() Next msgbox (" ...供应商以及价格核定完成 !!!") End If |
-- 作者:有点蓝 -- 发布时间:2020/8/22 15:57:00 -- 很多问题 1、第一句代码就慢了,如果加载的数据多 2、判断是否有勾选,只需要判断有任何一个勾选即可,没有必要遍历一遍 方法1)、if tables("t_Purchasing").compute("count(FNeg)","FNeg=true") = 0 2)、if tables("t_Purchasing").findrow("FNeg=true") = -1 3)、if datatables("t_Purchasing").findrow("FNeg=true") is nothing 4)、下面再说明 3、既然使用了for each,如果select没有结果的是不会进入循环的,所以完全没有必要做上面的判断,如果需要来个提示,还不如这样 dim drs as list(of datarow) = DataTables("t_Purchasing").Se lect("[FNeg] = True") if drs.count = 0 then msgbox(没有数据) else For Each rr As DataRow In drs 原来遍历的处理代码 next end if 4、循环里面的2个Find条件都差不多,可以合并为一起,这样每次遍历都减少一次查询,大概如: Dim dr As DataRow = DataTables("Pricelist").Find("FItemID1=" & rr("FItemID") & " and FUsed = true and FPrioritized = true and ((FStartQty<=" & rr("FAuxQty") & " and FEndQty >= " & rr("FAuxQty") & ") or (FStartQty = 0 And FEndQty = 0 ))","FQuoteTime desc") 5、t_Supplier如果从字面理解没错的话是供应商表,这种数据一般不会太多也相对固定,建议全部加载查询,不要使用后台查询,后台查询肯定慢的,这个无解 6、PORequestEntry数据倒是一次性全部加载了,但是放的位置不对,放在循环里面,也就是说每循环一次就把这个表数据全部加载一次,假设t_Purchasing符合条件【[FNeg] = True】的行有100行,PORequestEntry在上面代码里就重复整表数据的加载了100次,非常的酸爽........ 既然数据都全部加载了,放到循环外面加载一次即可
[此贴子已经被作者于2020/8/22 15:58:06编辑过]
|