備份BOM T-SQL

轉載請註明出處,聯繫我: [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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章