BOM求用量,该如何做?用递归吗?

YUAN168 2007-12-27 04:50:17
SYS2BOM
1 000-AIM-A-001 0 NULL .0000
2 Z1SANO01 1 000-AIM-A-001 2.0000
3 Z1AMPB00 1 000-AIM-A-001 3.0000
4 Z1MSKC24 1 000-AIM-A-001 2.0000
5 K00049A3 2 Z1SANO01 3.0000
6 K00050A3 2 Z1SANO01 5.0000
7 10SANC15 3 Z1AMPB00 3.0000
8 1SANN37 3 Z1AMPB00 2.0000
============================================================
000-AIM-A-001 产品编号
ZXXXXX 半成品编号
其它 材料编号

===========================
请问如何对它进行展开?
是否要用到递归?
...全文
215 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
rubiki 2007-12-28
  • 打赏
  • 举报
回复


select 1 id,'000-AIM-A-001' 编号,3 数量, NULL 上级编号,1 价格
into SYS2BOM
union all select 2,'Z1SANO01' ,2, '000-AIM-A-001', 2
union all select 3,'Z1AMPB00' ,2, '000-AIM-A-001', 4
union all select 4,'Z1MSKC24' ,3, '000-AIM-A-001', 2
union all select 5,'K00049A3' ,2, 'Z1SANO01', 3
union all select 6,'K00050A3' ,2, 'Z1SANO01', 5
union all select 7,'10SANC15' ,3, 'Z1AMPB00', 3
union all select 8,'1SANN37' ,3, 'Z1AMPB00', 2


select * from SYS2BOM order by id

;with 成本 as
( select 编号 本级编号,编号,1 数量 , 1 上级数量, 上级编号, 价格, 成本 = 价格
from SYS2BOM

Union all
select C.本级编号,S.编号, S.数量,C.数量*S.数量, S.上级编号, S.价格, 成本 = C.数量*S.数量*S.价格
from SYS2BOM S
join 成本 C on S.上级编号 = C.编号
)
select S.*,总价格=成本,总成本=成本*数量
from (
select 本级编号,sum(成本) 成本
from 成本
group by 本级编号)a
join SYS2BOM S on a.本级编号 = S.编号
order by id

drop table SYS2BOM


结果:


(8 行受影响)
id 编号 数量 上级编号 价格
----------- ------------- ----------- ------------- -----------
1 000-AIM-A-001 3 NULL 1
2 Z1SANO01 2 000-AIM-A-001 2
3 Z1AMPB00 2 000-AIM-A-001 4
4 Z1MSKC24 3 000-AIM-A-001 2
5 K00049A3 2 Z1SANO01 3
6 K00050A3 2 Z1SANO01 5
7 10SANC15 3 Z1AMPB00 3
8 1SANN37 3 Z1AMPB00 2

(8 行受影响)

id 编号 数量 上级编号 价格 总价格 总成本
----------- ------------- ----------- ------------- ----------- ----------- -----------
1 000-AIM-A-001 3 NULL 1 81 243
2 Z1SANO01 2 000-AIM-A-001 2 18 36
3 Z1AMPB00 2 000-AIM-A-001 4 19 38
4 Z1MSKC24 3 000-AIM-A-001 2 2 6
5 K00049A3 2 Z1SANO01 3 3 6
6 K00050A3 2 Z1SANO01 5 5 10
7 10SANC15 3 Z1AMPB00 3 3 9
8 1SANN37 3 Z1AMPB00 2 2 6

(8 行受影响)

dawugui 2007-12-27
  • 打赏
  • 举报
回复
以上是bom成本计算的例.可是要这个?
dawugui 2007-12-27
  • 打赏
  • 举报
回复
表一:品号信息档
品号 品号属性 材料成本 人工成本 本阶人工
MB001 MB025 MB057 MB058 MB061
A M 2
B M 1
C P 2
D P 3
(MB025=M 时只有本阶人工是基础数据,其他的是计算过来的,MB025=P时只有MB057有基础数据)


表二(BOM)
主件品号 元件品号 用量
A B 2(A由2个B组成)

B C 1 (B由1个C和3个D组成)
B D 3

计算原理:
1、计算MB025=M 的人工成本,人工成本=本阶人工+下阶人工成本
2、计算材料成本,材料成本=本阶用到材料+下阶材料之和(如本例

结果:
MB001 MB025 MB057 MB058 MB061
A M 22 4 2
B M 11 1 1
C P 2 0 0
D P 3 0 0

11=(3D+1C)=11
22=11*2
4=2B+2










go
create table BOM(主件品号 nvarchar(2),元件品号 nvarchar(2), 用量 int)
insert BOM select 'A','B',2
insert BOM select 'B','C',1
insert BOM select 'B','D',3
go
create table product(MB001 nvarchar(2), MB025 nvarchar(2), MB057 int, MB058 int, MB061 int)
insert product select 'A','M',null,null, 2
insert product select 'B','M',null,null, 3-----改为3测试
insert product select 'C','P', 2 ,null,null
insert product select 'D','P', 3 ,null,null
go

go
create function BomTree(@Product nvarchar(2))
returns numeric(18,5)
as
begin

declare @T table(主件品号 nvarchar(2),元件品号 nvarchar(2), 用量 int,lev int)
declare @i int,@num numeric(18,5)
if not exists(select 1 from BOM where 主件品号=@Product)
begin
select
@num=sum(MB057)
from
product
where
MB001=@Product
return @num
end

set @i=0
insert @T select 主件品号,元件品号,用量,@i from BOM where 主件品号=@Product
while @@rowcount>0
begin
set @i=@i+1
insert @T
select
t2.主件品号,t2.元件品号,t.用量*t2.用量,@i
from @t t join BOM t2 on t.元件品号=t2.主件品号
where t.Lev=@i-1
end
select
@num=sum(t.用量*case when t2.MB057>0 then t2.MB057 else 1 end)
from
@t t
join
product t2 on t.元件品号=t2.MB001
where
not exists(select 1 from @t where t.元件品号=主件品号)

return @num
end
go

create function BomTree2(@Product nvarchar(2))
returns numeric(18,5)
as
begin

declare @T table(主件品号 nvarchar(2),元件品号 nvarchar(2), 用量 int,lev int)
declare @i int,@num numeric(18,5)
if not exists(select 1 from BOM t where 主件品号=@Product
and not exists(select 1 from product where MB001=t.元件品号 and isnull(MB061,0)!>0))
begin
select
@num=sum(isnull(MB061,0))
from
product
where
MB001=@Product
return @num
end

set @i=0
insert @T select 主件品号,元件品号,用量,@i from BOM where 主件品号=@Product
while @@rowcount>0
begin
set @i=@i+1
insert @T
select
t2.主件品号,t2.元件品号,t.用量*t2.用量,@i
from @t t join BOM t2 on t.元件品号=t2.主件品号
where t.Lev=@i-1
end
select
@num=sum(t.用量*isnull(t2.MB061,1))
from
@t t
join
product t2 on t.元件品号=t2.MB001------改一下判断

where
not exists(select 1 from product where MB001=t.元件品号 and isnull(MB061,0)!>0)


return @num
end
go

select
MB001, MB025 , [MB057]=dbo.BomTree(MB001), [MB058]=isnull([MB061],0)+dbo.BomTree2(MB001), [MB061]=isnull([MB061],0)

from
product
go
--drop table product,BOM
--drop function BomTree,BomTree2

MB001 MB025 MB057 MB058 MB061
----- ----- -------------------- --------------------- -----------
A M 22.00000 8.00000 2
B M 11.00000 6.00000 3
C P 2.00000 .00000 0
D P 3.00000 .00000 0

(所影响的行数为 4 行)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧