U9Bom階層展開腳本

declare @maincode char(60)
set @maincode='10.1210.0012'--產成品品號
declare @i int
set @i=0


--SELECT MD003 FROM #BOMMD WHERE MD001='CG.16120509001.00909'

select item.ID MID,item.Code MD001,item.Name MName,itemlin.ID ZID,itemlin.Code MD003,itemlin.Name ZName,
Convert(decimal(18,3),B.UsageQty) UsageQty --用量
,Convert(decimal(18,3),B.ParentQty) ParentQty --母件底數
,Convert(decimal(18,3),Convert(decimal(18,3),B.UsageQty)/Convert(decimal(18,3),B.ParentQty)) MD006 --計算實際用量
INTO #BOMMD
from CBO_BOMMaster as A  
inner join CBO_BOMComponent as B on A.ID = B.BOMMaster
left join CBO_ItemMaster item on A.ItemMaster=item.ID
left join CBO_ItemMaster itemlin on B.ItemMaster=itemlin.ID
where 
A.BOMType=0  --0 爲自制件 1爲委外
and A.AlternateType=0 --0 生產目的爲主製造 1 爲委外
and A.BOMType=0 --0 BOM類型爲自制  1爲委外 10.0115.0006
and 
A.Org=1002011047606283
and A.DisableDate > GETDATE() --失效日期需大於今天日期
--and A.ID in(select max(ID)
--from CBO_BOMMaster where Org='1002011047606283'
--group by BOMVersionCode,ItemMaster,Project
--having max(DisableDate) > GETDATE() )
--AND A.ItemMaster = (select id from CBO_ItemMaster where Code =('10.5001.0010') and Org='1002011047606283')


--MD001爲主件品號,MD003爲元件品號,兩者形成對應關係
--定義主件品號臨時表 
declare @tmp_main table (品號 CHAR(60))
--將待查品號存入主件品號臨時表 
INSERT INTO @tmp_main  SELECT MD003 FROM #BOMMD WHERE MD001=@maincode
--定義BOM明細臨時表
declare @tmp_bom table (主件品號 char(60),元件品號 char(60),組成用量 float,階數 int)
--將待查品號下一級元件品號數據存入BOM明細臨時表
insert into @tmp_bom select MD001,MD003,MD006,@i from #BOMMD 
       where MD001 =@maincode
--如果BOMM表MD001(主件品號)存在於BOM明細臨時表中的元件品號且階數爲當前最低層,進入循環
while exists(select * from #BOMMD where MD001 in (select 元件品號 from @tmp_bom where 階數=@i))
begin
    --向BOM明細臨時表插入BOMMD中MD001與主件品號臨時表品號一致的數據(以主件品號臨時表左關聯BOMMD,存在多對一關係)
   insert into @tmp_bom select MD001,MD003,MD006,@i+1 from 
          (select MD001,MD003,MD006 from @tmp_main LEFT join #BOMMD on 品號=MD001
                  )A where MD001 is not null
    --清空主件品號臨時表
    delete from @tmp_main 
    --向主件品號臨時表插入BOMMD中的主品號存在於BOM明細臨時表元件品號的MD003(子品號)
    INSERT INTO @tmp_main  SELECT MD003 FROM #BOMMD WHERE MD001
           in (select 元件品號 from @tmp_bom where 階數=@i)
    set @i=@i+1       
end    
select *  from @tmp_bom  ORDER BY 階數,元件品號


drop table #BOMMD
發佈了23 篇原創文章 · 獲贊 14 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章