以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]大量数据递归计算  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=91896)

--  作者:chnfo
--  发布时间:2016/10/21 11:16:00
--  [求助]大量数据递归计算
表A中有Code、FCode、V等列,数据量较大(约2万行)
显示的示列如下:
Code              FCode            V
1
1.1                1 
1.1.1             1.1                 1.2
1.1.2             1.1
1.1.2.1          1.1.2               2.3
1.1.2.2          1.1.2               3.4
1.1.2.3          1.1.2               4.5
……

这么多数据肯定是导入的了。
用普通的compute会导致计算溢出,如何用递归来搞定它?关键是要速度快才好。

--  作者:jspta
--  发布时间:2016/10/21 11:26:00
--  
用MSSQL2005以上就用 公用表达式直接递归就好了
--  作者:chnfo
--  发布时间:2016/10/21 11:29:00
--  
现在还是用的ACCESS哦。
而且,在数据量很大的情况下,使用遍历,且在其中用到赋值、compute肯定效率会很低
[此贴子已经被作者于2016/10/21 11:35:36编辑过]

--  作者:有点蓝
--  发布时间:2016/10/21 11:42:00
--  
上例子数据,说明你要做什么
--  作者:chnfo
--  发布时间:2016/10/21 12:03:00
--  
示例表中只截了一部分数据,其实真实的数据量比这个大很多。
需要计算class = 1的各列的V值。

如果是用DrawCell或者datacolchanged事件,在数据全部加载之后,单个的数据修改,就算用最简单的遍历再compute,速度也不会慢。

但是这么大的数据量,一般会直接从EXCEL表中合并进来,合并之后计算它们的值。
因为是遍历,如果compute再赋值,肯定效率会很低。

用递归能解决吗?

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:大数据量的递归计算.rar


似乎用DrawCell,出来得很快。datacolchanged极慢。

所以,涉及到递归的,不计算用查询可能要好很多。
[此贴子已经被作者于2016/10/21 14:03:14编辑过]

--  作者:有点蓝
--  发布时间:2016/10/21 14:06:00
--  
V值怎么算,子节点求和?
--  作者:chnfo
--  发布时间:2016/10/21 14:10:00
--  
对,FCode的意思就是父节点的Code。
往上递归合计到父节点的V值。

我现在是在Drawcell事件中写的
if e.row("Class") = 1 then 
e.row("V") = e.table.datatable.compute("Sum(V)","Code = \'" & e.row("Code") & "\' or Code like \'" & e.row("Code")  &".8\'")
end if 

这样,其实父节点的金额出来得速度还可以接受(就算20000行数据也还行)
但是,如果父节点的金额要被其它地方应用,就比较麻烦。

不用递归也可以,能整出来就行。

比如这个表的Class=1的数据要被其它的表引用参与计算,尤其是V值要参与计算(例如再sum),那就加重了其它表的负担,速度会极慢。
有没有其它的途径来解决呢?比如在外部数据库中用一个查询视图,来计算class=1的值,其它的表要引用这个金额来参与计算,就直接从查询视图中取值?
[此贴子已经被作者于2016/10/22 12:52:32编辑过]