Foxtable(狐表)用户栏目专家坐堂 → [求助]大量数据递归计算


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

主题:[求助]大量数据递归计算

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]大量数据递归计算  发帖心情 Post By: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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1732 积分:11266 威望:0 精华:0 注册:2011/12/15 22:06:00
  发帖心情 Post By:2016/10/21 11:26:00 [只看该作者]

用MSSQL2005以上就用 公用表达式直接递归就好了

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/10/21 11:29:00 [只看该作者]

现在还是用的ACCESS哦。
而且,在数据量很大的情况下,使用遍历,且在其中用到赋值、compute肯定效率会很低
[此贴子已经被作者于2016/10/21 11:35:36编辑过]

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/21 11:42:00 [只看该作者]

上例子数据,说明你要做什么

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/10/21 12:03:00 [只看该作者]

示例表中只截了一部分数据,其实真实的数据量比这个大很多。
需要计算class = 1的各列的V值。

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

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

用递归能解决吗?

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


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

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

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/21 14:06:00 [只看该作者]

V值怎么算,子节点求和?

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


加好友 发短信
等级:九尾狐 帖子:2239 积分:18446 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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编辑过]

 回到顶部