以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  大批量数据对比代码优化(盘点核销)  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=140568)

--  作者:weibu
--  发布时间:2019/9/9 9:01:00
--  大批量数据对比代码优化(盘点核销)

此主题相关图片如下:1.png
按此在新窗口浏览图片


老师好,我这边做了一个盘点核销的功能。每次核销的盘点数据条数可能达到几万数据条。用的是SQL数据库;
第一:想做下代码优化,如何做执行效率最高;
第二:其中有个BUG,我设置了“盘点单据”表的筛选树,如截图。具体BUG件核销代码备注
代码的业务逻辑是:1.在截图盘点核销输入盘点单号和盘点部门;2.核销功能检索盘点单号和盘点部门相同的数据,并取对应盘点的是什么商品;3.溯源码表中的找到本次盘点的商品对应的每条数据;4.逐条比对盘点单据里面的数据在溯源码表中是否存在,不存在核销掉。
 
筛选树代码:
DataTables("盘点单据").LoadTop = "500"
DataTables("盘点单据").LoadOver = "_Identify"
Tables("盘点单据").OpenLoadTree("盘点部门|盘点日期 YM|盘点单号|商品名称",200,100,True,Filter)
Tables("盘点单据").Sort = "盘点日期 DESC"

核销功能代码:
Dim cq As String = Forms("盘点核销").Controls("ComboBox1").Value
Dim fr As DataRow
Dim txt As String = Forms("盘点核销").Controls("TextBox1").Value

Dim Filter1 As String
Filter1 = "[盘点部门] = \'" & cq & "\'and [盘点单号] = \'" & txt & "\'"
DataTables("盘点单据").LoadFilter = Filter1
DataTables("盘点单据").Load                                 ’这个三行加载“盘点单据”数据的代码,实际执行效果,只加载数据200条,超过200条数据并无加载;
 
                                                                                                                                                  ’核销功能检索盘点单号和盘点部门相同的数据,并取对应盘点的是什么商品
Dim fbs As List(Of String) = DataTables("盘点单据").GetValues("商品编码",Filter1) \'找到本次盘点的所有商品     GetValues语句也仅从加载的200条数据取值,超过的不取值
                                                                                                                                                         ‘这个用sqlGetValues是否能解决,但执行效率是否会大幅度变慢??
For Each fb As String In fbs 
Dim syms As List(of DataRow) = DataTables("溯源码").SQLSelect("当前所在部门 = \'" & cq & "\' And 是否可用 = 1 And 商品编码 = \'" & fb & "\'") \'找到溯源码中盘点商品的溯源码
      For Each sym As DataRow In syms
 fr = DataTables("盘点单据").Find("[溯源码] = \'" & sym("子溯源码") & "\'")     \'这个循环语句执行的也仅是加载的200条数据里面执行,超过200条数据不执行。
                                                                                                             这个用sqlfind是否能解决,但执行效率是否会大幅度变慢??
                                                                                                              
 If fr IsNot Nothing Then
       \' sym("是否可用") = 1
        fr("审核人") = dr("姓名")
        fr("审核日期") = Date.Now   \'如果存在审核盘点单据
        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  
DataTables("溯源码").SQLUpdate(syms)   \'更新数据库溯源码表中的是否可用状态   
Next
           
        DataTables("外部出库").Save()
        DataTables("盘点单据").Save()
        MessageBox.Show("核销成功!", "提示")
        Dim btn As WinForm.Button = Forms("盘点核销").Controls("Button1")
        btn.PerformClick()
         e.Form.Close
     Else
       Messagebox.show("密码错误!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
     End If
End If

老师上面的代码能否整体帮我做下优化,保障不限数据条数限制可以核销,同时执行效率最优,万分感谢



--  作者:有点蓝
--  发布时间:2019/9/9 9:14:00
--  
基本就是这样了。SQLxxx系列用法肯定会比没有SQL字符开头的方法慢。

如果超过200条数据并无法加载,这样
DataTables("盘点单据").Loadtop = nothing
DataTables("盘点单据").LoadFilter = Filter1
DataTables("盘点单据").Load   

如果对速度比较在意的,建议直接使用sql进行更新

--  作者:weibu
--  发布时间:2019/9/9 12:22:00
--  
蓝老师,您讲的SQl进行跟新的具体方法是啥?能否在代码上帮我修改下。万分感谢
--  作者:有点蓝
--  发布时间:2019/9/9 13:32:00
--  
就是类似这种SQL的操作。http://www.foxtable.com/webhelp/topics/1827.htm

把项目和数据库发上来看看