轉載請註明出處,聯繫我: [email protected]
本人熱衷於數據庫技術及算法的研究,志同道合之士, 歡迎探討
ALTER PROC [dbo].[proc_BOM_VersionAutoUpgrade]
@company NVARCHAR(20),
@PartMtl NVARCHAR(50) --更改某個半成品後,影響到的其上層的半成品的料號,如果是成品下的,就不用升級
as
WITH r
AS
(
SELECT 0 AS L,* FROM erp.PartMtl pm WHERE pm.PartNum=@PartMtl AND pm.Company=@company
UNION ALL
SELECT L+1 AS L,pm.* FROM r JOIN erp.PartMtl pm ON r.PartNum=pm.MtlPartNum AND r.Company = pm.Company
)
SELECT DISTINCT r.PartNum
INTO #NewVersion_0 --這個臨時表,用來生成每個物料新的版本號
FROM r
left JOIN erp.Part p ON r.Company = p.Company AND r.PartNum = p.PartNum
LEFT JOIN erp.PartClass pc ON p.Company = pc.Company AND p.ClassID = pc.ClassID
WHERE p.ClassID IN ('F','Fx') AND r.Company=@company;;
--AS0-3870RWFPA000-AY
WITH r
AS
(
SELECT 0 AS L,* FROM erp.PartMtl pm WHERE pm.PartNum=@PartMtl AND pm.Company=@company
UNION ALL
SELECT L+1 AS L,pm.* FROM r JOIN erp.PartMtl pm ON r.PartNum=pm.MtlPartNum AND r.Company = pm.Company
)
SELECT DISTINCT r.PartNum,r.RevisionNum
INTO #BOM_PartVersion --新建了版本號,但是沒有新建BOM,用此表來找最新存在BOM的版本號
FROM r
left JOIN erp.Part p ON r.Company = p.Company AND r.PartNum = p.PartNum
LEFT JOIN erp.PartClass pc ON p.Company = pc.Company AND p.ClassID = pc.ClassID
WHERE p.ClassID IN ('F','Fx') AND r.Company=@company;
SELECT ROW_NUMBER() OVER (ORDER BY PartNum) ID, * INTO #NewVersion FROM #NewVersion_0 nv;
ALTER TABLE #NewVersion ADD RevisionNum NVARCHAR(12);
DECLARE @i INT=1,@n INT=0,@n2 INT=0,@PartNum NVARCHAR(50)='';
DECLARE @RevisionNum NVARCHAR(12),@NewRevisionNum NVARCHAR(12);
SELECT @n=COUNT(*) FROM #NewVersion nv;
--SELECT * FROM #NewVersion nv;
WHILE (@i<=@n)
BEGIN
SET @PartNum='';
SELECT @PartNum=nv.PartNum FROM #NewVersion nv WHERE nv.ID=@i;
--先生成新版本號的表,所有此種版本號都以CS開頭(表示報關的版本號)。
set @n2=0;
SELECT @n2=count(*) FROM erp.PartRev pr
WHERE pr.PartNum=@PartNum AND pr.Company=@company AND left(pr.RevisionNum,8)='CS'+CONVERT(varchar(20), GETDATE(), 12);
SET @NewRevisionNum='';
IF @n2=0
BEGIN
SELECT @NewRevisionNum='CS'+CONVERT(varchar(20), GETDATE(), 12)+'001';
UPDATE #NewVersion SET RevisionNum=@NewRevisionNum where ID=@i;
END
ELSE
BEGIN
SELECT @NewRevisionNum='CS'+CONVERT(varchar(20), GETDATE(), 12)
+right('000'+ rtrim(convert(char(3), convert(numeric, RIGHT('001',3)) +1)),3)
FROM erp.PartRev pr
WHERE pr.PartNum=@PartNum AND pr.Company=@company AND pr.RevisionNum LIKE 'CS%';
UPDATE #NewVersion SET RevisionNum=@NewRevisionNum where ID=@i;
END
SET @RevisionNum='';
DECLARE @ProdStandard DEC(18,8)=0;
select @n2=COUNT(*) from tempdb.dbo.sysobjects
where id = object_id(N'tempdb..#NewBOM') AND [type]='U'
IF @n2=0
BEGIN
SELECT @RevisionNum=pr.RevisionNum FROM erp.PartRev pr WHERE pr.Company=@company
AND pr.PartNum=@PartNum
AND pr.EffectiveDate=(SELECT MAX(pr1.EffectiveDate) FROM erp.PartRev pr1
WHERE pr1.Company=@company AND pr1.PartNum=@PartNum AND pr1.PartNum+pr1.RevisionNum
in(SELECT bpv.PartNum+bpv.RevisionNum FROM #BOM_PartVersion bpv));
--找一下BOM裡面最新版本對應的成品裝配的產量ProdStandard
--此處的假設是,新建了成品的BOM版本,就新建了對應版本的BOM結構
SET @n2=0;
SELECT @ProdStandard=min(e.ProdStandard),@n2=COUNT(*) FROM erp.ECOOpr e
WHERE e.PartNum=@PartNum AND e.Company=@company AND e.RevisionNum=@RevisionNum;
IF @n2=0
BEGIN
PRINT @PartNum+','+@RevisionNum+N'沒有此版本的BOM結構';
SET @i=@i+1;
CONTINUE;
END;
--Company Status EPIGroup PartNum partname RevisionNum Level MtlSeq MtlPartNum partname2 RelatedOperation QtyPer
--UOMCode EstScrap EstScrapType FixedQty ViewAsASM PullAsAsm OprSeq OpCode OpDesc ProdStandard
with r
AS
(SELECT 1 AS L,* from Erp.PartMtl pm WHERE pm.PartNum=@PartNum AND pm.RevisionNum=@RevisionNum
--UNION ALL --只更新首層半成品號
--SELECT L+1 AS L,pm.* FROM r JOIN erp.PartMtl pm ON r.Company = pm.Company AND r.MtlPartNum=pm.PartNum
)
SELECT @company Company,@PartNum ECOGroupID,r.PartNum PartNum
,@NewRevisionNum RevisionNum,MtlSeq,MtlPartNum,RelatedOperation
,QtyPer,UOMCode,EstScrap,EstScrapType,FixedQty,ViewAsAsm,PullAsAsm,10 OprSeq,'AS010' OpCode,N'成品裝備' OpDesc
,@ProdStandard ProdStandard INTO #NewBOM FROM r
left JOIN erp.Part p ON r.Company = p.Company AND r.PartNum = p.PartNum
LEFT JOIN erp.Part p1 ON r.Company = p1.Company AND r.MtlPartNum=p1.PartNum;
END
ELSE
BEGIN
SELECT @RevisionNum=pr.RevisionNum FROM erp.PartRev pr WHERE pr.Company=@company
AND pr.PartNum=@PartNum
AND pr.EffectiveDate=(SELECT MAX(pr1.EffectiveDate) FROM erp.PartRev pr1
WHERE pr1.Company=@company AND pr1.PartNum=@PartNum AND pr1.PartNum+pr1.RevisionNum
in(SELECT bpv.PartNum+bpv.RevisionNum FROM #BOM_PartVersion bpv));
--找一下BOM裡面最新版本對應的成品裝配的產量ProdStandard
--此處的假設是,新建了成品的BOM版本,就新建了對應版本的BOM結構
SET @n2=0;
SELECT @ProdStandard=min(e.ProdStandard),@n2=COUNT(*) FROM erp.ECOOpr e
WHERE e.PartNum=@PartNum AND e.Company=@company AND e.RevisionNum=@RevisionNum;
IF @n2=0
BEGIN
PRINT @PartNum+','+@RevisionNum+N'沒有此版本的BOM結構';
SET @i=@i+1;
CONTINUE;
END;
--Company Status EPIGroup PartNum partname RevisionNum Level MtlSeq MtlPartNum partname2 RelatedOperation QtyPer
--UOMCode EstScrap EstScrapType FixedQty ViewAsASM PullAsAsm OprSeq OpCode OpDesc ProdStandard
with r
AS
(SELECT 1 AS L,* from Erp.PartMtl pm WHERE pm.PartNum=@PartNum AND pm.RevisionNum=@RevisionNum
--UNION ALL
--SELECT L+1 AS L,pm.* FROM r JOIN erp.PartMtl pm ON r.Company = pm.Company AND r.MtlPartNum=pm.PartNum
)
INSERT INTO #NewBOM SELECT @company Company,@PartNum ECOGroupID,r.PartNum PartNum
,@NewRevisionNum RevisionNum,MtlSeq,MtlPartNum,RelatedOperation
,QtyPer,UOMCode,EstScrap,EstScrapType,FixedQty,ViewAsAsm,PullAsAsm,10 OprSeq,'AS010' OpCode,N'成品裝備' OpDesc
,@ProdStandard ProdStandard FROM r
left JOIN erp.Part p ON r.Company = p.Company AND r.PartNum = p.PartNum
LEFT JOIN erp.Part p1 ON r.Company = p1.Company AND r.MtlPartNum=p1.PartNum;
END
SET @i=@i+1;
END
--Company PartNum RevisionNum RevShortDesc RevDescription Approved ApprovedDate ApprovedBy EffectiveDate DrawNum AltMethod Plant
--要更新的成品版本
SELECT @company Company,nv.PartNum,RevisionNum,RevisionNum RevShortDesc,RevisionNum RevDescription
,CAST(1 AS BIT) Approved,CONVERT(varchar(20), GETDATE(), 23) ApprovedDate
,'CME0001' ApprovedBy,CONVERT(varchar(20), GETDATE(), 23) EffectiveDate,'' DrawNum,'' AltMethod,'MfgSys' Plant FROM #NewVersion nv;
SELECT nb.Company
,nb.ECOGroupID
,nb.PartNum
,nb.RevisionNum
,nb.OprSeq
,nb.OpCode
,nb.OpDesc
,nb.ProdStandard FROM #NewBOM nb; --MOM
SELECT nb.Company
,nb.ECOGroupID
,nb.PartNum
,nb.RevisionNum
,nb.MtlSeq
,nb.MtlPartNum
,nb.RelatedOperation
,nb.QtyPer
,nb.UOMCode
,nb.EstScrap
,nb.EstScrapType
,nb.FixedQty
,nb.ViewAsAsm
,nb.PullAsAsm
FROM #NewBOM nb; --BOM
DROP TABLE #NewBOM;
DROP TABLE #NewVersion_0;
DROP TABLE #NewVersion;
DROP TABLE #BOM_PartVersion;
GO