BOM数据表的结构是这样的:
物品编码  单位标准材料(单价)   单耗我已经实现的BOM的展开,即:得到任意物品BOM构成树(正向)
但计算价格有点晕,就是从最"深层"的"资材"到"中间品"再到"制品",逐层推算出最终制品的价格... ...
应该有很多同学实现了吧?共享一下吧,谢了!

解决方案 »

  1.   

    下面这个例子是我以前请教邹键的
    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 行)
    --*/
      

  2.   

    在一个循环里
    用local 方法找到他的上级 求和 加
      

  3.   

    BOM结构我已经展开,并放到treeview里边了,
    可是对treeview不熟,怎样遍历treeview并计算出父节点的价格呢?
      

  4.   

    >>>>在一个循环里用local 方法找到他的上级 求和 加还是不明白,能详细说说吗?
      
      

  5.   

    BOM中计算出父节点的价格是在表中根据每个子节点的价格计算,效率高
      

  6.   

    qizhanfeng:
        首先非常感谢您的答复,您的方法我研究了,非常好,思路清晰,实现简洁.
    但尚不能完全解决我的问题.
        因为我需要计算出父节点的价格,也就是你例子中的A的价格(以下我都以
    您的例子来阐述),即A=(1*C)+(6*E).E是树形中的最深层,可以通过判断level
    字段的值(最大值)来得到,可是C呢?
        所以我的问题是如何分析出位于树形末端的节点?如果还按照你的这个思
    路,条件似乎不足了.你有空吗?再帮我看看吧,谢谢!
      

  7.   

    TreeView中
    TTreeNode.Data是专门用来存取外部数据的指针,你可以参考一下。
      

  8.   

    如果单纯存价格,可以把这个指针当做integer来看待
    初始化TreeView的时候
    TreeNode.Data := Pointer(YourQuery.FieldByName('Type').AsInteger);取的时候
    Integer(TreeNode.Data)
      

  9.   

    稍微改动了一下,可以达到你的要求,如果可以的话,@cb作为output型参数或者return 返回即可
    --测试--测试数据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
    */