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


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

主题:代码效率求助

帅哥哟,离线,有人找我吗?
凡夫俗子
  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


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

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

SystemReady = False

 

'你原本的代码

 

SystemReady = true



 回到顶部
帅哥哟,离线,有人找我吗?
凡夫俗子
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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分钟

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


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

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

 回到顶部
帅哥哟,离线,有人找我吗?
凡夫俗子
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

这样也是非常耗时的

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


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By:2016/4/27 18:33:00 [显示全部帖子]

up date table1,table2 set table1.f1=table2.f1, table1.f2=table2.f2 where table1.ID=table2.ID 这种方法是最快的不错 但要求所有的数据都是同一个数据源的 且数据都已保存

如果数据没有保存就不能使用这个方法了

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


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By:2016/4/27 18:38:00 [显示全部帖子]

9楼的方法是最快的。还有一种方法,就是先把数据一次性加载出来,然后select也很快。 这个方法如果万一碰到要加载的数据比如有20万行的时候 也不是个好的方法

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


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By:2016/4/27 19:18:00 [显示全部帖子]

http://pan.baidu.com/s/1gfpXBTD


做了个示例数据库,请老师 优化一下 后台数据的更新方式

怎么示例中的后台更新方式没有生效。调试SQLUPDATE成功修改的行数都有1返回,但是结果还是空的。



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


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By:2016/4/27 19:27:00 [显示全部帖子]

SystemReady = False

DataTables("物料").ReplaceFor("名称","")
DataTables("物料").ReplaceFor("规格型号","")
DataTables("物料").save
DataTables("物料").LoadFilter = ""
DataTables("物料").Loadtop = 5
DataTables("物料").Load
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        
        DataTables("物料").SQLReplaceFor("名称", dr("名称"), "代码 = '" & dr("代码") & "'")                   ‘这代码成更新前台数据了,我 前面DataTables("物料").Loadtop = 5 就更新5条,是10就更新10条
        DataTables("物料").SQLReplaceFor("规格型号", dr("规格型号"), "代码 = '" & dr("代码") & "'")         ‘这代码成更新前台数据了,我 前面DataTables("物料").Loadtop = 5 就更新5条,是10就更新10条
    Next
Next
msgbox("完成耗时:" & Format((Date.Now - st).TotalSeconds,"0.0000") & "秒")
DataTables("物料").LoadFilter = ""
DataTables("物料").Loadtop = ""
DataTables("物料").Load

SystemReady = True
[此贴子已经被作者于2016/4/27 19:34:34编辑过]

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


加好友 发短信
等级:一尾狐 帖子:457 积分:3523 威望:0 精华:0 注册:2016/1/22 18:17:00
  发帖心情 Post By:2016/4/27 19:52:00 [显示全部帖子]

DataTables("物料").SQLReplaceFor("名称", dr("名称"), "代码 = '" & dr("代码") & "'")                   ‘这代码成更新前台数据了,我 前面DataTables("物料").Loadtop = 5 就更新5条,是10就更新10条
DataTables("物料").SQLReplaceFor("规格型号", dr("规格型号"), "代码 = '" & dr("代码") & "'")         ‘这代码成更新前台数据了,我 前面DataTables("物料").Loadtop = 5 就更新5条,是10就更新10条

 回到顶部
总数 16 1 2 下一页