以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 代码效率求助 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=84281) |
|
-- 作者:凡夫俗子 -- 发布时间:2016/4/27 15:30:00 -- 代码效率求助 需求时 对A表“物料测试”表进行循环遍历 对 每行数据 对表B "物料“ 表进行 select查找 将查找到的行的 名称 及规格型号 重新赋值 (即批量将表B的名称,规格型号 进行全部修改) 以下代码 目前测试,一条数据需要0.2652秒左右 , 30条数据需要2.137秒,如果是2万条数据那就需要 40分钟了 Dim st As Date = Date.Now \'要测试耗时的代码 Dim drs As List(Of DataRow) drs = DataTables("物料测试").Select("测试 = true") For Each dr As DataRow In drs Dim drbs As List(Of DataRow) drbs = DataTables("物料").Select("[代码] = \'" & dr("代码") & "\'") For Each drb As DataRow In drbs drb("名称") = dr("名称") drb("规格型号") = dr("规格型号") Next Next msgbox("完成耗时:" & Format((Date.Now - st).TotalSeconds,"0.0000") & "秒") 如何修改本代码。提高效率。 如果使用网络EXCEL平台 这样的操作是秒级完成的。
[此贴子已经被作者于2016/4/27 15:30:24编辑过]
|
|
-- 作者:大红袍 -- 发布时间:2016/4/27 15:32:00 -- 肯定是你dataColChanged事件有耗时的代码,试试
SystemReady = False
\'你原本的代码
SystemReady = False |
|
-- 作者:凡夫俗子 -- 发布时间:2016/4/27 15:40:00 -- 这个加了没有效果,所有代码没放这个
|
|
-- 作者:大红袍 -- 发布时间:2016/4/27 15:40:00 -- 或者做个例子上来测试,你这里赋值和查找在一起了,有可能慢,试试代码
SystemReady = False |
|
-- 作者:凡夫俗子 -- 发布时间:2016/4/27 15:44:00 -- 另测试 发现 我要用 表A的数据 去更新 表B的数据 数据结构相同 测试数据记录数为20000条 如果在表B对所有的行进行循环,在表A中执行FIND查找,找到进更新 表B的名称和规格 耗时 0.9秒 但是如果反过来,对 表A进行循环 再对表B进行FIND查找,找到就更新表B的名称和规格 完成本操作大概要40分钟
|
|
-- 作者:大红袍 -- 发布时间:2016/4/27 15:45:00 -- 看4楼代码。 |
|
-- 作者:凡夫俗子 -- 发布时间:2016/4/27 16:59:00 -- 谢谢 这段 代码有效21346条数据测试0.9秒 符合要求 |
|
-- 作者:凡夫俗子 -- 发布时间:2016/4/27 17:26:00 -- 如果 将这段代码 改成更新后台数据的 SystemReady = False Dim st As Date = Date.Now \'要测试耗时的代码 Dim drs As List(Of DataRow) Dim drbs As List(Of DataRow) drs = DataTables("物料测试").Select("测试 = true") Dim alldrs As New Dictionary(Of List(Of DataRow), DataRow) For Each dr As DataRow In drs drbs = DataTables("物料").SQLSelect("[代码] = \'" & dr("代码") & "\'") alldrs.add(drbs, dr) Next For Each key As object In alldrs.Keys Dim dr As DataRow = alldrs(key) For Each drb As DataRow In key drb("名称") = dr("名称") drb("规格型号") = dr("规格型号") Next Next DataTables("物料").SQLUpdate(drbs) msgbox("完成耗时:" & Format((Date.Now - st).TotalSeconds,"0.0000") & "秒") SystemReady = True 这样也是非常耗时的
|
|
-- 作者:大红袍 -- 发布时间:2016/4/27 17:33:00 -- 那直接写sql语句
up date table1,table2 set table1.f1=table2.f1, table1.f2=table2.f2 where table1.ID=table2.ID
http://www.foxtable.com/help/topics/0696.htm
|
|
-- 作者:大红袍 -- 发布时间:2016/4/27 17:34:00 -- 9楼的方法是最快的。还有一种方法,就是先把数据一次性加载出来,然后select也很快。 |