Office中国论坛/Access中国论坛

标题: 于表自身内部建立关系的多条记录汇总查询的问题 [打印本页]

作者: fannky    时间: 2008-3-13 08:18
标题: 于表自身内部建立关系的多条记录汇总查询的问题
如实例中的List表,是一个典型的Tree模型,Parent字段指向该节点的父节点

现在想做一个查询,计算一个根节点下的所有子节点Weight之和。

增加赏金了~!

[ 本帖最后由 fannky 于 2008-3-15 10:57 编辑 ]
作者: tmtony    时间: 2008-3-13 09:45
是的,能否详细说明一下
作者: fannky    时间: 2008-3-13 10:50
[attach]28831[/attach]
如图所示表中的关系,想得到最后这个累加的结果
作者: cangqiong    时间: 2008-3-13 13:15
顶一下!关注
了解一下。学习学习!!!1
作者: Grant    时间: 2008-3-13 15:24
既然楼主想到了节点,那么我提供一个方法,利用编码对其进行管理和计算
H
    |__HA
    |__ HB
            |____HB01   
然后就可以利用查询来归纳这里的数值了
以上只是一种方法,可以参考一下
作者: fannky    时间: 2008-3-13 15:31
以下是一个方法参考,不过较复杂,并且不能无限级的操作:
这种方法在SQL中利用存储过程实现了,但是依然非常不理想

DECLARE @s  VARCHAR(1000)
DECLARE @id SMALLINT
set @s='1,'

DECLARE cur1 CURSOR FOR   select [id] from list where parent=1
OPEN cur1  /***** 游标1  *****/
FETCH NEXT FROM cur1 INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
   set @s=@s + convert(varchar,@id) + ','
   DECLARE cur2 CURSOR FOR select [id] from list where parent=@id
   OPEN cur2  /***** 游标2  *****/
   FETCH NEXT FROM cur2 INTO @id
   WHILE @@fetch_status=0
   BEGIN
     set @s=@s + convert(varchar,@id) + ','
     DECLARE cur3 CURSOR FOR select [id] from list where parent=@id
     OPEN cur3  /***** 游标3  *****/
     FETCH NEXT FROM cur3 INTO @id
     WHILE @@fetch_status=0
     BEGIN
       set @s=@s + convert(varchar,@id) + ','
       --   如果还有下一级就在此继续写:游标 4 , 5, 6 ... 照此类推
       FETCH NEXT FROM cur3 INTO @id
     end
     CLOSE cur3
     DEALLOCATE cur3
   
     FETCH NEXT FROM cur2 INTO @id
   END
   CLOSE cur2
   DEALLOCATE cur2
   FETCH NEXT FROM cur1 INTO @id
END
CLOSE cur1
DEALLOCATE cur1

set @s=Left(@s,Len(@s)-1)

EXEC ('select weight=sum(weight) from list where parent in ('+ @s +')')  /* 合计 */
作者: fannky    时间: 2008-3-14 08:17
依然没有ACCESS中的解决办法吗?

5#楼的朋友说的方法可以实现,但是还要重新更改表的结构
能不能不更改表的结构实现?
作者: 咱家是猫    时间: 2008-3-14 10:27
请问是不是要实现类似下图的效果?
咦,我竟然无法跟帖发图?

[ 本帖最后由 咱家是猫 于 2008-3-14 10:28 编辑 ]
作者: 咱家是猫    时间: 2008-3-14 11:04
声明一个变量
Dim C as long
......
在每个节点添加前先取这个C值,如:
C=DSum("Weight","List","Parent="& RS!Rarent &"")
Set Nodindex = XTree.Nodes.Add("父", tvwChild, Rs![编号], Rs![Name] & "(" & C & ")")
......
作者: fannky    时间: 2008-3-14 13:33
猫咪说对了
是这样的
作者: 咱家是猫    时间: 2008-3-14 22:24
说对了给赏银吧.
作者: rjacky    时间: 2008-3-14 23:03
对于这个问题的难度来说,赏金显得少了点哦

如果是bom计算问题,就没必要采用节点的表结构,在这样结构的表存储多个bom是多么麻烦的一件事

参考这个例子吧,支持多重bom嵌套计算 http://www.office-cn.net/forum.p ... replyID=&skin=1
作者: 咱家是猫    时间: 2008-3-15 08:50
原帖由 rjacky 于 2008-3-14 23:03 发表
对于这个问题的难度来说,赏金显得少了点哦.

有同感.
作者: fannky    时间: 2008-3-15 10:57
原帖由 咱家是猫 于 2008-3-15 08:50 发表

有同感.


市场行情是多少?
喂!物价部门出来啊……
那我就在加一些!

涨价!!
作者: goto2008    时间: 2008-3-22 16:34
大哥,有个完整的树合计代码吗///。。

想学习下
作者: fannky    时间: 2008-3-22 16:51
原帖由 goto2008 于 2008-3-22 16:34 发表
大哥,有个完整的树合计代码吗///。。

想学习下

暂时还没有啊
不过,就像建立树的过程一样,循环计算就可以了吧

我是想在SQL中解决……可惜到现在都没有答案
作者: qlm    时间: 2008-4-12 22:58
以前曾化费极大的力气研究BOM,
不过现在不需要了。
支持一下!
作者: qlm    时间: 2008-4-14 22:19
在ACCESS里用查询可以求到结果,但只能完成特定级,不能无限。
我试过了。
作者: bujiu02    时间: 2010-7-10 14:57
顶一下!关注
了解一下。学习学习!!!1





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3