Foxtable(狐表)用户栏目专家坐堂 → [求助] 优化代码


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

主题:[求助] 优化代码

美女呀,离线,留言给我吧!
susanhe
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:312 积分:2477 威望:0 精华:0 注册:2018/11/22 20:30:00
[求助] 优化代码  发帖心情 Post By: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

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107131 积分:544898 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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编辑过]

 回到顶部