--练习:元件上展BOM
IF EXISTS
(
SELECT *
FROM tempdb.dbo.sysobjects
WHERE id = OBJECT_ID(N'tempdb.dbo.#temp_bom')
) --是否存在该临时表
DROP TABLE #temp_bom --存在则删除
CREATE TABLE #temp_bom --创建临时表
(
ROOT_ITEM_ID UNIQUEIDENTIFIER, --品号(元件)
TOTAL_SEQ NVARCHAR(200), --层级关系
SEQ INT, --序号
LEV INT, --层次
BOM_ID UNIQUEIDENTIFIER,
BOM_D_ID UNIQUEIDENTIFIER,
PARENT_ITEM_ID UNIQUEIDENTIFIER, --父级品号
ITEM_ID UNIQUEIDENTIFIER --自身品号
)
DECLARE @ITEM_CODE VARCHAR(20),
@CurrentLevel AS INT,
@Level INT,
@IsBottom INT -- 0-多阶,1-尾阶
SELECT @ITEM_CODE = '130010009',
@Level = 20,
@IsBottom = 0
INSERT INTO #temp_bom
(
ROOT_ITEM_ID,
TOTAL_SEQ,
SEQ,
LEV,
BOM_ID,
BOM_D_ID,
PARENT_ITEM_ID,
ITEM_ID
)
SELECT bd.SOURCE_ID_ROid AS ROOT_ITEM_ID,
'0000' AS TOTAL_SEQ,
(ROW_NUMBER() OVER (PARTITION BY bd.SOURCE_ID_ROid ORDER BY bd.PARENT_ITEM_ID)) AS SEQ,
1 AS LEV,
bd.BOM_ID AS BOM_ID,
bd.BOM_D_ID AS BOM_D_ID,
bd.PARENT_ITEM_ID AS PARENT_ITEM_ID,
bd.SOURCE_ID_ROid AS ITEM_ID
FROM dbo.BOM_D AS bd
INNER JOIN dbo.ITEM AS i
ON i.ITEM_BUSINESS_ID = bd.SOURCE_ID_ROid
WHERE i.ITEM_CODE = @ITEM_CODE
AND bd.SOURCE_ID_RTK = 'ITEM'
AND
(
bd.EXPRITY_DATE = '9998-12-31 00:00:00.0000000'
OR bd.EXPRITY_DATE >= GETDATE()
)
AND
(
bd.EFFECTIVE_DATE = '1900-01-01 00:00:00.0000000'
OR bd.EFFECTIVE_DATE <= GETDATE()
)
ORDER BY bd.SOURCE_ID_ROid,
bd.PARENT_ITEM_ID
UPDATE tb
SET tb.TOTAL_SEQ = tb.TOTAL_SEQ + '.' + RIGHT('1000' + CAST(tb.SEQ AS VARCHAR(4)), 4)
FROM #temp_bom AS tb
WHERE tb.LEV = 1
SELECT @CurrentLevel = 2
WHILE @CurrentLevel <= @Level
BEGIN
INSERT INTO #temp_bom
(
ROOT_ITEM_ID,
TOTAL_SEQ,
SEQ,
LEV,
BOM_ID,
BOM_D_ID,
PARENT_ITEM_ID,
ITEM_ID
)
SELECT tb.ROOT_ITEM_ID,
tb.TOTAL_SEQ,
(ROW_NUMBER() OVER (PARTITION BY tb.ROOT_ITEM_ID,
tb.TOTAL_SEQ
ORDER BY tb.PARENT_ITEM_ID,
bd.PARENT_ITEM_ID
)
),
@CurrentLevel,
b.BOM_ID,
bd.BOM_D_ID,
bd.PARENT_ITEM_ID,
bd.SOURCE_ID_ROid
FROM #temp_bom AS tb
INNER JOIN dbo.BOM_D AS bd
ON bd.SOURCE_ID_ROid = tb.PARENT_ITEM_ID
AND
(
bd.EXPRITY_DATE = '9998-12-31 00:00:00.0000000'
OR bd.EXPRITY_DATE >= GETDATE()
)
AND
(
bd.EFFECTIVE_DATE = '1900-01-01 00:00:00.0000000'
OR bd.EFFECTIVE_DATE <= GETDATE()
)
INNER JOIN dbo.BOM AS b
ON b.BOM_ID = bd.BOM_ID
AND b.Owner_Org_ROid = 'C8BAE02C-0A60-4FD0-46A9-12140D245E5D'
WHERE tb.LEV = @CurrentLevel - 1
IF @@ROWCOUNT = 0
BEGIN
BREAK
END
UPDATE tb
SET tb.TOTAL_SEQ = tb.TOTAL_SEQ + '.' + RIGHT('1000' + CAST(tb.SEQ AS VARCHAR(4)), 4)
FROM #temp_bom AS tb
WHERE tb.LEV = @CurrentLevel
SELECT @CurrentLevel += 1
END
IF @IsBottom = 1
BEGIN
DELETE tb
FROM #temp_bom AS tb
WHERE EXISTS
(
SELECT 1 FROM #temp_bom AS tb2 WHERE tb2.ITEM_ID = tb.PARENT_ITEM_ID
)
END
SELECT --tb.BOM_ID,tb.BOM_D_ID,
--tb.ROOT_ITEM_ID,
i.ITEM_CODE 元件品号,
--i.ITEM_NAME,
tb.TOTAL_SEQ,
tb.SEQ,
tb.LEV,
tb.PARENT_ITEM_ID,
i2.ITEM_CODE 父品号,
--i2.ITEM_NAME,
tb.ITEM_ID,
i3.ITEM_CODE 品号
--i3.ITEM_NAME
FROM #temp_bom AS tb
LEFT JOIN dbo.ITEM AS i
ON i.ITEM_BUSINESS_ID = tb.ROOT_ITEM_ID
LEFT JOIN dbo.ITEM AS i2
ON i2.ITEM_BUSINESS_ID = tb.PARENT_ITEM_ID
LEFT JOIN dbo.ITEM AS i3
ON i3.ITEM_BUSINESS_ID = tb.ITEM_ID
ORDER BY tb.TOTAL_SEQ