以文本方式查看主题 - 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 把项目和数据库发上来看看
|