歸結到最後,就是一個展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
--这個是邹老大的查找子結點的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
商品编号 名称 类型(自生产件\采购件\委外件) 单价 单位BOM主表
id ptdid
编号 商品编号BOM子表ptdid sn childptdid 组成量 损耗率
主表商品号 序号 组成商品号 订单表主表略....子表ptdid price qty 金额 商品编号 单价 数量
问题:订单子表中的price如何自动生成?price=∑(子件构成数*子件单价)子件构成数=∑(子件组成量*(1/(1-损耗率)))
来源于BOM表子件单价来源于商品信息表
@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