0) -- primo tentativo: cerco il package dato SIA cliente che ITEM BEGIN SELECT TOP 1 @output = CodPackag FROM Package2ItemClient WHERE CodClient = @CodClient AND CodItem = @CodItem ORDER BY TotQta DESC END ELSE -- secondo tentativo: se non lo trovo cerco per SOLO ITEM BEGIN SELECT TOP 1 @output = CodPackag FROM Package2Item WHERE CodItem = @CodItem ORDER BY TotQta DESC END RETURN @output END]]> 0) -- primo tentativo: cerco il package dato SIA cliente che ITEM BEGIN INSERT @Table SELECT TOP 1 CodItem, CodClient , CodPackag, TotQta, Weight, Tare, NumImb, Durata ,'Item-Client-Package', @CodItem + '-' + @CodClient + '-' + CodPackag FROM Package2ItemClient WHERE CodClient = @CodClient AND CodItem = @CodItem ORDER BY TotQta DESC END ELSE IF EXISTS ( SELECT * FROM Package2Item WHERE CodItem = @CodItem ) -- secondo tentativo: se non lo trovo cerco per SOLO ITEM BEGIN INSERT @Table SELECT TOP 1 CodItem, 'ND' AS CodClient , CodPackag, TotQta, Weight, Tare, NumImb, Durata ,'Item-Package', @CodItem + '-' + CodPackag FROM Package2Item WHERE CodItem = @CodItem ORDER BY TotQta DESC END ELSE -- secondo tentativo: se non lo trovo cerco per SOLO ITEM BEGIN INSERT @Table SELECT TOP 1 'ND', 'ND' AS CodClient , CodPackag, TotQta, Weight, Tare, NumImb, Durata ,'Package', CodPackag FROM dbo.Package2 WHERE CodPackag = 0 END RETURN END]]> @separator SET @str_out = @str_in + @separator ; ELSE SET @str_out = @str_in ; -- calcolo il numero di elementi della nella stringa SET @Occurrences = ( (DATALENGTH( REPLACE(@str_out, @separator, @separator+'#')) - DATALENGTH(@str_out)) ) / 2 -- se l'elemento richiesto esiste proseguo altrimenti ritorno NULL IF @Occurrences >= @PosizValue AND @PosizValue <> 0 BEGIN SET @tmpStr = @str_out ; SET @Counter = 1 ; WHILE @Counter <= @PosizValue BEGIN SET @Counter = @Counter + 1 ; SET @str_out = SUBSTRING( @tmpStr, 1, CHARINDEX(@separator,@tmpStr) - 1) ; -- metto via il resto della stringa SET @tmpStr = SUBSTRING( @tmpStr, CHARINDEX(@separator,@tmpStr) + DATALENGTH(@separator)/2, 4000) ; IF DATALENGTH(@tmpStr) = 0 BREAK END -- pulisco da caratteri NON voluti --SET @str_out = REPLACE(@str_out, char(13), '') ; -- carriage return --SET @str_out = REPLACE(@str_out, char(10), '') ; -- line feed --SET @str_out = REPLACE(@str_out, char(9), '') ; -- tab --SET @str_out = LTRIM ( RTRIM (@str_out) ) ; -- blank END ELSE SET @str_out = NULL ; RETURN @str_out END]]> 0) -- primo tentativo: cerco il package dato SIA Cliente che Item che Package BEGIN SELECT TOP 1 @Weight = [Weight], @Tare = Tare FROM Package2ItemClient WHERE CodItem = @CodItem AND CodClient = @CodClient AND CodPackag = @CodPackag ORDER BY TotQta DESC END ELSE -- secondo tentativo: se non lo trovo cerco per SOLO ITEM e package BEGIN SELECT @trovati = COUNT(*) FROM Package2Item WHERE CodItem = @CodItem AND CodPackag = @CodPackag IF(@trovati > 0) BEGIN SELECT TOP 1 @Weight = [Weight], @Tare = Tare FROM Package2Item WHERE CodItem = @CodItem AND CodPackag = @CodPackag ORDER BY TotQta DESC END ELSE BEGIN SELECT @Weight = [Weight], @Tare = Tare FROM Package2 WHERE CodPackag = @CodPackag END END -- faccio ultimi calcoli! SELECT @PackCost = @RMCost / @Weight, @TareStRat = (@RMWeight - @Tare) / @Weight END]]> '' THEN @CodPlantFix ELSE tps.CodPlant END , @HoleNum = tps.HoleNum , @KeyAM = ql.KeyAM , @KeyAMI = ql.KeyAM + '-' + ISNULL(@CodPlant,'0000') , @KeyAMIL = ql.KeyAM + '-' + ISNULL(@CodPlant,'0000') + '-' + CAST(ISNULL(tps.HoleNum,0) AS NVARCHAR(10)) , @ProdTeo = tps.ProdTeo , @ScTec = tps.ScTec , @KgTeo = tps.KgTeo , @NumSMED = tps.NumSMED , @RawMat = ql.RawMat , @BatchQty = ql.BatchQty , @ItemDescr = i.ItemDescr , @CodifProfilo = i.Class01 , @ClasseMerc = i.Class02 , @CodClientAssoc = i.Class03 FROM dbo.QuoteList ql INNER JOIN dbo.TabProdSc tps ON ql.KeyAM = tps.KeyAM INNER JOIN dbo.ItemDet i ON ql.CodItem = i.CodItem WHERE ql.QuoteType = @QuoteType AND ql.CodQuote = @CodQuote AND ql.QuoteRev = @QuoteRev ORDER BY tps.KgTeo DESC -- ================================================================================= -- recupero dall'offerta il valore del PACKAGE/IMBALLO scelto e i dati relativi -- Secondo la logica Client-Item-Package ( vedi funzione ) -- ================================================================================= -- SET @CodPackag = ( SELECT dbo.f_getCodPackag( @CodItem , @CodClient ) ) -- attenzione è una function tabellare SELECT @CodPackag = CodPackag, @PTotQta = TotQta, @PWeight = Weight, @PTare = Tare, @NumImb = NumImb, @PDurata = Durata, @PLiv = LivPackag , @PLivDett = LivPackagDet FROM f_getDataCodPackag ( @CodItem, @CodClient) -- e aggiorno il CodPackage in QuoteRM UPDATE dbo.QuoteRM SET CodPackag = @CodPackag FROM dbo.QuoteRM WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES ( @QuoteType, @CodQuote, @QuoteRev, '01', 'ItemDescr', @ItemDescr ) , ( @QuoteType, @CodQuote, @QuoteRev, '01', 'CodifProfilo', @CodifProfilo ) , ( @QuoteType, @CodQuote, @QuoteRev, '01', 'ClasseMerc', @ClasseMerc ) , ( @QuoteType, @CodQuote, @QuoteRev, '01', 'CodClientAssoc', @CodClientAssoc ) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'ClientNameAssoc', ClientDet.ClientName FROM dbo.ClientDet WHERE ClientDet.CodClient = @CodClientAssoc -- INFORMAZIONI su MATRICE INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'CodDiesGroup', @CodDiesGroup ) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 1) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'TipoDies', @strTemp) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 2) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'DiamDies', @strTemp) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 3) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'HoleNumDies', @strTemp) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'NumDiesInList', COUNT(CodDies) FROM dbo.DiesDet WHERE CodDiesGroup = @CodDiesGroup AND CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'NumDiesExaust', COUNT(CodDies) FROM dbo.DiesDet WHERE CodDiesGroup = @CodDiesGroup AND Active = 0 -- inserisco parametri calcolati x lavorazione estruzione INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES ( @QuoteType, @CodQuote, @QuoteRev, '01', 'CodPlant' , @CodPlant ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'KeyAM' , @KeyAM ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'KeyAMIL' , @KeyAMIL ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'NumSMED' , CONVERT(NVARCHAR(100) , @NumSMED ) ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'KgTeo' , CONVERT(NVARCHAR(100) , @KgTeo ) ) -- inserisco lavorazione estrusione! INSERT INTO #QuoteWorkInt (QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03, NetProd, WSR) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, @KeyAM, @KeyAMIL, @RawMat, @ProdTeo, @ScTec INSERT INTO #QuoteParam (QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KgProdotti', SUM(KgTeo) FROM dbo.QuoteList ql INNER JOIN dbo.TabProdSc tps ON ql.KeyAM = tps.KeyAM WHERE ql.QuoteType = @QuoteType AND ql.CodQuote = @CodQuote AND ql.QuoteRev = @QuoteRev -- inserisco dati mancanti di MSR/CSR (scarto cesoia x estrusione) - DSR è NULLO x estrusione! UPDATE #QuoteWorkInt SET MSR = rmd.CSR FROM #QuoteWorkInt qwi INNER JOIN dbo.RawMatDet rmd ON qwi.Class03 = rmd.RawMat -- calcolo i costi legati alla fase estrusione! UPDATE #QuoteWorkInt SET FC4UG = (cp.FC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , VC4UG = (cp.VC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , OH4UG = (cp.OH * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , SC4UG = cp.SC / ql.BatchQty FROM #QuoteWorkInt qwi INNER JOIN dbo.Cost2Plant cp ON qwi.CodPlant = cp.CodPlant AND qwi.ProcessNum = cp.ProcessNum INNER JOIN dbo.QuoteList ql ON qwi.QuoteType = ql.QuoteType AND qwi.CodQuote = ql.CodQuote AND qwi.QuoteRev = ql.QuoteRev WHERE qwi.ProcessNum = '01' -- inserisco lavorazione incestatura! INSERT INTO #QuoteWorkInt (QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03) SELECT @QuoteType, @CodQuote, @QuoteRev, '02', @CodPlant, @KeyAM, @KeyAMI, @RawMat -- inserisco dati mancanti di DSR x incestatura come 1 - OUT/IN UPDATE #QuoteWorkInt SET DSR = 1 - CAST(td.TotOUT AS DECIMAL(18,6))/CAST(td.TotIN AS DECIMAL(18,6)) FROM #QuoteWorkInt qwi INNER JOIN dbo.TabDifett td ON qwi.Class02 = td.KeyAMI AND qwi.ProcessNum = td.ProcessNum WHERE qwi.ProcessNum = '02' -- solo incestatura -- inserisco lavorazione FORNO! INSERT INTO #QuoteWorkInt(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03) SELECT @QuoteType, @CodQuote, @QuoteRev, '03', @CodPlant, @KeyAM, @KeyAMI, @RawMat -- inserisco lavorazione imballo! INSERT INTO #QuoteWorkInt(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03, Class04, Class05) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, @KeyAM, @KeyAMIL, @RawMat, @CodItem, @KeyAMI UPDATE qwi SET NetProd = CASE @PDurata WHEN 0 THEN 0 ELSE @PTotQta / @PDurata END FROM #QuoteWorkInt AS qwi -- INNER JOIN dbo.TabImbArt ti ON qwi.Class04 = ti.KeyA WHERE qwi.ProcessNum = '04' -- solo imballo -- parametro num imballatori INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'QuotaMan', @NumImb -- parametro Livello search package/imballo INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'LivPackage', @PLiv -- parametro Livello search package/imballo INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'LivPackageDett', @PLivDett -- calcolo i costi legati alla fase di imballo! UPDATE #QuoteWorkInt SET FC4UG = ( ( cp.FC * cp.QuotaPlantStd ) * ( @NumImb / cp.QuotaManStd ) ) / qwi.NetProd , VC4UG = ( ( cp.VC * cp.QuotaPlantStd ) * ( @NumImb / cp.QuotaManStd ) ) / qwi.NetProd , OH4UG = ( ( cp.OH * cp.QuotaPlantStd ) * ( @NumImb / cp.QuotaManStd ) ) / qwi.NetProd , SC4UG = cp.SC / ql.BatchQty FROM #QuoteWorkInt qwi INNER JOIN dbo.Cost2Plant cp ON qwi.CodPlant = cp.CodPlant AND qwi.ProcessNum = cp.ProcessNum INNER JOIN dbo.QuoteList ql ON qwi.QuoteType = ql.QuoteType AND qwi.CodQuote = ql.CodQuote AND qwi.QuoteRev = ql.QuoteRev WHERE qwi.ProcessNum = '04' -- solo imballo -- inserisco dati mancanti di DSR x imballo come 1 - OUT/IN UPDATE #QuoteWorkInt SET DSR = 1 - CAST(td.TotOUT AS DECIMAL(18,6))/CAST(td.TotIN AS DECIMAL(18,6)) FROM #QuoteWorkInt qwi INNER JOIN dbo.TabDifett td ON qwi.Class05 = td.KeyAMI AND qwi.ProcessNum = td.ProcessNum WHERE qwi.ProcessNum = '04' -- solo imballo -- recupero le MAC fase 01 SELECT @MAC_SC = MCR ,@MAC_ST = WCR FROM #QuoteWorkInt WHERE ProcessNum = '01' -- recupero le MAC fase 02 SELECT @MAC_IN = DCR FROM #QuoteWorkInt WHERE ProcessNum = '02' -- recupero le MAC fase 04 SELECT @MAC_IM = DCR FROM #QuoteWorkInt WHERE ProcessNum = '04' -- calcolo percentuale vendita rottame SELECT @SSR = SSR FROM dbo.RawMatDet WHERE RawMat = @RawMat -- NOTA : la transazione posso probabilmente iniziarla qui visto che è il -- primo Update/insert/delete su tabelle non temporanee delete a parte -- update rese RawMat! UPDATE dbo.QuoteRM SET FCR = @MAC_SC * @MAC_ST * @MAC_IN * @MAC_IM WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev AND RawMat = @RawMat -- inserisco i costi delle utilities in QuoteOC -- inserisco altri costi x lavorazione estrusione! GAS ed EE INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, CodUtil, @RawMat, @BatchQty, UnitCost * @BatchQty, 1 FROM dbo.Utilities WHERE CodPlant = @CodPlant /************************************************************* * MATRICE * * calcolo prezzo e durata matrice con procedura a 5 step... * A) media ponderata prezzo ed ExpLife da DiesDet selezionando x CodItem + CodDiesGroup * B) EOLLife x media ponderata su DiesDet dove Active = 0 e vita cmq superiore 5000 KG ( escludendo rotture accidentali ) * C) SE prezzo = 0 --> prendo prezzo da DiesGroupDet selezionando x CodDiesGroup * D) Se EOL = 0 --> prendo ExpLife della singola matrice, se è 0 --> prendo EOLLife da DiesGroupDet selezionando x CodDiesGroup * E) Calcolo Price / Life * *************************************************************/ -- (A) da DiesDet SELECT @DiesPrice = SUM(ISNULL(Price, 0) * ISNULL(ActLife, 1)) / SUM(ISNULL(ActLife, 1)), @DiesExpLife = SUM(ISNULL(ExpLife, 0) * ISNULL(ActLife, 1)) / SUM(ISNULL(ActLife, 1)) FROM dbo.DiesDet WHERE CodItem = @CodItem AND CodDiesGroup = @CodDiesGroup GROUP BY CodItem, CodDiesGroup -- (B) da DiesDet SELECT @DiesEOLife = AVG( ISNULL(ActLife, 0)) FROM dbo.DiesDet WHERE CodItem = @CodItem AND CodDiesGroup = @CodDiesGroup AND Active = 0 -- solo matrici rottamate AND ActLife > 5000 -- solo se hanno Life > 5000 Kg ( non rotture accidentali ) GROUP BY CodItem, CodDiesGroup SET @DiesPrice = ISNULL(@DiesPrice,0) SET @DiesExpLife = ISNULL(@DiesExpLife,0) SET @DiesEOLife = ISNULL(@DiesEOLife,0) -- (C) verifico se prezzo è OK... IF (@DiesPrice = 0) BEGIN -- calcolo da DiesGroupDet SELECT @DiesPrice = ISNULL(Price, 0) FROM dbo.DiesGroupDet WHERE CodDiesGroup = @CodDiesGroup END -- (D) verifico se vita è OK... IF (@DiesEOLife = 0) BEGIN -- uso exp life articolo... SET @DiesEOLife = @DiesExpLife END -- controllo che non sia nulla/vuota la durata... IF (@DiesEOLife = 0) BEGIN SELECT @DiesEOLife = CASE WHEN EOLLife > 0 THEN EOLLife ELSE ExpLife END FROM DiesGroupDet WHERE CodDiesGroup = @CodDiesGroup END -- controllo che non sia nulla/vuota la durata... IF ( @DiesEOLife > 0) BEGIN -- (E) Calcolo price/life! SET @DiesPriceLife = @DiesPrice / @DiesEOLife END ELSE BEGIN SET @DiesPriceLife = 0 -- metto a zero il DiesPriceLife SET @valid = 0 -- indico che valore non è valido ( ND excel ) END -- inserisco costi per Matrice: costo e durata da matrice, se non ci sono da gruppo, (anche solo uno dei due, ovviamente più facile trovare durata x matrice...) INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota, valid) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'MATRICE', @RawMat, @BatchQty, @DiesPriceLife * @BatchQty, 1, @valid -- inserisco parametri calcolati x matrice INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES ( @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesPrice', CONVERT(NVARCHAR(100), @DiesPrice) ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesExpLife', CONVERT(NVARCHAR(100), @DiesExpLife) ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesEOLife', CONVERT(NVARCHAR(100), @DiesEOLife) ) /************************************************************* * VENDITA ROTTAME * * calcolo COSTO DI VENDITA PER LE 2 FASI ESTRUSIONE 01 ED IMBALLO 04 * - calcolo costi variabili fase 01 / 04 * - calcolo costo di vendita x fase 01 / 04 *************************************************************/ SELECT @OCF01 = SUM(ISNULL(C4UG,0)) FROM #QuoteOC SELECT @VCF01 = @OCF01 + VC4UG FROM #QuoteWorkInt WHERE ProcessNum = '01' SELECT @VCF04 = @OCF01 + SUM(VC4UG) FROM #QuoteWorkInt SELECT @SellCostF01 = ((@MAC_ST * @MAC_SC * @MAC_IN) - 1) * (q.RawMatCost + q.RawMatExtraCost - CASE WHEN SSVA > 0 THEN SSVA ELSE q.RawMatCost * SSVR END + @VCF01) -- ((prodotto delle MAC = inverso del prodotto delle rese) - 1) * (costo Al - prezzo rivendita + costi var fase 01) , @RefCostF01 = -- ( (A - B) / 100 - C ) ( -- (A) = (costo pieno di acquisto + costi fase 1) * MAC * 100 (IN CENTESIMI) ((q.RawMatCost + q.RawMatExtraCost + @VCF01) * (@MAC_ST * @MAC_SC * @MAC_IN * 100)) -- (B) = ((MAC * 100) - 100) * Resa di fonderia * (costo pieno acquisto - costo di trasformazione)) - ((@MAC_ST * @MAC_SC * @MAC_IN * 100) - 100) * rmd.ProcYield * (q.RawMatCost + q.RawMatExtraCost + @VCF01 - rmd.ProcCost) ) / 100 -- divido per 100 finale -- (C) = sottraggo costo pieno alluminio - (q.RawMatCost + q.RawMatExtraCost + @VCF01) FROM dbo.RawMatDet rmd INNER JOIN dbo.QuoteRM q ON q.RawMat = rmd.RawMat WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev AND q.RawMat = @RawMat SELECT @SellCostF04 = ((@MAC_IM) - 1) * (q.RawMatCost + q.RawMatExtraCost - CASE WHEN SSVA > 0 THEN SSVA ELSE q.RawMatCost * SSVR END + @VCF01 + @VCF04) -- ((prodotto delle MAC = inverso del prodotto delle rese) - 1) * (costo Al - prezzo rivendita + costi var fase 04) , @RefCostF04 = -- ( (A - B) / 100 - C ) ( -- (A) = (costo pieno di acquisto + costi variabili fase 1 e 4) * MAC * 100 (IN CENTESIMI) ((q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04) * (@MAC_IM * 100)) -- (B) = ((MAC * 100) - 100) * Resa di fonderia * (costo pieno acquisto - costo di trasformazione)) - ((@MAC_IM * 100) - 100) * rmd.ProcYield * (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04 - rmd.ProcCost) ) / 100 -- divido per 100 finale -- (C) = sottraggo costo pieno alluminio - (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04) -- NOTA: usiamo (q.RawMatCost + q.RawMatExtraCost + @VCF01) e non (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @RefCostF01) perché la differenza è minimale, si tratta di 10/20 PPM... FROM dbo.RawMatDet rmd INNER JOIN dbo.QuoteRM q ON q.RawMat = rmd.RawMat WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev AND q.RawMat = @RawMat -- inserisco costi per VENDITA INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) VALUES ( @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'VENDITA', @RawMat, @BatchQty, @SellCostF01 * @BatchQty, @SSR ) -- inserisco costi per ROTTAME ,( @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'ROTTAME', @RawMat, @BatchQty, @RefCostF01 * @BatchQty, 1 - @SSR ) -- inserisco costi per VENDITA ,( @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'VENDITA', @RawMat, @BatchQty, @SellCostF04 * @BatchQty, @SSR ) -- inserisco costi per ROTTAME ,( @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'ROTTAME', @RawMat, @BatchQty, @RefCostF04 * @BatchQty, 1 - @SSR ) -- calcolo Package Cost e RMWeight da tab PackageDet -- EXEC stp_packageCost @CodItem, @CodClient, @CodPackag, @PDesc=@PkgDesc OUTPUT, @RMWeight=@PRMWeight OUTPUT, @Weight=@PWeight OUTPUT, @Tare=@PTare OUTPUT, @PackCost=@PCost OUTPUT, @TareStRat=@PTareStRatio OUTPUT -- stored sostituita perchè la maggior parte dei calcoli li ho già fatti SELECT @PCost = RMCost / @PWeight , @PRMWeight = RMWeight , @PkgDesc = PackagDesc , @PTareStRatio = ( RMWeight - @PTare) / @PWeight FROM dbo.PackagDet WHERE CodPackag = @CodPackag -- inserisco costi per IMBALLO INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'IMBALLO', @RawMat, @BatchQty, @PCost * @BatchQty, 1 -- inserisco parametri calcolati x imballaggio INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES ( @QuoteType, @CodQuote, @QuoteRev, '04', 'PkgDesc', @PkgDesc ) ,( @QuoteType, @CodQuote, @QuoteRev, '04', 'PRMWeight', CONVERT(NVARCHAR(100), @PRMWeight ) ) ,( @QuoteType, @CodQuote, @QuoteRev, '04', 'PWeight', CONVERT(NVARCHAR(100), @PWeight ) ) ,( @QuoteType, @CodQuote, @QuoteRev, '04', 'PTare', CONVERT(NVARCHAR(100), @PTare) ) ,( @QuoteType, @CodQuote, @QuoteRev, '04', 'TareStRatio', CONVERT(NVARCHAR(100), @PTareStRatio ) ) --------------------------------------------- -- inserisco costi per TRASPORTI --------------------------------------------- -- recupero zona da cliente... SELECT @TranspZone = TranspZone FROM dbo.ClientDet WHERE CodClient = @CodClient -- recupero tipo di trasporto SELECT @HasTC = ISNULL(i.HasTC, 0) FROM dbo.QuoteList q INNER JOIN Incoterms i ON q.CodInco = i.CodInco WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev -- recupero costi trasporto SELECT @TranspCost = TranspCost FROM dbo.TranspCostDet WHERE TranspZone = @TranspZone INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'TRASPORTI', @RawMat, @BatchQty, @HasTC * @TranspCost * @BatchQty, 1 --------------------------------------------- -- inserisco costi per PROVVIGIONI --------------------------------------------- SELECT @Provvig = ISNULL(a.QuotaProvvAg, 0) FROM dbo.AgentsDet a INNER JOIN ClientDet c ON a.CodAg = c.CodAg INNER JOIN QuoteList q ON q.CodClient = c.CodClient WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev -- inserisco costi per PROVVIGIONI INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'PROVVIGIONI', @RawMat, @BatchQty, @Provvig * @BatchQty, 1 /* ================================================== CARICO TABELLE EFFETTIVE ==================================================*/ -- carico quote parametri! INSERT dbo.QuoteParam SELECT * FROM #QuoteParam -- carico lavorazioni INTERNE! INSERT dbo.QuoteWorkInt -- ci sono valori calcolati quindi devo selezionare i campi SELECT QuoteType, CodQuote, QuoteRev, NumWI, ProcessNum, CodPlant, Class01, Class02, Class03, Class04, Class05 , NetProd, WSR, MSR, DSR, FC4UG, VC4UG, OH4UG, SC4UG, valid FROM #QuoteWorkInt -- carico OTHERCOSTS INSERT dbo.QuoteOC -- ci sono valori calcolati quindi devo selezionare i campi SELECT QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, Class03, Class04 , Class05, TotQty, TotCost, Quota, valid FROM #QuoteOC COMMIT TRAN; --SELECT * FROM #QuoteParam --SELECT * FROM #QuoteWorkInt --SELECT * FROM #QuoteOC -- elimino temp table... IF OBJECT_ID('tempdb..#QuoteParam') IS NOT NULL DROP TABLE #QuoteParam IF OBJECT_ID('tempdb..#QuoteWorkInt') IS NOT NULL DROP TABLE #QuoteWorkInt IF OBJECT_ID('tempdb..#QuoteOC') IS NOT NULL DROP TABLE #QuoteOC END]]> '' THEN @CodPlantFix ELSE tps.CodPlant END , @HoleNum = tps.HoleNum , @KeyAM = ql.KeyAM , @KeyAMI = ql.KeyAM + '-' + ISNULL(@CodPlant,'0000') , @KeyAMIL = ql.KeyAM + '-' + ISNULL(@CodPlant,'0000') + '-' + CAST(ISNULL(tps.HoleNum,0) AS NVARCHAR(10)) , @ProdTeo = tps.ProdTeo , @ScTec = tps.ScTec , @KgTeo = tps.KgTeo , @NumSMED = tps.NumSMED , @RawMat = ql.RawMat , @BatchQty = ql.BatchQty , @ItemDescr = i.ItemDescr , @CodifProfilo = i.Class01 , @ClasseMerc = i.Class02 , @CodClientAssoc = i.Class03 FROM dbo.QuoteList ql INNER JOIN dbo.TabProdSc tps ON ql.KeyAM = tps.KeyAM INNER JOIN dbo.ItemDet i ON ql.CodItem = i.CodItem WHERE ql.QuoteType = @QuoteType AND ql.CodQuote = @CodQuote AND ql.QuoteRev = @QuoteRev ORDER BY tps.KgTeo DESC -- ================================================================================= -- recupero dall'offerta il valore del PACKAGE/IMBALLO scelto e i dati relativi -- Secondo la logica Client-Item-Package ( vedi funzione ) -- ================================================================================= -- SET @CodPackag = ( SELECT dbo.f_getCodPackag( @CodItem , @CodClient ) ) -- attenzione è una function tabellare SELECT @CodPackag = CodPackag, @PTotQta = TotQta, @PWeight = [Weight], @PTare = Tare, @NumImb = NumImb, @PDurata = Durata, @PLiv = LivPackag , @PLivDett = LivPackagDet FROM f_getDataCodPackag ( @CodItem, @CodClient) -- e aggiorno il CodPackage in QuoteRM UPDATE dbo.QuoteRM SET CodPackag = @CodPackag FROM dbo.QuoteRM WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'ItemDescr', @ItemDescr) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'CodifProfilo', @CodifProfilo --FROM dbo.ItemDet --WHERE CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'ClasseMerc', @ClasseMerc --FROM dbo.ItemDet --WHERE CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'CodClientAssoc', @CodClientAssoc --FROM dbo.ItemDet --WHERE CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'ClientNameAssoc', ClientDet.ClientName FROM dbo.ClientDet WHERE ClientDet.CodClient = @CodClientAssoc --FROM dbo.ItemDet --INNER JOIN dbo.ClientDet ON ItemDet.Class03 = ClientDet.CodClient --WHERE CodItem = @CodItem -- INFORMAZIONI su MATRICE INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'CodDiesGroup', @CodDiesGroup ) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 1) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'TipoDies', @strTemp) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 2) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'DiamDies', @strTemp) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 3) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'HoleNumDies', @strTemp) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'NumDiesInList', COUNT(CodDies) FROM dbo.DiesDet WHERE CodDiesGroup = @CodDiesGroup AND CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'NumDiesExaust', COUNT(CodDies) FROM dbo.DiesDet WHERE CodDiesGroup = @CodDiesGroup AND Active = 0 -- inserisco parametri calcolati x lavorazione estruzione INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES ( @QuoteType, @CodQuote, @QuoteRev, '01', 'CodPlant' , @CodPlant ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'KeyAM' , @KeyAM ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'KeyAMIL' , @KeyAMIL ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'NumSMED' , CONVERT(NVARCHAR(50) , @NumSMED ) ) ,( @QuoteType, @CodQuote, @QuoteRev, '01', 'KgTeo' , CONVERT(NVARCHAR(50) , @KgTeo ) ) --INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) --SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KeyAM', @KeyAM --INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) --SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KeyAMIL', @KeyAMIL --INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) --SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'NumSMED', @NumSMED --INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) --SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KgTeo', @KgTeo -- inserisco lavorazione estrusione! INSERT INTO #QuoteWorkInt (QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03, NetProd, WSR) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, @KeyAM, @KeyAMIL, @RawMat, @ProdTeo, @ScTec INSERT INTO #QuoteParam (QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KgProdotti', SUM(KgTeo) FROM dbo.QuoteList ql INNER JOIN dbo.TabProdSc tps ON ql.KeyAM = tps.KeyAM WHERE ql.QuoteType = @QuoteType AND ql.CodQuote = @CodQuote AND ql.QuoteRev = @QuoteRev -- inserisco dati mancanti di MSR/CSR (scarto cesoia x estrusione) - DSR è NULLO x estrusione! UPDATE #QuoteWorkInt SET MSR = rmd.CSR FROM #QuoteWorkInt qwi INNER JOIN dbo.RawMatDet rmd ON qwi.Class03 = rmd.RawMat -- calcolo i costi legati alla fase estrusione! UPDATE #QuoteWorkInt SET FC4UG = (cp.FC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , VC4UG = (cp.VC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , OH4UG = (cp.OH * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , SC4UG = cp.SC / ql.BatchQty FROM #QuoteWorkInt qwi INNER JOIN dbo.Cost2Plant cp ON qwi.CodPlant = cp.CodPlant AND qwi.ProcessNum = cp.ProcessNum INNER JOIN dbo.QuoteList ql ON qwi.QuoteType = ql.QuoteType AND qwi.CodQuote = ql.CodQuote AND qwi.QuoteRev = ql.QuoteRev WHERE qwi.ProcessNum = '01' -- inserisco lavorazione incestatura! INSERT INTO #QuoteWorkInt (QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03) SELECT @QuoteType, @CodQuote, @QuoteRev, '02', @CodPlant, @KeyAM, @KeyAMI, @RawMat -- inserisco dati mancanti di DSR x incestatura come 1 - OUT/IN UPDATE #QuoteWorkInt SET DSR = 1 - CAST(td.TotOUT AS DECIMAL(18,6))/CAST(td.TotIN AS DECIMAL(18,6)) FROM #QuoteWorkInt qwi INNER JOIN dbo.TabDifett td ON qwi.Class02 = td.KeyAMI AND qwi.ProcessNum = td.ProcessNum WHERE qwi.ProcessNum = '02' -- solo incestatura -- inserisco lavorazione FORNO! INSERT INTO #QuoteWorkInt(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03) SELECT @QuoteType, @CodQuote, @QuoteRev, '03', @CodPlant, @KeyAM, @KeyAMI, @RawMat -- inserisco lavorazione imballo! INSERT INTO #QuoteWorkInt(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03, Class04, Class05) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, @KeyAM, @KeyAMIL, @RawMat, @CodItem, @KeyAMI -- calcolo produttività netta nella fase imballo -- UPDATE qwi -- SET NetProd = CASE ti.Durata WHEN 0 THEN 0 ELSE ti.TotOut / ti.Durata END -- FROM #QuoteWorkInt qwi -- INNER JOIN dbo.TabImbArt ti ON qwi.Class04 = ti.KeyA -- WHERE qwi.ProcessNum = '04' -- solo imballo UPDATE qwi SET NetProd = CASE @PDurata WHEN 0 THEN 0 ELSE @PTotQta / @PDurata END FROM #QuoteWorkInt AS qwi -- INNER JOIN dbo.TabImbArt ti ON qwi.Class04 = ti.KeyA WHERE qwi.ProcessNum = '04' -- solo imballo -- ADESSO LO FACCIO GIA' NELLA FUNZIONE DI RECUPERO DATI PACKAGE f_getDataCodPackag ---- Se Produttività netta ancora = 0 la leggo nella tabella Gruppo Imballo ( Packaging ) --IF ( SELECT NetProd FROM #QuoteWorkInt WHERE ProcessNum = '04' ) = 0 -- BEGIN -- UPDATE qwi -- SET NetProd = CASE ti.Durata WHEN 0 THEN 0 ELSE ti.TotOut / ti.Durata END -- FROM #QuoteWorkInt qwi -- INNER JOIN dbo.TabImbGrp ti ON ti.CodPackag = @CodPackag -- packag generico dell' offerta -- WHERE qwi.ProcessNum = '04' -- solo imballo -- END -- salvo numero imballatori --SELECT @NumImb = ISNULL(NumImb,0) --FROM dbo.TabImbArt --WHERE KeyA = @CodItem -- parametro num imballatori INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'QuotaMan', @NumImb -- parametro Livello search package/imballo INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'LivPackage', @PLiv -- parametro Livello search package/imballo INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'LivPackageDett', @PLivDett -- calcolo i costi legati alla fase di imballo! UPDATE #QuoteWorkInt SET FC4UG = ( ( cp.FC * cp.QuotaPlantStd ) * ( @NumImb / cp.QuotaManStd ) ) / qwi.NetProd , VC4UG = ( ( cp.VC * cp.QuotaPlantStd ) * ( @NumImb / cp.QuotaManStd ) ) / qwi.NetProd , OH4UG = ( ( cp.OH * cp.QuotaPlantStd ) * ( @NumImb / cp.QuotaManStd ) ) / qwi.NetProd , SC4UG = cp.SC / ql.BatchQty FROM #QuoteWorkInt qwi INNER JOIN dbo.Cost2Plant cp ON qwi.CodPlant = cp.CodPlant AND qwi.ProcessNum = cp.ProcessNum INNER JOIN dbo.QuoteList ql ON qwi.QuoteType = ql.QuoteType AND qwi.CodQuote = ql.CodQuote AND qwi.QuoteRev = ql.QuoteRev WHERE qwi.ProcessNum = '04' -- solo imballo -- inserisco dati mancanti di DSR x imballo come 1 - OUT/IN UPDATE qwi SET DSR = 1 - CAST(td.TotOUT AS DECIMAL(18,6))/CAST(td.TotIN AS DECIMAL(18,6)) FROM #QuoteWorkInt qwi INNER JOIN dbo.TabDifett td ON qwi.Class05 = td.KeyAMI AND qwi.ProcessNum = td.ProcessNum WHERE qwi.ProcessNum = '04' -- solo imballo -- recupero le MAC fase 01 SELECT @MAC_SC = MCR ,@MAC_ST = WCR FROM #QuoteWorkInt WHERE ProcessNum = '01' -- recupero le MAC fase 02 SELECT @MAC_IN = DCR FROM #QuoteWorkInt WHERE ProcessNum = '02' -- recupero le MAC fase 04 SELECT @MAC_IM = DCR FROM #QuoteWorkInt WHERE ProcessNum = '04' -- calcolo percentuale vendita rottame SELECT @SSR = SSR FROM dbo.RawMatDet WHERE RawMat = @RawMat -- NOTA : la transazione posso probabilmente iniziarla qui visto che è il -- primo Update/insert/delete su tabelle non temporanee -- update rese RawMat! UPDATE dbo.QuoteRM SET FCR = @MAC_SC * @MAC_ST * @MAC_IN * @MAC_IM WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev AND RawMat = @RawMat -- inserisco i costi delle utilities in QuoteOC -- inserisco altri costi x lavorazione estrusione! GAS ed EE INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, CodUtil, @RawMat, @BatchQty, UnitCost * @BatchQty, 1 FROM dbo.Utilities WHERE CodPlant = @CodPlant /************************************************************* * MATRICE * * calcolo prezzo e durata matrice con procedura a 5 step... * A) media ponderata prezzo ed ExpLife da DiesDet selezionando x CodItem + CodDiesGroup * B) EOLLife x media ponderata su DiesDet dove Active = 0 e vita cmq superiore 5000 KG ( escludendo rotture accidentali ) * C) SE prezzo = 0 --> prendo prezzo da DiesGroupDet selezionando x CodDiesGroup * D) Se EOL = 0 --> prendo ExpLife della singola matrice, se è 0 --> prendo EOLLife da DiesGroupDet selezionando x CodDiesGroup * E) Calcolo Price / Life * *************************************************************/ -- (A) da DiesDet SELECT @DiesPrice = SUM(ISNULL(Price, 0) * ISNULL(ActLife, 1)) / SUM(ISNULL(ActLife, 1)), @DiesExpLife = SUM(ISNULL(ExpLife, 0) * ISNULL(ActLife, 1)) / SUM(ISNULL(ActLife, 1)) FROM dbo.DiesDet WHERE CodItem = @CodItem AND CodDiesGroup = @CodDiesGroup GROUP BY CodItem, CodDiesGroup -- (B) da DiesDet SELECT @DiesEOLife = AVG(ISNULL(ActLife, 0)) FROM dbo.DiesDet WHERE CodItem = @CodItem AND CodDiesGroup = @CodDiesGroup AND Active = 0 -- solo matrici rottamate AND ActLife > 5000 -- solo se hanno Life > 5000 Kg ( non rotture accidentali ) GROUP BY CodItem, CodDiesGroup SET @DiesPrice = ISNULL(@DiesPrice,0) SET @DiesExpLife = ISNULL(@DiesExpLife,0) SET @DiesEOLife = ISNULL(@DiesEOLife,0) -- (C) verifico se prezzo è OK... IF (@DiesPrice = 0) BEGIN -- calcolo da DiesGroupDet SELECT @DiesPrice = ISNULL(Price, 0) FROM dbo.DiesGroupDet WHERE CodDiesGroup = @CodDiesGroup END -- (D) verifico se vita è OK... IF (@DiesEOLife = 0) BEGIN -- uso exp life articolo... SET @DiesEOLife = @DiesExpLife END -- controllo che non sia nulla/vuota la durata... IF (@DiesEOLife = 0) BEGIN SELECT @DiesEOLife = CASE WHEN EOLLife > 0 THEN EOLLife ELSE ExpLife END FROM DiesGroupDet WHERE CodDiesGroup = @CodDiesGroup END -- controllo che non sia nulla/vuota la durata... IF ( @DiesEOLife = 0) BEGIN SET @DiesEOLife = 1 -- metto 1 kg che è sbagliato e mi fa esplodere prezzo matrice ma non blocca calcoli END -- (E) Calcolo price/life! SET @DiesPriceLife = @DiesPrice / @DiesEOLife -- (D) verifico se vita è OK... IF (@DiesPriceLife = 0) BEGIN SET @DiesPriceLife = 1 SET @valid = 0 END -- inserisco costi per Matrice: costo e durata da matrice, se non ci sono da gruppo, (anche solo uno dei due, ovviamente più facile trovare durata x matrice...) INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota, valid) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'MATRICE', @RawMat, @BatchQty, @DiesPriceLife * @BatchQty, 1, @valid -- inserisco parametri calcolati x matrice INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesPrice', @DiesPrice INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesExpLife', @DiesExpLife INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesEOLife', @DiesEOLife /************************************************************* * VENDITA ROTTAME * * calcolo COSTO DI VENDITA PER LE 2 FASI ESTRUSIONE 01 ED IMBALLO 04 * - calcolo costi variabili fase 01 / 04 * - calcolo costo di vendita x fase 01 / 04 *************************************************************/ SELECT @OCF01 = SUM(ISNULL(C4UG,0)) FROM #QuoteOC SELECT @VCF01 = @OCF01 + VC4UG FROM #QuoteWorkInt WHERE ProcessNum = '01' SELECT @VCF04 = @OCF01 + SUM(VC4UG) FROM #QuoteWorkInt SELECT @SellCostF01 = ((@MAC_ST * @MAC_SC * @MAC_IN) - 1) * (q.RawMatCost + q.RawMatExtraCost - CASE WHEN SSVA > 0 THEN SSVA ELSE q.RawMatCost * SSVR END + @VCF01) -- ((prodotto delle MAC = inverso del prodotto delle rese) - 1) * (costo Al - prezzo rivendita + costi var fase 01) , @RefCostF01 = -- ( (A - B) / 100 - C ) ( -- (A) = (costo pieno di acquisto + costi fase 1) * MAC * 100 (IN CENTESIMI) ((q.RawMatCost + q.RawMatExtraCost + @VCF01) * (@MAC_ST * @MAC_SC * @MAC_IN * 100)) -- (B) = ((MAC * 100) - 100) * Resa di fonderia * (costo pieno acquisto - costo di trasformazione)) - ((@MAC_ST * @MAC_SC * @MAC_IN * 100) - 100) * rmd.ProcYield * (q.RawMatCost + q.RawMatExtraCost + @VCF01 - rmd.ProcCost) ) / 100 -- divido per 100 finale -- (C) = sottraggo costo pieno alluminio - (q.RawMatCost + q.RawMatExtraCost + @VCF01) FROM dbo.RawMatDet rmd INNER JOIN dbo.QuoteRM q ON q.RawMat = rmd.RawMat WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev AND q.RawMat = @RawMat SELECT @SellCostF04 = ((@MAC_IM) - 1) * (q.RawMatCost + q.RawMatExtraCost - CASE WHEN SSVA > 0 THEN SSVA ELSE q.RawMatCost * SSVR END + @VCF01 + @VCF04) -- ((prodotto delle MAC = inverso del prodotto delle rese) - 1) * (costo Al - prezzo rivendita + costi var fase 04) , @RefCostF04 = -- ( (A - B) / 100 - C ) ( -- (A) = (costo pieno di acquisto + costi variabili fase 1 e 4) * MAC * 100 (IN CENTESIMI) ((q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04) * (@MAC_IM * 100)) -- (B) = ((MAC * 100) - 100) * Resa di fonderia * (costo pieno acquisto - costo di trasformazione)) - ((@MAC_IM * 100) - 100) * rmd.ProcYield * (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04 - rmd.ProcCost) ) / 100 -- divido per 100 finale -- (C) = sottraggo costo pieno alluminio - (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04) -- NOTA: usiamo (q.RawMatCost + q.RawMatExtraCost + @VCF01) e non (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @RefCostF01) perché la differenza è minimale, si tratta di 10/20 PPM... FROM dbo.RawMatDet rmd INNER JOIN dbo.QuoteRM q ON q.RawMat = rmd.RawMat WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev AND q.RawMat = @RawMat -- inserisco costi per VENDITA INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'VENDITA', @RawMat, @BatchQty, @SellCostF01 * @BatchQty, @SSR -- inserisco costi per ROTTAME INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'ROTTAME', @RawMat, @BatchQty, @RefCostF01 * @BatchQty, 1 - @SSR -- inserisco costi per VENDITA INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'VENDITA', @RawMat, @BatchQty, @SellCostF04 * @BatchQty, @SSR -- inserisco costi per ROTTAME INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'ROTTAME', @RawMat, @BatchQty, @RefCostF04 * @BatchQty, 1 - @SSR -- calcolo Package Cost e RMWeight da tab PackageDet -- EXEC stp_packageCost @CodItem, @CodClient, @CodPackag, @PDesc=@PkgDesc OUTPUT, @RMWeight=@PRMWeight OUTPUT, @Weight=@PWeight OUTPUT, @Tare=@PTare OUTPUT, @PackCost=@PCost OUTPUT, @TareStRat=@PTareStRatio OUTPUT -- stored sostituita perchè la maggior parte dei calcoli li ho già fatti SELECT @PCost = RMCost / @PWeight , @PRMWeight = RMWeight , @PkgDesc = PackagDesc , @PTareStRatio = ( RMWeight - @PTare) / @PWeight FROM dbo.PackagDet WHERE CodPackag = @CodPackag -- inserisco costi per IMBALLO INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'IMBALLO', @RawMat, @BatchQty, @PCost * @BatchQty, 1 -- inserisco parametri calcolati x imballaggio INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'PkgDesc', @PkgDesc INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'PRMWeight', @PRMWeight INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'PWeight', @PWeight INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'PTare', @PTare INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'TareStRatio', @PTareStRatio --------------------------------------------- -- inserisco costi per TRASPORTI --------------------------------------------- -- recupero zona da cliente... SELECT @TranspZone = TranspZone FROM dbo.ClientDet WHERE CodClient = @CodClient -- recupero tipo di trasporto SELECT @HasTC = ISNULL(i.HasTC, 0) FROM dbo.QuoteList q INNER JOIN Incoterms i ON q.CodInco = i.CodInco WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev -- recupero costi trasporto SELECT @TranspCost = TranspCost FROM dbo.TranspCostDet WHERE TranspZone = @TranspZone INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'TRASPORTI', @RawMat, @BatchQty, @HasTC * @TranspCost * @BatchQty, 1 --------------------------------------------- -- inserisco costi per PROVVIGIONI --------------------------------------------- SELECT @Provvig = ISNULL(a.QuotaProvvAg, 0) FROM dbo.AgentsDet a INNER JOIN ClientDet c ON a.CodAg = c.CodAg INNER JOIN QuoteList q ON q.CodClient = c.CodClient WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev -- inserisco costi per PROVVIGIONI INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'PROVVIGIONI', @RawMat, @BatchQty, @Provvig * @BatchQty, 1 /* ================================================== CARICO TABELLE EFFETTIVE ==================================================*/ -- carico quote parametri! INSERT dbo.QuoteParam SELECT * FROM #QuoteParam -- carico lavorazioni INTERNE! INSERT dbo.QuoteWorkInt -- ci sono valori calcolati quindi devo selezionare i campi SELECT QuoteType, CodQuote, QuoteRev, NumWI, ProcessNum, CodPlant, Class01, Class02, Class03, Class04, Class05 , NetProd, WSR, MSR, DSR, FC4UG, VC4UG, OH4UG, SC4UG, valid FROM #QuoteWorkInt -- carico OTHERCOSTS INSERT dbo.QuoteOC -- ci sono valori calcolati quindi devo selezionare i campi SELECT QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, Class03, Class04 , Class05, TotQty, TotCost, Quota, valid FROM #QuoteOC COMMIT TRAN --SELECT * FROM #QuoteParam --SELECT * FROM #QuoteWorkInt --SELECT * FROM #QuoteOC -- elimino temp table... IF OBJECT_ID('tempdb..#QuoteParam') IS NOT NULL DROP TABLE #QuoteParam IF OBJECT_ID('tempdb..#QuoteWorkInt') IS NOT NULL DROP TABLE #QuoteWorkInt IF OBJECT_ID('tempdb..#QuoteOC') IS NOT NULL DROP TABLE #QuoteOC END]]> '' THEN @CodPlantFix ELSE tps.CodPlant END , @HoleNum = tps.HoleNum , @KeyAM = ql.KeyAM , @KeyAMI = ql.KeyAM + '-' + ISNULL(@CodPlant,'0000') , @KeyAMIL = ql.KeyAM + '-' + ISNULL(@CodPlant,'0000') + '-' + CAST(ISNULL(tps.HoleNum,0) AS NVARCHAR(10)) , @ProdTeo = tps.ProdTeo , @ScTec = tps.ScTec , @KgTeo = tps.KgTeo , @NumSMED = tps.NumSMED , @RawMat = ql.RawMat , @BatchQty = ql.BatchQty , @ItemDescr= i.ItemDescr FROM dbo.QuoteList ql INNER JOIN dbo.TabProdSc tps ON ql.KeyAM = tps.KeyAM INNER JOIN dbo.ItemDet i ON ql.CodItem = i.CodItem WHERE ql.QuoteType = @QuoteType AND ql.CodQuote = @CodQuote AND ql.QuoteRev = @QuoteRev ORDER BY tps.KgTeo DESC -- recupero da dati dell'offerta il valore del package scelto SET @CodPackag = ( SELECT dbo.f_getCodPackag( @CodItem , @CodClient ) ) -- e aggiorno QuoteRM UPDATE dbo.QuoteRM SET CodPackag = @CodPackag FROM dbo.QuoteRM WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'ItemDescr', @ItemDescr) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'CodifProfilo', Class01 FROM dbo.ItemDet WHERE CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'ClasseMerc', Class02 FROM dbo.ItemDet WHERE CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'CodClientAssoc', Class03 FROM dbo.ItemDet WHERE CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'ClientNameAssoc', ClientDet.ClientName FROM dbo.ItemDet INNER JOIN ClientDet ON ItemDet.Class03=ClientDet.CodClient WHERE CodItem = @CodItem -- INFORMAZIONI su MATRICE INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'CodDiesGroup', @CodDiesGroup) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 1) --@strTemp = SUBSTRING(@CodDiesGroup, 0, CHARINDEX('-', @CodDiesGroup)) -- !!!fare con finc Gian INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'TipoDies', @strTemp) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 2) --@strTemp = SUBSTRING(REPLACE(@CodDiesGroup, @strTemp,''), 2, CHARINDEX('-', @CodDiesGroup)) -- !!!fare con finc Gian INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'DiamDies', @strTemp) SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 3) --@strTemp = SUBSTRING(REPLACE(@CodDiesGroup, @strTemp,''), 5, CHARINDEX('-', @CodDiesGroup)) -- !!!fare con finc Gian INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, '01', 'HoleNumDies', @strTemp) INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'NumDiesInList', COUNT(CodDies) FROM dbo.DiesDet WHERE CodDiesGroup = @CodDiesGroup AND CodItem = @CodItem INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'NumDiesExaust', COUNT(CodDies) FROM dbo.DiesDet WHERE CodDiesGroup = @CodDiesGroup AND Active = 0 -- inserisco parametri calcolati x lavorazione estruzione INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'CodPlant', @CodPlant INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KeyAM', @KeyAM INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KeyAMIL', @KeyAMIL INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'NumSMED', @NumSMED INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KgTeo', @KgTeo -- tolto: è duplicato di HoleNumDies --INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) --SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'HoleNum', @HoleNum -- inserisco lavorazione estrusione! INSERT INTO #QuoteWorkInt (QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03, NetProd, WSR) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, @KeyAM, @KeyAMIL, @RawMat, @ProdTeo, @ScTec INSERT INTO #QuoteParam (QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'KgProdotti', SUM(KgTeo) FROM dbo.QuoteList ql INNER JOIN dbo.TabProdSc tps ON ql.KeyAM = tps.KeyAM WHERE ql.QuoteType = @QuoteType AND ql.CodQuote = @CodQuote AND ql.QuoteRev = @QuoteRev --SELECT @cont = @cont + 1 --INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) --SELECT @QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'NumLotti', COUNT(*) --FROM QuoteList ql INNER JOIN TabProdSc tps ON ql.KeyAM = tps.KeyAM --WHERE ql.QuoteType = @QuoteType -- AND ql.CodQuote = @CodQuote -- AND ql.QuoteRev = @QuoteRev -- inserisco dati mancanti di MSR/CSR (scarto cesoia x estrusione) - DSR è NULLO x estrusione! UPDATE qwi SET MSR = rmd.CSR FROM #QuoteWorkInt qwi INNER JOIN dbo.RawMatDet rmd ON qwi.Class03 = rmd.RawMat -- calcolo i costi legati alla fase estrusione! UPDATE qwi SET FC4UG = (cp.FC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , VC4UG = (cp.VC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , OH4UG = (cp.OH * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , SC4UG = cp.SC / ql.BatchQty FROM #QuoteWorkInt qwi INNER JOIN dbo.Cost2Plant cp ON qwi.CodPlant = cp.CodPlant AND qwi.ProcessNum = cp.ProcessNum INNER JOIN dbo.QuoteList ql ON qwi.QuoteType = ql.QuoteType AND qwi.CodQuote = ql.CodQuote AND qwi.QuoteRev = ql.QuoteRev WHERE qwi.ProcessNum = '01' -- inserisco lavorazione incestatura! INSERT INTO #QuoteWorkInt (QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03) SELECT @QuoteType, @CodQuote, @QuoteRev, '02', @CodPlant, @KeyAM, @KeyAMI, @RawMat -- inserisco dati mancanti di DSR x incestatura come 1 - OUT/IN UPDATE qwi SET DSR = 1 - CAST(td.TotOUT AS DECIMAL(18,6))/CAST(td.TotIN AS DECIMAL(18,6)) FROM #QuoteWorkInt qwi INNER JOIN dbo.TabDifett td ON qwi.Class02 = td.KeyAMI AND qwi.ProcessNum = td.ProcessNum WHERE qwi.ProcessNum = '02' -- solo incestatura -- inserisco lavorazione FORNO! INSERT INTO #QuoteWorkInt(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03) SELECT @QuoteType, @CodQuote, @QuoteRev, '03', @CodPlant, @KeyAM, @KeyAMI, @RawMat -- inserisco lavorazione imballo! INSERT INTO #QuoteWorkInt(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, Class03, Class04, Class05) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, @KeyAM, @KeyAMIL, @RawMat, @CodItem, @KeyAMI -- calcolo produttività netta nella fase imballo UPDATE qwi SET NetProd = CASE ti.Durata WHEN 0 THEN 0 ELSE ti.TotOut / ti.Durata END FROM #QuoteWorkInt qwi INNER JOIN dbo.TabImbArt ti ON qwi.Class04 = ti.KeyA WHERE qwi.ProcessNum = '04' -- solo imballo -- Se Produttività netta ancora = 0 la leggo nella tabella Gruppo Imballo ( Packaging ) IF ( SELECT NetProd FROM #QuoteWorkInt WHERE ProcessNum = '04' ) = 0 BEGIN UPDATE qwi SET NetProd = CASE ti.Durata WHEN 0 THEN 0 ELSE ti.TotOut / ti.Durata END FROM #QuoteWorkInt qwi INNER JOIN dbo.TabImbGrp ti ON ti.CodPackag = @CodPackag -- packag generico dell' offerta WHERE qwi.ProcessNum = '04' -- solo imballo END -- salvo numero imballatori SELECT @NumImb = ISNULL(NumImb,0) FROM dbo.TabImbArt WHERE KeyA = @CodItem -- parametro num imballatori INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'QuotaMan', @NumImb -- calcolo i costi legati alla fase di imballo! -- QUI VA FATTO CALCOLO PUNTUALE SU quotaPlant tramite Articolo-Cliente / Articolo / Packaging UPDATE qwi SET FC4UG = (cp.FC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , VC4UG = (cp.VC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , OH4UG = (cp.OH * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , SC4UG = cp.SC / ql.BatchQty FROM #QuoteWorkInt qwi INNER JOIN dbo.Cost2Plant cp ON qwi.CodPlant = cp.CodPlant AND qwi.ProcessNum = cp.ProcessNum INNER JOIN dbo.QuoteList ql ON qwi.QuoteType = ql.QuoteType AND qwi.CodQuote = ql.CodQuote AND qwi.QuoteRev = ql.QuoteRev WHERE qwi.ProcessNum = '04' -- solo imballo -- inserisco dati mancanti di DSR x incestatura come 1 - OUT/IN UPDATE qwi SET DSR = 1 - CAST(td.TotOUT AS DECIMAL(18,6))/CAST(td.TotIN AS DECIMAL(18,6)) FROM #QuoteWorkInt qwi INNER JOIN dbo.TabDifett td ON qwi.Class05 = td.KeyAMI AND qwi.ProcessNum = td.ProcessNum WHERE qwi.ProcessNum = '04' -- solo imballo -- recupero le MAC fase 01 SELECT @MAC_SC = MCR ,@MAC_ST = WCR FROM #QuoteWorkInt WITH (NOLOCK) WHERE ProcessNum = '01' -- recupero le MAC fase 02 SELECT @MAC_IN = DCR FROM #QuoteWorkInt WITH (NOLOCK) WHERE ProcessNum = '02' -- recupero le MAC fase 04 SELECT @MAC_IM = DCR FROM #QuoteWorkInt WITH (NOLOCK) WHERE ProcessNum = '04' -- calcolo percentuale vendita rottame SELECT @SSR = SSR FROM dbo.RawMatDet WHERE RawMat = @RawMat -- NOTA : la transazione posso probabilmente iniziarla qui visto che è il -- primo Update/insert/delete su tabelle non temporanee -- update rese RawMat! UPDATE dbo.QuoteRM SET FCR = @MAC_SC * @MAC_ST * @MAC_IN * @MAC_IM WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev AND RawMat = @RawMat -- inserisco i costi delle utilities in QuoteOC -- inserisco altri costi x lavorazione estrusione! GAS ed EE INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, CodUtil, @RawMat, @BatchQty, UnitCost * @BatchQty, 1 FROM dbo.Utilities WHERE CodPlant = @CodPlant /************************************************************* * MATRICE * * calcolo prezzo e durata matrice con procedura a 5 step... * A) media ponderata prezzo ed ExpLife da DiesDet selezionando x CodItem + CodDiesGroup * B) EOLLife x media ponderata su DiesDet dove Active = 0 * C) SE prezzo = 0 --> prendo prezzo da DiesGroupDet selezionando x CodDiesGroup * D) Se EOL = 0 --> prendo ExpLife della singola matrice, se è 0 --> prendo EOLLife da DiesGroupDet selezionando x CodDiesGroup * E) Calcolo Price / Life * *************************************************************/ -- (A) da DiesDet SELECT @DiesPrice = SUM(ISNULL(Price, 0) * ISNULL(ActLife, 1)) / SUM(ISNULL(ActLife, 1)), @DiesExpLife = SUM(ISNULL(ExpLife, 0) * ISNULL(ActLife, 1)) / SUM(ISNULL(ActLife, 1)) FROM dbo.DiesDet WHERE CodItem = @CodItem AND CodDiesGroup = @CodDiesGroup GROUP BY CodItem, CodDiesGroup -- (B) da DiesDet SELECT @DiesEOLife = AVG(ISNULL(ActLife, 0)) FROM dbo.DiesDet WHERE CodItem = @CodItem AND CodDiesGroup = @CodDiesGroup AND Active = 0 GROUP BY CodItem, CodDiesGroup SET @DiesPrice = ISNULL(@DiesPrice,0) SET @DiesExpLife = ISNULL(@DiesExpLife,0) SET @DiesEOLife = ISNULL(@DiesEOLife,0) -- (C) verifico se prezzo è OK... IF (@DiesPrice = 0) BEGIN -- calcolo da DiesGroupDet SELECT @DiesPrice = ISNULL(Price, 0) FROM DiesGroupDet WHERE CodDiesGroup = @CodDiesGroup END -- (D) verifico se vita è OK... IF (@DiesEOLife = 0) BEGIN -- uso exp life articolo... SET @DiesEOLife = @DiesExpLife END -- controllo che non sia nulla/vuota la durata... IF (@DiesEOLife = 0) BEGIN SELECT @DiesEOLife = CASE WHEN EOLLife > 0 THEN EOLLife ELSE ExpLife END FROM DiesGroupDet WHERE CodDiesGroup = @CodDiesGroup END -- controllo che non sia nulla/vuota la durata... IF (@DiesEOLife = 0) BEGIN SET @DiesEOLife = 1 -- metto 1 kg che è sbagliato e mi fa esplodere prezzo matrice ma non blocca calcoli END -- (E) Calcolo price/life! SET @DiesPriceLife = @DiesPrice / @DiesEOLife -- (D) verifico se vita è OK... IF (@DiesPriceLife = 0) BEGIN SET @DiesPriceLife = 1 SET @valid = 0 END -- inserisco costi per Matrice: costo e durata da matrice, se non ci sono da gruppo, (anche solo uno dei due, ovviamente più facile trovare durata x matrice...) INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota, valid) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'MATRICE', @RawMat, @BatchQty, @DiesPriceLife * @BatchQty, 1, @valid -- inserisco parametri calcolati x matrice INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesPrice', @DiesPrice INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesExpLife', @DiesExpLife INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', 'DiesEOLife', @DiesEOLife /************************************************************* * VENDITA ROTTAME * * calcolo COSTO DI VENDITA PER LE 2 FASI ESTRUSIONE 01 ED IMBALLO 04 * - calcolo costi variabili fase 01 / 04 * - calcolo costo di vendita x fase 01 / 04 *************************************************************/ SELECT @OCF01 = SUM(ISNULL(C4UG,0)) FROM #QuoteOC WITH (NOLOCK) SELECT @VCF01 = @OCF01 + VC4UG FROM #QuoteWorkInt WHERE ProcessNum = '01' SELECT @VCF04 = @OCF01 + SUM(VC4UG) FROM #QuoteWorkInt SELECT @SellCostF01 = ((@MAC_ST * @MAC_SC * @MAC_IN) - 1) * (q.RawMatCost + q.RawMatExtraCost - CASE WHEN SSVA > 0 THEN SSVA ELSE q.RawMatCost * SSVR END + @VCF01) -- ((prodotto delle MAC = inverso del prodotto delle rese) - 1) * (costo Al - prezzo rivendita + costi var fase 01) , @RefCostF01 = -- ( (A - B) / 100 - C ) ( -- (A) = (costo pieno di acquisto + costi fase 1) * MAC * 100 (IN CENTESIMI) ((q.RawMatCost + q.RawMatExtraCost + @VCF01) * (@MAC_ST * @MAC_SC * @MAC_IN * 100)) -- (B) = ((MAC * 100) - 100) * Resa di fonderia * (costo pieno acquisto - costo di trasformazione)) - ((@MAC_ST * @MAC_SC * @MAC_IN * 100) - 100) * rmd.ProcYield * (q.RawMatCost + q.RawMatExtraCost + @VCF01 - rmd.ProcCost) ) / 100 -- divido per 100 finale -- (C) = sottraggo costo pieno alluminio - (q.RawMatCost + q.RawMatExtraCost + @VCF01) FROM dbo.RawMatDet rmd INNER JOIN dbo.QuoteRM q ON q.RawMat = rmd.RawMat WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev AND q.RawMat = @RawMat SELECT @SellCostF04 = ((@MAC_IM) - 1) * (q.RawMatCost + q.RawMatExtraCost - CASE WHEN SSVA > 0 THEN SSVA ELSE q.RawMatCost * SSVR END + @VCF01 + @VCF04) -- ((prodotto delle MAC = inverso del prodotto delle rese) - 1) * (costo Al - prezzo rivendita + costi var fase 04) , @RefCostF04 = -- ( (A - B) / 100 - C ) ( -- (A) = (costo pieno di acquisto + costi variabili fase 1 e 4) * MAC * 100 (IN CENTESIMI) ((q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04) * (@MAC_IM * 100)) -- (B) = ((MAC * 100) - 100) * Resa di fonderia * (costo pieno acquisto - costo di trasformazione)) - ((@MAC_IM * 100) - 100) * rmd.ProcYield * (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04 - rmd.ProcCost) ) / 100 -- divido per 100 finale -- (C) = sottraggo costo pieno alluminio - (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04) -- NOTA: usiamo (q.RawMatCost + q.RawMatExtraCost + @VCF01) e non (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @RefCostF01) perché la differenza è minimale, si tratta di 10/20 PPM... FROM RawMatDet rmd INNER JOIN QuoteRM q ON q.RawMat = rmd.RawMat WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev AND q.RawMat = @RawMat -- inserisco costi per VENDITA INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'VENDITA', @RawMat, @BatchQty, @SellCostF01 * @BatchQty, @SSR -- inserisco costi per ROTTAME INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '01', @CodPlant, 'ROTTAME', @RawMat, @BatchQty, @RefCostF01 * @BatchQty, 1 - @SSR -- inserisco costi per VENDITA INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'VENDITA', @RawMat, @BatchQty, @SellCostF04 * @BatchQty, @SSR -- inserisco costi per ROTTAME INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'ROTTAME', @RawMat, @BatchQty, @RefCostF04 * @BatchQty, 1 - @SSR EXEC stp_packageCost @CodItem, @CodClient, @CodPackag, @PDesc=@PkgDesc OUTPUT, @RMWeight=@PRMWeight OUTPUT, @Weight=@PWeight OUTPUT, @Tare=@PTare OUTPUT, @PackCost=@PCost OUTPUT, @TareStRat=@PTareStRatio OUTPUT -- inserisco costi per IMBALLO INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'IMBALLO', @RawMat, @BatchQty, @PCost * @BatchQty, 1 -- inserisco parametri calcolati x imballaggio INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'PkgDesc', @PkgDesc INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'PRMWeight', @PRMWeight INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'PWeight', @PWeight INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'PTare', @PTare INSERT INTO #QuoteParam(QuoteType, CodQuote, QuoteRev, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', 'TareStRatio', @PTareStRatio --------------------------------------------- -- inserisco costi per TRASPORTI --------------------------------------------- -- recupero zona da cliente... SELECT @TranspZone = TranspZone FROM dbo.ClientDet WHERE CodClient = @CodClient -- recupero tipo di trasporto SELECT @HasTC = ISNULL(i.HasTC, 0) FROM dbo.QuoteList q INNER JOIN Incoterms i ON q.CodInco = i.CodInco WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev -- recupero costi trasporto SELECT @TranspCost = TranspCost FROM dbo.TranspCostDet WHERE TranspZone = @TranspZone INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'TRASPORTI', @RawMat, @BatchQty, @HasTC * @TranspCost * @BatchQty, 1 --------------------------------------------- -- inserisco costi per PROVVIGIONI --------------------------------------------- SELECT @Provvig = ISNULL(a.QuotaProvvAg, 0) FROM dbo.AgentsDet a INNER JOIN ClientDet c ON a.CodAg = c.CodAg INNER JOIN QuoteList q ON q.CodClient = c.CodClient WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev -- inserisco costi per PROVVIGIONI INSERT INTO #QuoteOC(QuoteType, CodQuote, QuoteRev, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, '04', @CodPlant, 'PROVVIGIONI', @RawMat, @BatchQty, @Provvig * @BatchQty, 1 /* ================================================== CANCELLO E CARICO TABELLE EFFETTIVE ==================================================*/ -- elimino e carico parametri! DELETE FROM dbo.QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT dbo.QuoteParam SELECT * FROM #QuoteParam WITH (NOLOCK) -- elimino e carico lavorazioni interne! DELETE FROM dbo.QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT dbo.QuoteWorkInt -- ci sono valori calcolati quindi devo selezionare i campi SELECT QuoteType, CodQuote, QuoteRev, NumWI, ProcessNum, CodPlant, Class01, Class02, Class03, Class04, Class05 , NetProd, WSR, MSR, DSR, FC4UG, VC4UG, OH4UG, SC4UG, valid FROM #QuoteWorkInt WITH (NOLOCK) -- elimino e carico OtherCosts DELETE FROM dbo.QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT dbo.QuoteOC -- ci sono valori calcolati quindi devo selezionare i campi SELECT QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, Class03, Class04 , Class05, TotQty, TotCost, Quota, valid FROM #QuoteOC WITH (NOLOCK) COMMIT TRAN --SELECT * FROM #QuoteParam --SELECT * FROM #QuoteWorkInt --SELECT * FROM #QuoteOC -- elimino temp table... IF OBJECT_ID('tempdb..#QuoteParam') IS NOT NULL DROP TABLE #QuoteParam IF OBJECT_ID('tempdb..#QuoteWorkInt') IS NOT NULL DROP TABLE #QuoteWorkInt IF OBJECT_ID('tempdb..#QuoteOC') IS NOT NULL DROP TABLE #QuoteOC END]]> '' THEN @CodPlantFix ELSE tps.CodPlant END , @HoleNum = tps.HoleNum , @KeyAM = ql.KeyAM , @KeyAMI = ql.KeyAM + '-' + ISNULL(@CodPlant,'0000') , @KeyAMIL = ql.KeyAM + '-' + ISNULL(@CodPlant,'0000') + '-' + CAST(ISNULL(tps.HoleNum,0) AS NVARCHAR(10)) , @ProdTeo = tps.ProdTeo , @ScTec = tps.ScTec , @KgTeo = tps.KgTeo , @NumSMED = tps.NumSMED , @RawMat = ql.RawMat , @BatchQty = ql.BatchQty , @ItemDescr= i.ItemDescr FROM dbo.QuoteList ql INNER JOIN dbo.TabProdSc tps ON ql.KeyAM = tps.KeyAM INNER JOIN dbo.ItemDet i ON ql.CodItem = i.CodItem WHERE ql.QuoteType = @QuoteType AND ql.CodQuote = @CodQuote AND ql.QuoteRev = @QuoteRev ORDER BY tps.KgTeo DESC -- inserisco note sull'articolo SELECT @cont = ISNULL(MAX(NumP),0) + 1 FROM dbo.QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO dbo.QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'ItemDescr', @ItemDescr) SELECT @cont = @cont + 1 INSERT INTO dbo.QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'CodifProfilo', Class01 FROM dbo.ItemDet WHERE CodItem = @CodItem SELECT @cont = @cont + 1 INSERT INTO dbo.QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'ClasseMerc', Class02 FROM dbo.ItemDet WHERE CodItem = @CodItem SELECT @cont = @cont + 1 INSERT INTO dbo.QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'ClienteAssoc', Class03 FROM dbo.ItemDet WHERE CodItem = @CodItem -- INFORMAZIONI su MATRICE SELECT @cont = @cont + 1 INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'CodDiesGroup', @CodDiesGroup) SELECT @cont = @cont + 1 SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 1) --@strTemp = SUBSTRING(@CodDiesGroup, 0, CHARINDEX('-', @CodDiesGroup)) -- !!!fare con finc Gian INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'TipoDies', @strTemp) SELECT @cont = @cont + 1 SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 2) --@strTemp = SUBSTRING(REPLACE(@CodDiesGroup, @strTemp,''), 2, CHARINDEX('-', @CodDiesGroup)) -- !!!fare con finc Gian INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'DiamDies', @strTemp) SELECT @cont = @cont + 1 SET @strTemp = dbo.f_getSubstring(@CodDiesGroup, '-', 3) --@strTemp = SUBSTRING(REPLACE(@CodDiesGroup, @strTemp,''), 5, CHARINDEX('-', @CodDiesGroup)) -- !!!fare con finc Gian INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) VALUES (@QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'HoleNumDies', @strTemp) SELECT @cont = @cont + 1 INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'NumDiesInList', COUNT(CodDies) FROM dbo.DiesDet WHERE CodDiesGroup = @CodDiesGroup AND CodItem = @CodItem SELECT @cont = @cont + 1 INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'NumDiesExaust', COUNT(CodDies) FROM dbo.DiesDet WHERE CodDiesGroup = @CodDiesGroup AND Active = 0 -- inserisco lavorazione estrusione! INSERT INTO dbo.QuoteWorkInt(QuoteType, CodQuote, QuoteRev, NumWI, ProcessNum, CodPlant, Class01, Class02, Class03, NetProd, WSR) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumWI),0) + 1, '01', @CodPlant, @KeyAM, @KeyAMIL, @RawMat, @ProdTeo, @ScTec FROM QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- inserisco parametri calcolati x lavorazione estruzione INSERT INTO dbo.QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'CodPlant', @CodPlant FROM dbo.QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'KeyAM', @KeyAM FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'KeyAMIL', @KeyAMIL FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'NumCambi', @NumSMED FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'KgTeo', @KgTeo FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'HoleNum', @HoleNum FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev SELECT @cont = ISNULL(MAX(NumP),0) + 1 FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'KgProdotti', SUM(KgTeo) FROM QuoteList ql INNER JOIN TabProdSc tps ON ql.KeyAM = tps.KeyAM WHERE ql.QuoteType = @QuoteType AND ql.CodQuote = @CodQuote AND ql.QuoteRev = @QuoteRev --SELECT @cont = @cont + 1 --INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) --SELECT @QuoteType, @CodQuote, @QuoteRev, @cont, '01', 'NumLotti', COUNT(*) --FROM QuoteList ql INNER JOIN TabProdSc tps ON ql.KeyAM = tps.KeyAM --WHERE ql.QuoteType = @QuoteType -- AND ql.CodQuote = @CodQuote -- AND ql.QuoteRev = @QuoteRev -- inserisco dati mancanti di MSR/CSR (scarto cesoia x estrusione) - DSR è NULLO x estrusione! UPDATE qwi SET MSR = rmd.CSR FROM dbo.QuoteWorkInt qwi INNER JOIN RawMatDet rmd ON qwi.Class03 = rmd.RawMat WHERE qwi.QuoteType = @QuoteType AND qwi.CodQuote = @CodQuote AND qwi.QuoteRev = @QuoteRev -- calcolo i costi legati alla fase estrusione! UPDATE qwi SET FC4UG = (cp.FC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , VC4UG = (cp.VC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , OH4UG = (cp.OH * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , SC4UG = cp.SC / ql.BatchQty FROM dbo.QuoteWorkInt qwi INNER JOIN Cost2Plant cp ON qwi.CodPlant = cp.CodPlant AND qwi.ProcessNum = cp.ProcessNum INNER JOIN QuoteList ql ON qwi.QuoteType = ql.QuoteType AND qwi.CodQuote = ql.CodQuote AND qwi.QuoteRev = ql.QuoteRev WHERE qwi.QuoteType = @QuoteType AND qwi.CodQuote = @CodQuote AND qwi.QuoteRev = @QuoteRev -- inserisco lavorazione incestatura! INSERT INTO QuoteWorkInt(QuoteType, CodQuote, QuoteRev, NumWI, ProcessNum, CodPlant, Class01, Class02, Class03) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumWI),0) + 1, '02', @CodPlant, @KeyAM, @KeyAMI, @RawMat FROM dbo.QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- inserisco dati mancanti di DSR x incestatura come 1 - OUT/IN UPDATE qwi SET DSR = 1 - CAST(td.TotOUT AS DECIMAL(18,6))/CAST(td.TotIN AS DECIMAL(18,6)) FROM dbo.QuoteWorkInt qwi INNER JOIN dbo.TabDifett td ON qwi.Class02 = td.KeyAMI AND qwi.ProcessNum = td.ProcessNum WHERE qwi.ProcessNum = '02' -- solo incestatura -- inserisco lavorazione FORNO! INSERT INTO dbo.QuoteWorkInt(QuoteType, CodQuote, QuoteRev, NumWI, ProcessNum, CodPlant, Class01, Class02, Class03) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumWI),0) + 1, '03', @CodPlant, @KeyAM, @KeyAMI, @RawMat FROM dbo.QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- inserisco lavorazione imballo! INSERT INTO dbo.QuoteWorkInt(QuoteType, CodQuote, QuoteRev, NumWI, ProcessNum, CodPlant, Class01, Class02, Class03, Class04, Class05) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumWI),0) + 1, '04', @CodPlant, @KeyAM, @KeyAMIL, @RawMat, @CodItem, @KeyAMI FROM dbo.QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- calcolo produttività netta nella fase imballo UPDATE qwi SET NetProd = ti.TotOut/ ti.Durata FROM dbo.QuoteWorkInt qwi INNER JOIN TabImbArt ti ON qwi.Class04 = ti.KeyA -- salvo numero imballatori SELECT @NumImb = ISNULL(NumImb,0) FROM TabImbArt WHERE KeyA = @CodItem -- parametro num imballatori INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '04', 'NumImballatori', @NumImb FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- calcolo i costi legati alla fase di imballo! UPDATE qwi SET FC4UG = (cp.FC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , VC4UG = (cp.VC * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , OH4UG = (cp.OH * cp.QuotaPlantStd / cp.QuotaManStd) / qwi.NetProd , SC4UG = cp.SC / ql.BatchQty FROM dbo.QuoteWorkInt qwi INNER JOIN Cost2Plant cp ON qwi.CodPlant = cp.CodPlant AND qwi.ProcessNum = cp.ProcessNum INNER JOIN QuoteList ql ON qwi.QuoteType = ql.QuoteType AND qwi.CodQuote = ql.CodQuote AND qwi.QuoteRev = ql.QuoteRev WHERE qwi.ProcessNum = '04' -- solo imballo -- inserisco dati mancanti di DSR x incestatura come 1 - OUT/IN UPDATE qwi SET DSR = 1 - CAST(td.TotOUT AS DECIMAL(18,6))/CAST(td.TotIN AS DECIMAL(18,6)) FROM dbo.QuoteWorkInt qwi INNER JOIN TabDifett td ON qwi.Class05 = td.KeyAMI AND qwi.ProcessNum = td.ProcessNum WHERE qwi.ProcessNum = '04' -- solo imballo -- recupero le MAC fase 01 SELECT @MAC_SC = MCR ,@MAC_ST = WCR FROM dbo.QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev AND ProcessNum = '01' -- recupero le MAC fase 02 SELECT @MAC_IN = DCR FROM dbo.QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev AND ProcessNum = '02' -- recupero le MAC fase 04 SELECT @MAC_IM = DCR FROM dbo.QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev AND ProcessNum = '04' -- calcolo percentuale vendita rottame SELECT @SSR = SSR FROM dbo.RawMatDet WHERE RawMat = @RawMat -- update rese RawMat! UPDATE dbo.QuoteRM SET FCR = @MAC_SC * @MAC_ST * @MAC_IN * @MAC_IM WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev AND RawMat = @RawMat -- inserisco i costi delle utilities in QuoteOC -- inserisco altri costi x lavorazione estrusione! GAS ed EE INSERT INTO dbo.QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, ROW_NUMBER() OVER(ORDER BY CodUtil ASC) AS Row, '01', @CodPlant, CodUtil, @RawMat, @BatchQty, UnitCost * @BatchQty, 1 FROM dbo.Utilities WHERE CodPlant = @CodPlant /************************************************************* * MATRICE * * calcolo prezzo e durata matrice con procedura a 5 step... * A) media ponderata prezzo ed ExpLife da DiesDet selezionando x CodItem + CodDiesGroup * B) EOLLife x media ponderata su DiesDet dove Active = 0 * C) SE prezzo = 0 --> prendo prezzo da DiesGroupDet selezionando x CodDiesGroup * D) Se EOL = 0 --> prendo ExpLife della singola matrice, se è 0 --> prendo EOLLife da DiesGroupDet selezionando x CodDiesGroup * E) Calcolo Price / Life * *************************************************************/ -- (A) da DiesDet SELECT @DiesPrice = SUM(ISNULL(Price, 0) * ISNULL(ActLife, 1)) / SUM(ISNULL(ActLife, 1)), @DiesExpLife = SUM(ISNULL(ExpLife, 0) * ISNULL(ActLife, 1)) / SUM(ISNULL(ActLife, 1)) FROM dbo.DiesDet WHERE CodItem = @CodItem AND CodDiesGroup = @CodDiesGroup GROUP BY CodItem, CodDiesGroup -- (B) da DiesDet SELECT @DiesEOLife = AVG(ISNULL(ActLife, 0)) FROM dbo.DiesDet WHERE CodItem = @CodItem AND CodDiesGroup = @CodDiesGroup AND Active = 0 GROUP BY CodItem, CodDiesGroup SET @DiesPrice = ISNULL(@DiesPrice,0) SET @DiesExpLife = ISNULL(@DiesExpLife,0) SET @DiesEOLife = ISNULL(@DiesEOLife,0) -- (C) verifico se prezzo è OK... IF (@DiesPrice = 0) BEGIN -- calcolo da DiesGroupDet SELECT @DiesPrice = ISNULL(Price, 0) FROM DiesGroupDet WHERE CodDiesGroup = @CodDiesGroup END -- (D) verifico se vita è OK... IF (@DiesEOLife = 0) BEGIN -- uso exp life articolo... SET @DiesEOLife = @DiesExpLife END -- controllo che non sia nulla/vuota la durata... IF (@DiesEOLife = 0) BEGIN SELECT @DiesEOLife = CASE WHEN EOLLife > 0 THEN EOLLife ELSE ExpLife END FROM DiesGroupDet WHERE CodDiesGroup = @CodDiesGroup END -- controllo che non sia nulla/vuota la durata... IF (@DiesEOLife = 0) BEGIN SELECT @DiesEOLife = 1 -- metto 1 kg che è sbagliato e mi fa esplodere prezzo matrice ma non blocca calcoli END -- (E) Calcolo price/life! SET @DiesPriceLife = @DiesPrice / @DiesEOLife -- (D) verifico se vita è OK... IF (@DiesPriceLife = 0) BEGIN SET @DiesPriceLife = 1 SET @valid = 0 END -- inserisco costi per Matrice: costo e durata da matrice, se non ci sono da gruppo, (anche solo uno dei due, ovviamente più facile trovare durata x matrice...) INSERT INTO QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota, valid) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumEx),0) + 1, '01', @CodPlant, 'MATRICE', @RawMat, @BatchQty, @DiesPriceLife * @BatchQty, 1, @valid FROM QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- inserisco parametri calcolati x matrice INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'DiesPrice', @DiesPrice FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'DiesExpLife', @DiesExpLife FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '01', 'DiesEOLife', @DiesEOLife FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev /************************************************************* * VENDITA ROTTAME * * calcolo COSTO DI VENDITA PER LE 2 FASI ESTRUSIONE 01 ED IMBALLO 04 * - calcolo costi variabili fase 01 / 04 * - calcolo costo di vendita x fase 01 / 04 *************************************************************/ SELECT @OCF01 = SUM(ISNULL(C4UG,0)) FROM QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev SELECT @VCF01 = @OCF01 + VC4UG FROM QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev AND ProcessNum = '01' SELECT @VCF04 = @OCF01 + SUM(VC4UG) FROM dbo.QuoteWorkInt WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev SELECT @SellCostF01 = ((@MAC_ST * @MAC_SC * @MAC_IN) - 1) * (q.RawMatCost - CASE WHEN SSVA > 0 THEN SSVA ELSE q.RawMatCost * SSVR END + @VCF01) -- ((prodotto delle MAC = inverso del prodotto delle rese) - 1) * (costo Al - prezzo rivendita + costi var fase 01) , @RefCostF01 = -- ( (A - B) / 100 - C ) ( -- (A) = (costo pieno di acquisto + costi fase 1) * MAC * 100 (IN CENTESIMI) ((q.RawMatCost + q.RawMatExtraCost + @VCF01) * (@MAC_ST * @MAC_SC * @MAC_IN * 100)) -- (B) = ((MAC * 100) - 100) * Resa di fonderia * (costo pieno acquisto - costo di trasformazione)) - ((@MAC_ST * @MAC_SC * @MAC_IN * 100) - 100) * rmd.ProcYield * (q.RawMatCost + q.RawMatExtraCost + @VCF01 - rmd.ProcCost) ) / 100 -- divido per 100 finale -- (C) = sottraggo costo pieno alluminio - (q.RawMatCost + q.RawMatExtraCost + @VCF01) FROM dbo.RawMatDet rmd INNER JOIN dbo.QuoteRM q ON q.RawMat = rmd.RawMat WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev AND q.RawMat = @RawMat SELECT @SellCostF04 = ((@MAC_IM) - 1) * (q.RawMatCost - CASE WHEN SSVA > 0 THEN SSVA ELSE q.RawMatCost * SSVR END + @VCF01 + @VCF04) -- ((prodotto delle MAC = inverso del prodotto delle rese) - 1) * (costo Al - prezzo rivendita + costi var fase 04) , @RefCostF04 = -- ( (A - B) / 100 - C ) ( -- (A) = (costo pieno di acquisto + costi fase 1) * MAC * 100 (IN CENTESIMI) ((q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04) * (@MAC_IM * 100)) -- (B) = ((MAC * 100) - 100) * Resa di fonderia * (costo pieno acquisto - costo di trasformazione)) - ((@MAC_IM * 100) - 100) * rmd.ProcYield * (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04 - rmd.ProcCost) ) / 100 -- divido per 100 finale -- (C) = sottraggo costo pieno alluminio - (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @VCF04) -- NOTA: usiamo (q.RawMatCost + q.RawMatExtraCost + @VCF01) e non (q.RawMatCost + q.RawMatExtraCost + @VCF01 + @RefCostF01) perché la differenza è minimale, si tratta di 10/20 PPM... FROM RawMatDet rmd INNER JOIN QuoteRM q ON q.RawMat = rmd.RawMat WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev AND q.RawMat = @RawMat -- inserisco costi per VENDITA INSERT INTO QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumEx),0) + 1, '01', @CodPlant, 'VENDITA', @RawMat, @BatchQty, @SellCostF01 * @BatchQty, @SSR FROM QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- inserisco costi per ROTTAME INSERT INTO QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumEx),0) + 1, '01', @CodPlant, 'ROTTAME', @RawMat, @BatchQty, @RefCostF01 * @BatchQty, 1 - @SSR FROM QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- inserisco costi per VENDITA INSERT INTO QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumEx),0) + 1, '04', @CodPlant, 'VENDITA', @RawMat, @BatchQty, @SellCostF04 * @BatchQty, @SSR FROM QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- inserisco costi per ROTTAME INSERT INTO QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumEx),0) + 1, '04', @CodPlant, 'ROTTAME', @RawMat, @BatchQty, @RefCostF04 * @BatchQty, 1 - @SSR FROM dbo.QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev EXEC stp_packageCost @CodItem, @CodClient, @CodPackag, @PDesc=@PkgDesc OUTPUT, @RMWeight=@PRMWeight OUTPUT, @Weight=@PWeight OUTPUT, @Tare=@PTare OUTPUT, @PackCost=@PCost OUTPUT, @TareStRat=@PTareStRatio OUTPUT -- inserisco costi per IMBALLO INSERT INTO QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumEx),0) + 1, '04', @CodPlant, 'IMBALLO', @RawMat, @BatchQty, @PCost * @BatchQty, 1 FROM dbo.QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev -- inserisco parametri calcolati x imballaggio INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '04', 'PkgDesc', @PkgDesc FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '04', 'RMWeight', @PRMWeight FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '04', 'PWeight', @PWeight FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '04', 'PTare', @PTare FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev INSERT INTO QuoteParam(QuoteType, CodQuote, QuoteRev, NumP, ProcessNum, Descr, Parameter) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumP),0) + 1, '04', 'TareStRatio', @PTareStRatio FROM QuoteParam WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev --------------------------------------------- -- inserisco costi per TRASPORTI --------------------------------------------- -- recupero zona da cliente... SELECT @TranspZone = TranspZone FROM dbo.ClientDet WHERE CodClient = @CodClient -- recupero tipo di trasporto SELECT @HasTC = ISNULL(i.HasTC, 0) FROM QuoteList q INNER JOIN Incoterms i ON q.CodInco = i.CodInco WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev -- recupero costi trasporto SELECT @TranspCost = TranspCost FROM dbo.TranspCostDet WHERE TranspZone = @TranspZone INSERT INTO QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumEx),0) + 1, '04', @CodPlant, 'TRASPORTI', @RawMat, @BatchQty, @HasTC * @TranspCost * @BatchQty, 1 FROM dbo.QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev --------------------------------------------- -- inserisco costi per PROVVIGIONI --------------------------------------------- SELECT @Provvig = ISNULL(a.QuotaProvvAg, 0) FROM dbo.AgentsDet a INNER JOIN ClientDet c ON a.CodAg = c.CodAg INNER JOIN QuoteList q ON q.CodClient = c.CodClient WHERE q.QuoteType = @QuoteType AND q.CodQuote = @CodQuote AND q.QuoteRev = @QuoteRev -- inserisco costi per PROVVIGIONI INSERT INTO QuoteOC(QuoteType, CodQuote, QuoteRev, NumEx, ProcessNum, CodPlant, Class01, Class02, TotQty, TotCost, Quota) SELECT @QuoteType, @CodQuote, @QuoteRev, ISNULL(MAX(NumEx),0) + 1, '04', @CodPlant, 'PROVVIGIONI', @RawMat, @BatchQty, @Provvig * @BatchQty, 1 FROM dbo.QuoteOC WHERE QuoteType = @QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev COMMIT TRAN END]]> ' +CONVERT(NVARCHAR(20), @dateTo, 120) FROM RevHistory WHERE RevType = 'P' COMMIT TRAN END]]> ' +CONVERT(NVARCHAR(20), @dateTo, 120) FROM RevHistory WHERE RevType = 'P' COMMIT TRAN END]]> ' +CONVERT(NVARCHAR(20), @dateTo, 120) FROM RevHistory WHERE RevType = 'P' COMMIT TRAN END]]> 1 delete from tmp.ItemsRaw where CodItem IN ( SELECT CodItem FROM ( SELECT DISTINCT * FROM tmp.ItemsRaw ) AS a GROUP BY CodItem having COUNT(*)>1 ) -- ========================================== -- CARICO DATI IN RAW ( da Char a Tipi corretti ) -- ========================================== exec tmp.convertClientsRaw exec tmp.convertTranspCostRaw exec tmp.convertItemsRaw exec tmp.convertProductionLogRaw exec tmp.convertPackagRaw exec tmp.convertDiesRaw -- necessario se integriamo i dati x i gruppi di matrici con un file exec tmp.convertDiesGroupRaw select top 10 * FROM ext.ProductionLogRaw select * FROM ext.ClientsRaw select * FROM ext.ItemsRaw select * FROM ext.PackagRaw select * FROM ext.DiesRaw SELECT * FROM ext.DiesGroupRaw -- elimino a mano dato con oltre 68 anni di evento... select * --delete from ext.ProductionLogRaw where DATEDIFF(YEAR,EventStart,EventEnd)> 10 exec ext.stp_mergeAgentsDet exec ext.stp_mergeClientDet 'ProductionLogRaw' exec ext.stp_mergeClientDet 'ClientsRaw' exec ext.stp_mergeTranspCostDet 'TranspCostRaw' exec ext.stp_mergePlantsDet exec ext.stp_mergeCost2Plant exec ext.stp_mergeItemDet 'ItemsRaw' exec ext.stp_mergePackagDet 'ProductionLogRaw' -- 'PackagRaw' exec ext.stp_mergePackage2ItemClient 'ProductionLog', @dateFrom, @dateTo exec ext.stp_mergePackage2Item 'ProductionLog', @dateFrom, @dateTo exec ext.stp_mergePackage2 'ProductionLog', @dateFrom, @dateTo exec ext.stp_mergeDiesDet -- se ricarico diesgroup... ricarico solo i campi che nel file sono <> '' exec ext.stp_mergeDiesGroupDet exec ext.stp_mergeRawMat exec ext.stp_updateProductionLog ---- aggiorno quota agenti a 0.037 ----update AgentsDet set quotaperc=0.0374 SELECT DISTINCT dr.CodItem FROM ext.DiesRaw dr LEFT OUTER JOIN ItemDet id ON dr.CodItem = id.CodItem where id.CodItemGroup is null select * from ClientDet select * from ItemDet select * from Package2ItemClient select * from Package2Item select * from Package2 select * from PackagDet select * from DiesGroupDet where EOLLife > 0 select * from DiesDet select * from DiesGroupDet select * from AgentsDet select * from PlantsDet select * from Cost2Plant select * from utilities select top 100 * from ProductionLog --update tmp.ProductionLogRaw --set -- okPr = 1 -- , okDi = 1 -- , okQM = 1 -- , okSc = 1 select distinct ProcessNum from ProductionLog select top 10 * from ext.ProductionLogRaw ---- fix errore packaging --update tmp.ProductionLogRaw --SET CodPackag='4' --where CodPackag LIKE '%4%' and CodPackag <> '4' --select * from tmp.ProductionLogRaw where CodPackag LIKE '%4%' and CodPackag <> '4' SELECT p.CodDies, CodItem, CodClient, CodPackag, p.* FROM ext.ProductionLogRaw AS p LEFT JOIN dbo.DiesDet AS d ON p.CodDies = d.CodDies WHERE CodItem IS NULL -- parte CALCOLI!!! select * from QuoteList select * from ClientDet where CodClient='05000001048' select * from itemdet where CodItem like '1PT00102%' select * from RawMatDet --Q 1312130001 0 05000001048 1PT00102 A 7020 7673,400 1000 CPT NULL NULL NULL NULL SELECT --TOP 10 dd.CodItem, pl.RawMat, dd.CodItem + '-' + pl.RawMat as KeyAM, dd.CodDiesGroup, pl.CodPlant, dd.HoleNum ,dd.CodItem + '-' + pl.RawMat + '-' + pl.CodPlant + '-' + CAST(dd.HoleNum AS NVARCHAR(19)) as KeyAMIL ,0 as NumSMED -- numero cambi, da sistemare... , SUM(QtyOUT) as KgTeorici, SUM(Duration) AS Durata ,ISNULL(SUM(QtyOUT),0)/ISNULL(SUM(Duration), 1) as ProduttTeo FROM ProductionLog pl INNER JOIN DiesDet dd ON pl.CodDies=dd.CodDies WHERE pl.ProcessNum='01' and pl.EventType=1 GROUP BY dd.CodItem, pl.RawMat, dd.CodDiesGroup, pl.CodPlant, dd.HoleNum ORDER BY dd.CodItem, pl.RawMat, dd.CodDiesGroup, SUM(QtyOUT) DESC -- ========================================== -- re-insert dei dati di produzione x statistiche -- ========================================== exec stp_TPS_upsert @dateFrom, @dateTo exec stp_TD_upsert @dateFrom , @dateTo -- exec stp_TI_upsert @dateFrom , @dateTo -- adesso sono già calcolati e inseriti in Package2 / Package2Item -- ========================================== -- salvo nuova revisione dati di produzione... -- Va messa in ogni procedura di update con 'procedura' e versione anno-mese-giorno -- ========================================== INSERT INTO RevHistory SELECT 'P', ISNULL(MAX(RevNum),0) + 1, GETDATE(), 'Aggiornamento dati di produzione x fase 04 ' + CONVERT(NVARCHAR(20), @dateFrom, 120) + ' --> ' +CONVERT(NVARCHAR(20), @dateTo, 120) FROM RevHistory WHERE RevType = 'P' select * from RevHistory -- simulazione tempo di calcolo: circa 50/sec ---- aggiornamento dei dati dell'offerta in oggetto --DECLARE @tick DATETIME, -- @idx INT = 100 --SET @tick = GETDATE() --WHILE @idx > 0 --BEGIN -- EXEC stp_QL_update 'Q', 1312130001, 0 -- SELECT @idx = @idx - 1 --END --SELECT GETDATE() - @tick as tempo DECLARE @QuoteType CHAR(1) = 'Q', @CodQuote BIGINT = 1312130001, @QuoteRev INT = 0 EXEC stp_QL_update @QuoteType, @CodQuote, @QuoteRev SELECT * FROM QuoteList WHERE QuoteType=@QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev SELECT * FROM QuoteRM WHERE QuoteType=@QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev SELECT * FROM QuoteWorkInt WHERE QuoteType=@QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev SELECT * FROM QuoteWorkExt WHERE QuoteType=@QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev SELECT * FROM QuoteOC WHERE QuoteType=@QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev SELECT * FROM QuoteParam WHERE QuoteType=@QuoteType AND CodQuote = @CodQuote AND QuoteRev = @QuoteRev select top 10 * from ItemDet SELECT * FROM RawMatDet SELECT top 10 * FROM TabProdSc SELECT top 10 * FROM TabDifett -- SELECT * FROM TabImbArt -- SELECT * FROM TabImbGrp SELECT * FROM PackagDet SELECT * FROM Package2 ---- test gestione selezione CodPackag corretto --SELECT TOP 5 * FROM Package2ItemClient --SELECT TOP 5 * FROM Package2Item --SELECT TOP 5 * FROM Package2 SELECT dbo.f_getCodPackag('1EL00005', '05000001048') --SELECT dbo.f_getCodPackag('1AN00001', '05000000137') END]]> '')]]> '')]]> 0 BEGIN WHILE @Riga <= @TotRighe BEGIN SELECT @WhereCond = WhereCond FROM #tmpTable WHERE Riga = @Riga SET @Sql = @Sql + ' OR ' + @WhereCond; SET @Riga = @Riga + 1; END END -- Ritorno la select eseguita SELECT @Sql -- ======================================================= -- Eseguo la select/delete e ritorno i record elaborati -- ======================================================= EXEC sp_executesql @Sql SELECT @@ROWCOUNT -- SELECT * FROM ext.ProductionLogRaw_KO IF OBJECT_ID('tempdb..#tmpTable') IS NOT NULL DROP TABLE #tmpTable END]]> 5000 THEN ActLife END ),0 ) AS EOLLife -- solo Matrici rottamate e vita > 5000KG FROM dbo.DiesDet GROUP BY CodDiesGroup ) AS Source ON Target.CodDiesGroup = Source.CodDiesGroup WHEN MATCHED THEN UPDATE SET CodDiesGroup = Source.CodDiesGroup, Price = Source.Price, QtyTot = Source.QtyTot , QtyEOL = Source.QtyEOL, ExpLife = Source.ExpLife, EOLLife = Source.EOLLife , DateMod = GETDATE(), UserMod = 'IMPORT_DiesRaw' WHEN NOT MATCHED BY TARGET THEN INSERT ( CodDiesGroup, Price, QtyTot, QtyEOL, ExpLife, EOLLife, DateMod ,UserMod ) VALUES ( CodDiesGroup, Source.Price, Source.QtyTot, Source.QtyEOL, Source.ExpLife, Source.EOLLife, GETDATE(), 'IMPORT_DiesRaw' ) -- mi da errori in calcoli successivi altrimenti con zero a ExpLife e EOLLife OUTPUT $action INTO @SummaryOfChanges; ---- a questo punto calcolo il VERO update dalle inforamzioni di dbo.DiesDet --> dbo.DiesGroupDet --MERGE INTO dbo.DiesGroupDet AS Target --USING ( -- SELECT coddiesgroup, -- Avg(Isnull(price, 0)) AS Price, -- Count(*) AS QtyTot, -- Count(*) - Sum(Active) AS QtyEOL, -- Avg(Isnull(ExpLife, 0.1)) AS ExpLife, -- mi da errori in calcoli successivi altrimenti con zero a ExpLife e EOLLife -- Sum(Isnull(ActLife * (1 - Active), 0)) / (Count(*) - Sum(Active)) AS EOLLife -- FROM dbo.DiesDet -- WHERE ActLife > 5000 -- GROUP BY CodDiesGroup -- HAVING Count(*) > Sum(Active) -- ci siano rottamate -- ) -- AS Source --ON Target.CodDiesGroup = Source.CodDiesGroup --WHEN MATCHED THEN -- UPDATE SET Price = Source.Price, QtyTot = Source.QtyTot, QtyEOL = Source.QtyEOL, ExpLife = Source.ExpLife, EOLLife = Source.EOLLife --OUTPUT $action INTO @SummaryOfChanges; COMMIT tran -- Query the results of the table variable. SELECT Change, COUNT(*) AS CountPerChange FROM @SummaryOfChanges GROUP BY Change; END]]> 0 ( li ritengo come non passati ) MERGE INTO dbo.DiesGroupDet AS Target USING ( SELECT * FROM ext.DiesGroupRaw ) AS Source ON Target.CodDiesGroup = Source.CodDiesGroup WHEN MATCHED THEN UPDATE SET Price = CASE Source.Price WHEN 0 THEN Target.Price ELSE Source.Price END , QtyTot = CASE Source.QtyTot WHEN 0 THEN Target.QtyTot ELSE Source.QtyTot END , QtyEOL = CASE Source.QtyEOL WHEN 0 THEN Target.QtyEOL ELSE Source.QtyEOL END , ExpLife = CASE Source.ExpLife WHEN 0 THEN Target.ExpLife ELSE Source.ExpLife END , EOLLife = CASE Source.EOLLife WHEN 0 THEN Target.EOLLife ELSE Source.EOLLife END , DateMod = GETDATE() , UserMod = 'UPDATE_DiesGroupRaw' WHEN NOT MATCHED BY TARGET THEN INSERT ( CodDiesGroup, Price, QtyTot, QtyEOL, ExpLife, EOLLife, DateMod, UserMod ) VALUES ( Source.CodDiesGroup, Source.Price, Source.QtyTot, Source.QtyEOL, Source.ExpLife, Source.EOLLife, GETDATE(), 'INSERT_DiesGroupRaw' ) -- VALUES ( CodDiesGroup, 0, 1, 0, 0.1, 0.1 ) -- mi da errori in calcoli successivi altrimenti con 0 a ExpLife e EOLLife OUTPUT $action INTO @SummaryOfChanges; COMMIT TRAN -- Query the results of the table variable. SELECT Change, COUNT(*) AS CountPerChange FROM @SummaryOfChanges GROUP BY Change; END]]> '' --GROUP BY plr.CodPackag SELECT pl.CodPackag , SUM(QtyOUT) AS TotQta -- , COUNT(*) AS NumEv , SUM(QtyOUT) / COUNT(*) AS PesoMedio , SUM(QtyEXT) / COUNT(*) AS TaraMedia -- dati produttività imballo , ROUND(SUM(QtyOUT * QuotaMan) / CASE WHEN SUM(QtyOUT) = 0 THEN 1 ELSE SUM(QtyOUT) END,0) as NumImb -- , SUM(QtyOUT) AS TotOut -- unificata a TotQta , SUM(Duration) AS Durata FROM ProductionLog pl INNER JOIN DiesDet dd ON pl.CodDies=dd.CodDies WHERE pl.ProcessNum = '04' AND pl.okPr = 1 AND pl.okQM = 1 AND ISNULL(pl.CodPackag, '') <> '' -- cmq filtro righe con package VUOTO AND pl.EventStart BETWEEN @dateFrom AND @dateTo GROUP BY pl.CodPackag ) AS Source ON Target.CodPackag = Source.CodPackag WHEN MATCHED THEN UPDATE SET TotQta = Source.TotQta , [Weight] = Source.PesoMedio , Tare = Source.TaraMedia , NumImb = Source.NumImb , Durata = Source.Durata WHEN NOT MATCHED BY TARGET THEN INSERT (CodPackag, TotQta, [Weight], Tare, NumImb, Durata) VALUES (CodPackag, TotQta, PesoMedio, TaraMedia, NumImb, Durata) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action INTO @SummaryOfChanges; END --ELSE IF @source = 'ItemsRaw' -- carico da anagrafica -- BEGIN -- MERGE INTO Item2Package AS Target -- USING (SELECT CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup FROM ItemsRaw) -- AS Source -- ON Target.CodItem = Source.CodItem -- WHEN MATCHED THEN -- UPDATE SET ItemDescr = Source.ItemDescr, CodPlant = Source.CodPlant, UnitWeight = Source.UnitWeight, CodItemGroup = Source.CodItemGroup -- WHEN NOT MATCHED BY TARGET THEN -- INSERT (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) VALUES (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) -- OUTPUT $action INTO @SummaryOfChanges; -- END -- Query the results of the table variable. SELECT Change, COUNT(*) AS CountPerChange FROM @SummaryOfChanges GROUP BY Change; END]]> '' -- GROUP BY plr.CodPackag -- ) -- AS Source -- ON Target.CodPackag = Source.CodPackag -- WHEN MATCHED THEN -- UPDATE SET TotQty = Source.TotQta -- , [Weight] = Source.PesoMedio -- , Tare = Source.TaraMedia -- WHEN NOT MATCHED BY TARGET THEN -- INSERT (CodPackag, TotQty, [Weight], Tare) VALUES (CodPackag, TotQta, PesoMedio, TaraMedia) -- OUTPUT $action INTO @SummaryOfChanges; -- END ----ELSE IF @source = 'ItemsRaw' -- carico da anagrafica ---- BEGIN ---- MERGE INTO Item2Package AS Target ---- USING (SELECT CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup FROM ItemsRaw) ---- AS Source ---- ON Target.CodItem = Source.CodItem ---- WHEN MATCHED THEN ---- UPDATE SET ItemDescr = Source.ItemDescr, CodPlant = Source.CodPlant, UnitWeight = Source.UnitWeight, CodItemGroup = Source.CodItemGroup ---- WHEN NOT MATCHED BY TARGET THEN ---- INSERT (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) VALUES (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) ---- OUTPUT $action INTO @SummaryOfChanges; ---- END ---- Query the results of the table variable. --SELECT Change, COUNT(*) AS CountPerChange --FROM @SummaryOfChanges --GROUP BY Change; END]]> '' --GROUP BY dd.CodItem, plr.CodPackag SELECT dd.CodItem , pl.CodPackag , SUM(QtyOUT) AS TotQta -- , COUNT(*) AS NumEv , SUM(QtyOUT) / COUNT(*) AS PesoMedio , SUM(QtyEXT) / COUNT(*) AS TaraMedia -- dati produttività imballo , ROUND(SUM(QtyOUT* QuotaMan) / CASE WHEN SUM(QtyOUT) = 0 THEN 1 ELSE SUM(QtyOUT) END,0) as NumImb , SUM(Duration) AS Durata FROM ProductionLog pl INNER JOIN DiesDet dd ON pl.CodDies=dd.CodDies WHERE pl.ProcessNum = '04' AND pl.okPr = 1 AND pl.okQM = 1 AND ISNULL(pl.CodPackag, '') <> '' AND pl.EventStart BETWEEN @dateFrom AND @dateTo GROUP BY dd.CodItem, pl.CodPackag ) AS Source ON Target.CodItem = Source.CodItem AND Target.CodPackag = Source.CodPackag WHEN MATCHED THEN UPDATE SET TotQta = Source.TotQta , [Weight] = Source.PesoMedio , Tare = Source.TaraMedia , NumImb = Source.NumImb , Durata = Source.Durata WHEN NOT MATCHED BY TARGET THEN INSERT (CodItem, CodPackag, TotQta, [Weight], Tare, NumImb, Durata) VALUES (CodItem, CodPackag, TotQta, PesoMedio, TaraMedia, NumImb, Durata) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action INTO @SummaryOfChanges; END --ELSE IF @source = 'ItemsRaw' -- carico da anagrafica -- BEGIN -- MERGE INTO Item2Package AS Target -- USING (SELECT CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup FROM ItemsRaw) -- AS Source -- ON Target.CodItem = Source.CodItem -- WHEN MATCHED THEN -- UPDATE SET ItemDescr = Source.ItemDescr, CodPlant = Source.CodPlant, UnitWeight = Source.UnitWeight, CodItemGroup = Source.CodItemGroup -- WHEN NOT MATCHED BY TARGET THEN -- INSERT (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) VALUES (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) -- OUTPUT $action INTO @SummaryOfChanges; -- END -- Query the results of the table variable. SELECT Change, COUNT(*) AS CountPerChange FROM @SummaryOfChanges GROUP BY Change; END]]> '' -- GROUP BY dd.CodItem, plr.CodPackag -- ) -- AS Source -- ON Target.CodItem = Source.CodItem AND Target.CodPackag = Source.CodPackag -- WHEN MATCHED THEN -- UPDATE SET TotQty = Source.TotQta -- , [Weight] = Source.PesoMedio -- , Tare = Source.TaraMedia -- WHEN NOT MATCHED BY TARGET THEN -- INSERT (CodItem, CodPackag, TotQty, [Weight], Tare) VALUES (CodItem, CodPackag, TotQta, PesoMedio, TaraMedia) -- OUTPUT $action INTO @SummaryOfChanges; -- END ----ELSE IF @source = 'ItemsRaw' -- carico da anagrafica ---- BEGIN ---- MERGE INTO Item2Package AS Target ---- USING (SELECT CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup FROM ItemsRaw) ---- AS Source ---- ON Target.CodItem = Source.CodItem ---- WHEN MATCHED THEN ---- UPDATE SET ItemDescr = Source.ItemDescr, CodPlant = Source.CodPlant, UnitWeight = Source.UnitWeight, CodItemGroup = Source.CodItemGroup ---- WHEN NOT MATCHED BY TARGET THEN ---- INSERT (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) VALUES (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) ---- OUTPUT $action INTO @SummaryOfChanges; ---- END ---- Query the results of the table variable. --SELECT Change, COUNT(*) AS CountPerChange --FROM @SummaryOfChanges --GROUP BY Change; END]]> '' --GROUP BY dd.CodItem, plr.CodClient, plr.CodPackag SELECT dd.CodItem , pl.CodClient , pl.CodPackag , SUM(QtyOUT) AS TotQta -- , COUNT(*) AS NumEv , SUM(QtyOUT) / COUNT(*) AS PesoMedio , SUM(QtyEXT) / COUNT(*) AS TaraMedia -- dati produttività imballo , ROUND(SUM(QtyOUT* QuotaMan) / CASE WHEN SUM(QtyOUT) = 0 THEN 1 ELSE SUM(QtyOUT) END,0) as NumImb , SUM(Duration) AS Durata FROM dbo.ProductionLog pl INNER JOIN dbo.DiesDet dd ON pl.CodDies=dd.CodDies WHERE pl.ProcessNum = '04' AND pl.okPr = 1 AND pl.okQM = 1 AND ISNULL(pl.CodPackag, '') <> '' AND pl.EventStart BETWEEN @dateFrom AND @dateTo GROUP BY dd.CodItem, pl.CodClient, pl.CodPackag ) AS Source ON Target.CodItem = Source.CodItem AND Target.CodClient = Source.CodClient AND Target.CodPackag = Source.CodPackag WHEN MATCHED THEN UPDATE SET TotQta = Source.TotQta , [Weight] = Source.PesoMedio , Tare = Source.TaraMedia , NumImb = Source.NumImb , Durata = Source.Durata WHEN NOT MATCHED BY TARGET THEN INSERT (CodItem, CodClient, CodPackag, TotQta, [Weight], Tare, NumImb, Durata) VALUES (CodItem, CodClient, CodPackag, TotQta, PesoMedio, TaraMedia, NumImb, Durata) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action INTO @SummaryOfChanges; END --ELSE IF @source = 'ItemsRaw' -- carico da anagrafica -- BEGIN -- MERGE INTO Item2PackageClient AS Target -- USING (SELECT CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup FROM ItemsRaw) -- AS Source -- ON Target.CodItem = Source.CodItem -- WHEN MATCHED THEN -- UPDATE SET ItemDescr = Source.ItemDescr, CodPlant = Source.CodPlant, UnitWeight = Source.UnitWeight, CodItemGroup = Source.CodItemGroup -- WHEN NOT MATCHED BY TARGET THEN -- INSERT (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) VALUES (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) -- OUTPUT $action INTO @SummaryOfChanges; -- END -- Query the results of the table variable. SELECT Change, COUNT(*) AS CountPerChange FROM @SummaryOfChanges GROUP BY Change; END]]> '' -- GROUP BY dd.CodItem, plr.CodClient, plr.CodPackag -- ) -- AS Source -- ON Target.CodItem = Source.CodItem AND Target.CodClient = Source.CodClient AND Target.CodPackag = Source.CodPackag -- WHEN MATCHED THEN -- UPDATE SET TotQty = Source.TotQta -- , [Weight] = Source.PesoMedio -- , Tare = Source.TaraMedia -- WHEN NOT MATCHED BY TARGET THEN -- INSERT (CodItem, CodClient, CodPackag, TotQty, [Weight], Tare) VALUES (CodItem, CodClient, CodPackag, TotQta, PesoMedio, TaraMedia) -- OUTPUT $action INTO @SummaryOfChanges; -- END ----ELSE IF @source = 'ItemsRaw' -- carico da anagrafica ---- BEGIN ---- MERGE INTO Item2PackageClient AS Target ---- USING (SELECT CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup FROM ItemsRaw) ---- AS Source ---- ON Target.CodItem = Source.CodItem ---- WHEN MATCHED THEN ---- UPDATE SET ItemDescr = Source.ItemDescr, CodPlant = Source.CodPlant, UnitWeight = Source.UnitWeight, CodItemGroup = Source.CodItemGroup ---- WHEN NOT MATCHED BY TARGET THEN ---- INSERT (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) VALUES (CodItem, ItemDescr, CodPlant, UnitWeight, CodItemGroup) ---- OUTPUT $action INTO @SummaryOfChanges; ---- END ---- Query the results of the table variable. --SELECT Change, COUNT(*) AS CountPerChange --FROM @SummaryOfChanges --GROUP BY Change; END]]> in C = costi di contab industriale, P = da ProductionLog, S = Sistema di calcolo']]> 1 ) AS Dupl ON Prod.EventStart = Dupl.EventStart AND Prod.EventEnd = Dupl.EventEnd AND Prod.CodPlant = Dupl.CodPlant AND Prod.ProcessNum = Dupl.ProcessNum AND Prod.NrPos = Dupl.NrPos AND Prod.CodDies = Dupl.CodDies -- Cancello i record con chiave duplicata DELETE Prod WITH (TABLOCK) FROM tmp.ProductionLogRaw AS Prod INNER JOIN ( SELECT EventStart, EventEnd, CodPlant, ProcessNum, NrPos, CodDies FROM tmp.ProductionLogRaw GROUP BY EventStart, EventEnd, CodPlant, ProcessNum, NrPos, CodDies HAVING COUNT(*)>1 ) AS Dupl ON Prod.EventStart = Dupl.EventStart AND Prod.EventEnd = Dupl.EventEnd AND Prod.CodPlant = Dupl.CodPlant AND Prod.ProcessNum = Dupl.ProcessNum AND Prod.NrPos = Dupl.NrPos AND Prod.CodDies = Dupl.CodDies -- =============================================================================== -- pulisco la tabella dai record con date non corrette -- =============================================================================== DELETE FROM tmp.ProductionLogRaw WITH (TABLOCK) OUTPUT deleted.* INTO tmp.ProductionLogRaw_KO -- salvo i record cancellati in tabella KO ( EventStart, EventEnd, CodPlant, ProcessNum, NrPos, CodDies, CodClient, OrderNum, BatchNum, ProcessType, EventType, RawMat , CodPackag, QtyIN, QtyOUT, QtyEXT, NumIN, NumOUT, QuotaPlant, QuotaMan, Tags, okPr, okQM, okSc, okDi ) WHERE EventStart >= EventEnd OR CONVERT( BIGINT , EventStart ) + 68000000000000 <= EventEnd -- record che darebbero errore poi nel datediff > 68 anni OR EventStart IS NULL OR EventEnd IS NULL -- SELECT * FROM tmp.ProductionLogRaw_KO --ROLLBACK COMMIT SELECT COUNT(*) AS RecordsIn FROM tmp.ProductionLogRaw END END]]>