Foxtable(狐表)用户栏目专家坐堂 → 大批量数据对比代码优化(盘点核销)


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

主题:大批量数据对比代码优化(盘点核销)

帅哥哟,离线,有人找我吗?
weibu
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:659 积分:5363 威望:0 精华:0 注册:2018/5/19 22:27:00
大批量数据对比代码优化(盘点核销)  发帖心情 Post By: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

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



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/9 9:14:00 [只看该作者]

基本就是这样了。SQLxxx系列用法肯定会比没有SQL字符开头的方法慢。

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

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

 回到顶部
帅哥哟,离线,有人找我吗?
weibu
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:659 积分:5363 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By:2019/9/9 12:22:00 [只看该作者]

蓝老师,您讲的SQl进行跟新的具体方法是啥?能否在代码上帮我修改下。万分感谢

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111381 积分:566969 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/9 13:32:00 [只看该作者]

就是类似这种SQL的操作。http://www.foxtable.com/webhelp/topics/1827.htm

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

 回到顶部