以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]deletefor与null的效率问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=121295)

--  作者:chnfo
--  发布时间:2018/7/3 14:58:00
--  [求助]deletefor与null的效率问题
发现一个问题,使用combine方法合并两个查询表。
合并之后,有A和B两列,其中A列有些行是空的。

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

--  作者:y2287958
--  发布时间:2018/7/3 15:34:00
--  
combine之前不可以先排除空值吗
--  作者:chnfo
--  发布时间: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
--  发布时间:2018/7/3 19:30:00
--  
tables("合并表").Filter="A>\'\'"
可以考虑,直接隐藏掉,没必要删除啊!

--  作者:有点蓝
--  发布时间:2018/7/3 21:13:00
--  
可以看看http://www.foxtable.com/webhelp/scr/2225.htm

具体上传实例测试

--  作者:有点甜
--  发布时间: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