以文本方式查看主题

-  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
--  
这个加了没有效果,所有代码没放这个

SystemReady = False

 

\'你原本的代码

 

SystemReady = true



--  作者:大红袍
--  发布时间:2016/4/27 15:40:00
--  

 或者做个例子上来测试,你这里赋值和查找在一起了,有可能慢,试试代码

 

SystemReady = False
Dim st As Date = Date.Now  \'要测试耗时的代码
Dim drs 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
    Dim drbs As List(Of DataRow)
    drbs = DataTables("物料").Select("[代码] = \'" & 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
msgbox("完成耗时:" & Format((Date.Now - st).TotalSeconds,"0.0000") & "秒")
SystemReady = True


--  作者:凡夫俗子
--  发布时间: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也很快。