Foxtable(狐表)用户栏目专家坐堂 → 代码效率求助


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

主题:代码效率求助

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


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
代码效率求助  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/27 15:32:00 [只看该作者]

 肯定是你dataColChanged事件有耗时的代码,试试

 

SystemReady = False

 

'你原本的代码

 

SystemReady = False


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


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By:2016/4/27 15:40:00 [只看该作者]

这个加了没有效果,所有代码没放这个

SystemReady = False

 

'你原本的代码

 

SystemReady = true



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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
凡夫俗子
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By:2016/4/27 15:44:00 [只看该作者]

另测试 发现

我要用 表A的数据 去更新 表B的数据  数据结构相同 测试数据记录数为20000条


如果在表B对所有的行进行循环,在表A中执行FIND查找,找到进更新 表B的名称和规格 耗时 0.9秒

但是如果反过来,对 表A进行循环 再对表B进行FIND查找,找到就更新表B的名称和规格 完成本操作大概要40分钟

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/27 15:45:00 [只看该作者]

看4楼代码。

 回到顶部
帅哥哟,离线,有人找我吗?
凡夫俗子
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By:2016/4/27 16:59:00 [只看该作者]

谢谢 这段 代码有效21346条数据测试0.9秒 符合要求

 回到顶部
帅哥哟,离线,有人找我吗?
凡夫俗子
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By: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

这样也是非常耗时的

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By: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

 


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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/27 17:34:00 [只看该作者]

9楼的方法是最快的。还有一种方法,就是先把数据一次性加载出来,然后select也很快。

 回到顶部
总数 27 1 2 3 下一页