Foxtable(狐表)用户栏目专家坐堂 → [求助]deletefor与null的效率问题


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

主题:[求助]deletefor与null的效率问题

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]deletefor与null的效率问题  发帖心情 Post By:2018/7/3 14:58:00 [只看该作者]

发现一个问题,使用combine方法合并两个查询表。
合并之后,有A和B两列,其中A列有些行是空的。

如果使用datatables("合并表").deletefor("A is null"),速度非常慢。
有什么办法可以提高这个效率?

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


加好友 发短信
等级:狐神 帖子:4752 积分:34568 威望:0 精华:0 注册:2008/8/31 22:44:00
  发帖心情 Post By:2018/7/3 15:34:00 [只看该作者]

combine之前不可以先排除空值吗

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/3 18:33:00 [只看该作者]

这个不可能啊。比如说这个月进了10种商品,但本年累计进货会有100种,而本月销售可能只售了6种。
如果要体现本年度截止本月的以下数据:
累计进货的商品种类及进货数量、销售数量的时候,很显然,销售数量行可能就有空值,因为买进来不一定立马就会卖掉。

如果用SQL还可以使用iif(A is null,0,A)
但Combine之前,如果使用groupbuilder,那怎么去赋0?

我也注意到有些文章写的,如果是用is null在SQL中时,会遍历所有行,效率低可能跟这个有关。
[此贴子已经被作者于2018/7/3 18:37:20编辑过]

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


加好友 发短信
等级:二尾狐 帖子:574 积分:4252 威望:0 精华:0 注册:2015/5/13 8:32:00
  发帖心情 Post By:2018/7/3 19:30:00 [只看该作者]

tables("合并表").Filter="A>''"
可以考虑,直接隐藏掉,没必要删除啊!

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


加好友 发短信
等级:超级版主 帖子:110629 积分:563047 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/7/3 21:13:00 [只看该作者]

可以看看http://www.foxtable.com/webhelp/scr/2225.htm

具体上传实例测试

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/7/3 22:00:00 [只看该作者]

这个问题无解。照抄了基本全部的代码,执行效率还是很低。

 

不清楚为什么Syscmd.Row.Delete能快速执行,我暂时没有找到变通方法。

 

如果你要临时移除,或者隐藏,你可以试试用filter、remove、visible等方式处理。

 

CurrentTable.addnew(5000)
Foxtable.Syscmd.stopredraw
CurrentTable.DataTable.StopRedraw
Dim lst As new List(of System.data.DataRow)
Dim view As System.data.dataview = BindTables(CurrentTable.name)
For i As Integer = 0 To view.count-1
    Dim idx = CurrentTable.grid.Rows(i).DataIndex
    If idx >= 0 Then
        lst.add(view(idx).Row)
    End If
Next
Dim enumerator As List(of system.data.DataRow).Enumerator = lst.GetEnumerator()
msgbox(123)
Do While enumerator.MoveNext
    Dim current As system.data.DataRow = enumerator.Current
    current.delete
    'Dim grid As c1.win.c1flexgrid.C1FlexGridBase = CurrentTable.grid
    'grid.removeitem(grid.Rows.count-1)   
Loop
msgbox("aaa")
CurrentTable.DataTable.ResumeRedraw
Foxtable.Syscmd.ResumeRedraw


 回到顶部