BOM数据表的结构是这样的:
物品编码 单位标准材料(单价) 单耗我已经实现的BOM的展开,即:得到任意物品BOM构成树(正向)
但计算价格有点晕,就是从最"深层"的"资材"到"中间品"再到"制品",逐层推算出最终制品的价格... ...
应该有很多同学实现了吧?共享一下吧,谢了!
物品编码 单位标准材料(单价) 单耗我已经实现的BOM的展开,即:得到任意物品BOM构成树(正向)
但计算价格有点晕,就是从最"深层"的"资材"到"中间品"再到"制品",逐层推算出最终制品的价格... ...
应该有很多同学实现了吧?共享一下吧,谢了!
http://community.csdn.net/Expert/topic/2985/2985798.xml?temp=.6798517
根据这个例子变通一下就会求得所要得结果
不明白再问我很不错的
问题
父 子 值
A B 1
B C 1
B D 2
D E 3
-------------------
A
B(1)
C(1) D(2)
E(3)
A有 1 个B,B有 2 个D,D有 3 个E
我想算出A有几个E,几个D ,几个B解决方法
--测试--测试数据
create table 表(父 char(1),子 char(1),值 int)
insert 表 select 'A','B',1
union all select 'B','C',1
union all select 'B','D',2
union all select 'D','E',3
go--存储过程
create proc p_calc
@id char(1)='A', --要查询的节点
@num int=1 --数量
as
declare @l int
set @l=0
create table #re(id char(1),level int,num int)
insert #re select @id,@l,@num
while @@rowcount>0
begin
set @l=@l+1
insert #re select a.子,@l,num=b.num*a.值
from 表 a join #re b on a.父=b.id
where b.level=@l-1
end
select id,num=sum(num) from #re group by id
go
--调用查询
exec p_calc
go
/*--测试结果
id num
---- -----------
A 1
B 1
C 1
D 2
E 6(所影响的行数为 5 行)
--*/
用local 方法找到他的上级 求和 加
可是对treeview不熟,怎样遍历treeview并计算出父节点的价格呢?
首先非常感谢您的答复,您的方法我研究了,非常好,思路清晰,实现简洁.
但尚不能完全解决我的问题.
因为我需要计算出父节点的价格,也就是你例子中的A的价格(以下我都以
您的例子来阐述),即A=(1*C)+(6*E).E是树形中的最深层,可以通过判断level
字段的值(最大值)来得到,可是C呢?
所以我的问题是如何分析出位于树形末端的节点?如果还按照你的这个思
路,条件似乎不足了.你有空吗?再帮我看看吧,谢谢!
TTreeNode.Data是专门用来存取外部数据的指针,你可以参考一下。
初始化TreeView的时候
TreeNode.Data := Pointer(YourQuery.FieldByName('Type').AsInteger);取的时候
Integer(TreeNode.Data)
--测试--测试数据create table 表(父 char(1),子 char(1),值 int,成本 int )
insert 表 select 'A','B',1,0
union all select 'B','C',1,1
union all select 'B','D',2,0
union all select 'D','E',3,3
go--存储过程
create proc p_calc
@id char(1)='A', --要查询的节点
@num int=1 --数量
as
declare @l int
declare @cb int
set @cb = 0
set @l=0
create table #re(父 char(1),子 char(1),level1 int,num int,cb int)
insert #re select null,@id,@l,@num,0
while @@rowcount>0
begin
set @l=@l+1
insert #re select a.父,a.子,@l,num=b.num*a.值,a.成本
from 表 a join #re b on a.父=b.子
where b.level1=@l-1
end
select 父,子,num=sum(num),max(cb) from #re group by 父,子
--下面最底层节点之和
select @cb = @cb + cb*num from #re where exists(select * from #re r where r.父<>#re.子)
print @cb
print 'A=1*C(成本1)+6*E(成本3) ='+convert(varchar(20),@cb)
go
--调用查询
exec p_calc
go
/*--测试结果
父 子 num
---- ---- ----------- -----------
NULL A 1 0
A B 1 0
B C 1 1
B D 2 0
D E 6 3(所影响的行数为 5 行)19
A=1*C(成本1)+6*E(成本3) =19
*/