递规存储过程(300分)

U

ugvanxk

Unregistered / Unconfirmed
GUEST, unregistred user!
存储过程里有游标,
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1416761
 
问题: 树型数据库求和的问题
id pid value kind
0 -1 0
1 0 1
2 0 1
3 0 1
4 1 1
5 2 2
6 3 2
7 4 2
8 4 2
9 1 2
10 1 2
建立一棵树,加的字节点可能 kind=1 或kind=2 ,
当kind=0 或kind=1 时,value的值都没有,只有kind=2即叶节点的情况才有值。
即kind=2 不可能再有字节点
然后要把上一级的 kind=1的赋值, 最后求出 kind=0的值,即最高的节点的值。
考虑添加 删除 修改的情况
用存储过程,或触发器,程序也可以

最好用存储过程实现。
用递归的方式,先找到符合条件的第一级节点,打入临时表
然后再针对临时表的记录进行递归
如果用的是Oracle数据库,直接就用Connect by语句把所有符合条件的记录列出来了
进行SUM求和就搞定。
用上面的方法之一写出一个存储过程
然后添加 删除 修改的时候在触发器中调用它。
 
可能有这样的
kind=1 它的下层还是1
不知道多少层
关键这个value值不是一开始就赋上去的,还要这个表和其他表的关系,然后计算才得到
 
关主,这个问题对bom表非常有用
 
你管它Kind的值是什么,递归是根据id = pid来的
跟kind值无关,这个值只是一个过滤条件而已。
但你说kind为2的子节点的Value值是有的,根据这个来统计啊
怎么又跟其他表相关了
 
先要通过一定的计算关系,计算出结果付到kind=2,或是手工输入
关键是有游标的递规的存储过程可以不可以,我的错误在什么地方
 
id pid value kind sysid attr
0 -1 0
1 0 1
2 0 1
3 0 1
4 1 1
5 2 2
6 3 2
7 4 2
8 4 2
9 1 2
10 1 2
无限层次的树
sysid 相同的说明是同一个项目,计算只能是同一个项目,可能是这一项目的任意节点
atr=0 表示此值是手工输入 attr=1 表示要通过关系利用另外的表计算出来
kind=1或 kind=2 的attr都有可能为0
即kind=2 不可能再有子节点
然后要把上一级的 kind=1的赋值, 最后求出给定节点的值。
// 考虑添加 删除 修改的情况 暂不考虑,因为是动态的计算,
考虑用存储过程 //,或触发器,程序也可以
 
存储过程当然可以递归,但是你写成触发器的时候就不能这么写,会死循环。
无论SYSID,ATR还是KIND都只是一个过滤条件而已,方法还是我上面说的:
用递归的方式,先找到符合条件的第一级节点,打入临时表
然后再针对临时表的记录进行递归
 
多人接受答案了。
 

Similar threads

回复
0
查看
560
不得闲
D
回复
0
查看
773
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部