歸結到最後,就是一個展Bom的問題,由成品介往下展到最低層的raw material,然後算價格.
--这個是邹老大的查找子結點的function,
create function f_cid(@parent varchar(20))
returns @t table(part varchar(20),level int)
AS
begin
delcare @level int
set @level=1
insert into @t select @parent,@level
while @@rowcount>0
  begin
    set @level=@level+1
    insert into @t select a.child_part,@level
    from bom a,@t b
    where a.parent_part=b.part
    and b.level=@level-1
  end
return
end

解决方案 »

  1.   

    或者,將所有不是raw material的半成品或成品,都算好價格,一勞永逸,以後要算起來就快了.
      

  2.   

    商品信息表ptdid     ptdname       ptdtype                          ptdprice   unit
    商品编号  名称          类型(自生产件\采购件\委外件)      单价      单位BOM主表
    id          ptdid  
    编号        商品编号BOM子表ptdid         sn      childptdid   组成量    损耗率
    主表商品号    序号    组成商品号       订单表主表略....子表ptdid       price     qty    金额    商品编号    单价     数量
    问题:订单子表中的price如何自动生成?price=∑(子件构成数*子件单价)子件构成数=∑(子件组成量*(1/(1-损耗率))) 
    来源于BOM表子件单价来源于商品信息表
      

  3.   

    写个函数计算pricecreate function fn_price(
    @ptdid int
    )
    returns numeric(18,2)
    as
    begin
        declare @r numeric(18,2)
        set @r=0
        if not exists (select 1 from BOM子表 where ptdid=@ptdid) --叶子节点
             return (select ptdprice from 商品信息表 where ptdid=@ptdid)
        select @r=@r+组成量/(1-损耗率)*dbo.fn_price(childptdid) from BOM子表 where ptdid=@ptdid
        return @r
    end
    go--在写触发器
    create trigger tr_订单子表
    on 订单子表
    for insert,update
    as
    update a
    set price=dbo.fn_price(i.ptdid)
    from 订单子表 a,inserted i
    where a.主键=i.主键                    --估计有主键,搂主没写go