以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  盘点核销代码优化  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=125272)

--  作者:weibu
--  发布时间:2018/9/25 10:58:00
--  盘点核销代码优化
以下是我这边盘点核销的部分代码逻辑。盘点单据的数据量 上万行;syms中符合条件的数据也有几万行。 这样我再执行下列代码是速度非常非常慢。请问有无优化 方案?
pd = DataTables("盘点单据").SQLFind("[盘点部门] = \'" & yh("所属部门") & "\'and [盘点单号] = \'" & txt & "\'")  \'找出本次盘点单据的盘点数据
     DataTables("盘点单据").SQLReplaceFor("审核人", dr("姓名"), "[盘点部门] = \'" & yh("所属部门") & "\'and [盘点单号] = \'" & txt & "\'")  
     DataTables("盘点单据").SQLReplaceFor("审核日期", Date.Now, "[盘点部门] = \'" & yh("所属部门") & "\'and [盘点单号] = \'" & txt & "\'")  
     Dim syms As List(of DataRow) = DataTables("溯源码").SQLSelect("当前所在部门 = \'" & yh("所属部门") & "\' And 是否可用 = 1") \'找到本部门可用溯源码的行
     For Each sym As DataRow In syms
            fr = DataTables("盘点单据").SQLFind("[溯源码] = \'" & sym("子溯源码") & "\'")  \'溯源码表中的溯源码是否存在与盘点单据
                If fr IsNot Nothing Then 
                 sym("是否可用") = 1
                Else
                 Dim wb As Row = Tables("外部出库").AddNew()
                 sym("是否可用") = 0
                 wb("溯源码" ) = sym("子溯源码")
                 wb("出库部门") = sym("当前所在部门")
                 wb("出库时间") = Date.Now
                 wb("单据类型") = "销售单"
                 wb("是否拆箱") = sym("是否拆箱")
                 wb("出库人") = yh("姓名")
                 wb("核销人") = dr("姓名")
              End If
        Next


--  作者:有点甜
--  发布时间:2018/9/25 11:57:00
--  

一般是这个代码慢

 

     For Each sym As DataRow In syms
            fr = DataTables("盘点单据").SQLFind("[溯源码] = \'" & sym("子溯源码") & "\'")  \'溯源码表中的溯源码是否存在与盘点单据
 
每执行一次sqlFind,耗时一般是0.5秒,要耗时多少,你可以自己测算。
 
一般如果syms较多的情况下,都是把表【盘点单据】的数据全部加载出来,然后用find的。