代码改变世界

K/3 BOM多级展开

2014-03-24 19:44  dsding  阅读(830)  评论(0)    收藏  举报

上图是一个树状BOM,加色部分是原材料。

下图是简单新增的三张表,一个物料表,一个是BOM表头,一个是BOM表体。

再下面是多级查询后的结果,查询分三层,ID为2是自制件,ID为1是外购件。

SQL 脚本如下,可能还有可以改动的地方DECLARE @Level INT SET @Level = 0 

CREATE TABLE #GroupData 
(        FLevel    INT              NOT NULL, 
         FItemID   varchar          NOT NULL, 
         id        char             NOT NULL 
) 
Create Index #idx_parentid on #GroupData(FITEMID) 

create TABLE #GROUPDATA1 (FLevel INT NOT NULL, 
                          FItemID varchar NOT NULL, 
                          id char NOT NULL) 
                          
insert into #GroupData(FLevel,FItemID,id) 
select @Level+1,b.FItemID,c.id from bom a join bomc b on a.fid=b.fid 
join base c on b.FItemID=c.FItemID where a.FItemID='a' 

while EXISTS (select top 1 1 from (select flevel,fitemid,id from #GROUPDATA 
where flevel=(select max(flevel)from #GROUPDATA) and id=2) a left join bom b on a.FItemID=b.FItemID 
where b.fitemid is not null) 
BEGIN 
SET @Level=(SELECT MAX(FLEVEL)FROM #GroupData) 
INSERT INTO #GROUPDATA1(FLevel,FItemID,id) 
select flevel,fitemid,id from #GROUPDATA where flevel=(select max(flevel)from #GROUPDATA) and id=2 
 insert into #GroupData(FLevel,FItemID,id) 
 select  @Level+1,b.FItemID,c.id 
 from #GROUPDATA1 a 
 left join bom d on a.FItemID=d.FItemID 
 join bomc b on d.fid=b.fid 
 left join base c on b.fitemid=c.fitemid 
 set @Level=@Level+1 
 TRUNCATE TABLE #GROUPDATA1 
END