您的位置:首页 > 其它

按树型显示BOM的结构

2016-04-28 15:56 495 查看
在制造企业中,生产的每一个产品都由一道或多道工序组成,在组成成品之前,每一道工序经由物料--物料组成半成品,或物料--半成品组成新的半成品,亦或由半成品--半成品组成新的半成品。复杂的成品经由多道工序最终形成。在这一过程中,某一物料或半成品可能出现在多道工序这中。而每一道工序又涉及损耗(包括调机损耗和加工损耗等)等一系列问题都是需要在实际的生产系统中考虑到。在从事ERP与MES开发多年,目前系统设计的结构已满足了这些方方面的要求。今天,趁着闲暇的时候记录一下,一来是自己对整个结构做一个回顾,另一方面也希望给新人一丁点启发。

首先,我们的BOM结构主要分为三层。其基本表是 Bom, BomDTL, BomDTL2

其各表的关键字如下图:

ALTER PROCEDURE [dbo].[frmBomMap_List]
@sknum1 VARCHAR(50),
@sknum2 VARCHAR(50)

AS
CREATE TABLE #TEMP
(TOPLEVEL VARCHAR(50)  COLLATE Chinese_PRC_BIN,
Ancestor VARCHAR(50) COLLATE Chinese_PRC_BIN,
ProNum VARCHAR(50)  COLLATE Chinese_PRC_BIN,
[SETS] INT,
QTY FLOAT,
BOMLEVEL INT)

SELECT TOPLEVEL=Ancestor,Ancestor='Root',ProNum=Ancestor,Ver INTO #t1  FROM dbo.Bom
WHERE DrawNum between @sknum1 AND @sknum2
AND IsEffect=1 --AND IsOrigin=1   -- 非原型也要取

IF (SELECT COUNT(1) FROM #t1) >200
BEGIN
RAISERROR('数据过多,请缩小设计卡的范围',11,-1)
RETURN
END

SELECT * INTO #t2 FROM #t1

declare @ancestor varchar(50),@version VARCHAR(5)
while (select count(*) from #t1)>0
BEGIN
select TOP 1 @ancestor=TOPLEVEL,@version=Ver FROM #t1
delete #t1 where TOPLEVEL=@ancestor AND Ver=@version

;WITH BOMList(TOPLEVEL, Ancestor, ProNum,[SETS], QTY,BOMLEVEL) AS
(
SELECT TOPLEVEL=Ancestor, Ancestor,ProNum,Sets, Qty AS QTY, 0 AS BOMLEVEL    -- Sets*Qty AS QTY
FROM dbo.BomDTL2
WHERE Ancestor=@ancestor AND Ver=@version
UNION ALL
SELECT TOPLEVEL, B2.Ancestor, B2.ProNum, B2.Sets,B2.Qty AS QTY,BOMLEVEL + 1
FROM BomDTL2 B2, BOMList BB
WHERE B2.Ancestor=BB.ProNum
)
INSERT #TEMP
SELECT TOPLEVEL, Ancestor, ProNum,[SETS],QTY,BOMLEVEL
FROM BOMList
END

--delete #TEMP where ProNum in (select Ancestor from #TEMP)

SELECT DISTINCT #TEMP.*,p.ProType FROM #TEMP,dbo.Product p
WHERE #TEMP.ProNum = p.ProNum
UNION ALL  SELECT TOPLEVEL,Ancestor,ProNum,1,1,-1,'02' FROM #t2  -- 02是成品

ORDER BY  TOPLEVEL ASC,BOMLEVEL ASC,ProType DESC,ProNum ASC

DROP TABLE #t1,#t2,#TEMP


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: