Foxtable(狐表)用户栏目专家坐堂 → 一次性删除表中所有行的代码优化


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

主题:一次性删除表中所有行的代码优化

帅哥哟,离线,有人找我吗?
小猪鑫鑫
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:832 积分:5867 威望:0 精华:6 注册:2011/5/27 11:41:00
一次性删除表中所有行的代码优化  发帖心情 Post By:2011/12/9 10:38:00 [只看该作者]

狐爸及各位狐狸朋友们,大家好!对于一次性删除表中的所有行的代码,有好几种方法,但所用时间都各有不同,现针对系统自带的学习文件《代码优化》项目中的“表A”里10000行来测试,我想到了三种方式,所用时间相差很大,现转给大家参考

 第一种:

Dim sj As Date =Date.now

For Each dr As DataRow In DataTables("A").DataRows

For i As Integer =Tables("A").Rows.count-1 To 0 Step -1

DataTables("A").DataRows(i).delete

Next

Next

output.show((Date.now-sj).Totalseconds)

需时56.92秒

第二种:

Dim sj As Date =Date.now

DataTables("A").deletefor("项目 is not null")

output.show((Date.now-sj).Totalseconds)

需时3.625秒

第三种:

Dim sj As Date =Date.now

With Tables("A")

    .Select(0, 0, .Rows.Count - 1, .Cols.Count - 1)

End With

Syscmd.Row.delete()

output.show((Date.now-sj).Totalseconds)

需时0.59秒

对于第三种情况,系统会弹出一个对话框,用户需及时“回车”确定,回车的时间决定了反应的速度!

另我想请问狐爸,为什么我加入模拟回车键无效的(sendkeys.send("{enter}"),如果能自动回车,速度会更快,请狐爸指点!


 


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/12/9 11:08:00 [只看该作者]

最简单的代码:

DataTables("A").DataRows.Clear()

 

另外建议看看这个:

http://www.foxtable.com/help/topics/0453.htm

 


 回到顶部
帅哥哟,离线,有人找我吗?
小猪鑫鑫
  3楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:832 积分:5867 威望:0 精华:6 注册:2011/5/27 11:41:00
  发帖心情 Post By:2011/12/9 11:17:00 [只看该作者]

0.406秒,真的很快,谢谢指导!

另不明您要我看上面帮助文件的用处,我是想问当有对话框弹出,我模拟按下回车键(sendkeys.send("{enter}") ,为什么无效?


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/12/9 11:23:00 [只看该作者]

1、同样的代码,加上这两行,会提速很多:

 

Dim sj As Date =Date.now
Tables("表A").StopRedraw
For Each dr As DataRow In DataTables("A").DataRows
    For i As Integer =Tables("A").Rows.count-1 To 0 Step -1
        DataTables("A").DataRows(i).delete
    Next
Next
Tables("表A").ResumeRedraw
output.show((Date.now-sj).Totalseconds)

2、

 

Dim sj As Date =Date.now
With Tables("表A")
    .Select(0, 0, .Rows.Count - 1, .Cols.Count - 1)
End With
Sendkeys.send("{ENTER}")
Syscmd.Row.delete()
output.show((Date.now-sj).Totalseconds)


 回到顶部
帅哥哟,离线,有人找我吗?
小猪鑫鑫
  5楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:832 积分:5867 威望:0 精华:6 注册:2011/5/27 11:41:00
  发帖心情 Post By:2011/12/9 11:34:00 [只看该作者]

狐爸:4楼的第一种方案需7.24秒(不太理想);第二种方案只要0.39秒,真的很强,谢谢

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/12/9 11:35:00 [只看该作者]

从你原来的56秒多到7秒多,已经提速很多了,这个例子是告诉你批量操作的时候要注意什么。

 回到顶部
帅哥哟,离线,有人找我吗?
小猪鑫鑫
  7楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:832 积分:5867 威望:0 精华:6 注册:2011/5/27 11:41:00
  发帖心情 Post By:2011/12/9 11:37:00 [只看该作者]

哦,知道了,谢谢

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


加好友 发短信
等级:九尾狐 帖子:2609 积分:16926 威望:0 精华:11 注册:2011/9/20 16:13:00
  发帖心情 Post By:2011/12/9 11:48:00 [只看该作者]

不错学习了,谢谢
[此贴子已经被作者于2011-12-9 11:47:43编辑过]

 回到顶部