set xact_abort on go begin transaction go set ANSI_NULLS on go /********************************************************** * STORED stp_IR_getFullSettPareto * * recupera riga tabella PIENA x anno, settimana x dipendente FINTO ordinando commesse in logica pareto ore tot settimana * PER LE SOLE COMMESSE SCHEDULATE in bazaar * * mod: S.E.L. 2013.09.12 * **********************************************************/ create PROCEDURE stp_IR_getBazSettPareto ( @Anno INT = 0, @Settimana INT = 0 ) AS SELECT Anno, Sett, 0 as idxDipendente, idxFase, SUM(OreTot) as OreTot FROM ImpiegoRisorse WHERE Anno = @Anno AND Sett = @Settimana AND idxFase IN (SELECT DISTINCT idxFase FROM BazaarRisorse WHERE Anno = @Anno AND Sett = @Settimana) GROUP BY Anno, Sett, idxFase ORDER BY SUM(OreTot) RETURN go drop procedure stp_IR_getFullSettByDip go /********************************************************** * STORED stp_IR_getFullSettPareto * * recupera riga tabella PIENA x anno, settimana x DIPENDENTE FINTO (=0) ordinando commesse in logica pareto ore tot settimana * * mod: S.E.L. 2013.09.12 * **********************************************************/ create PROCEDURE stp_IR_getFullSettPareto ( @Anno INT = 0, @Settimana INT = 0 ) AS SELECT Anno, Sett, 0 as idxDipendente, idxFase, SUM(OreTot) as OreTot FROM ImpiegoRisorse WHERE Anno = @Anno AND Sett = @Settimana GROUP BY Anno, Sett, idxFase ORDER BY SUM(OreTot) RETURN go commit go set xact_abort on go begin transaction go set ANSI_NULLS on go /********************************************************** * STORED stp_IR_getFullSettimana * * genera tabella PIENA x anno e settimana selezionate (eventualemnte record a zero ove non presenti) * * mod: S.E.L. 2013.09.06 * **********************************************************/ alter PROCEDURE stp_IR_getFullSettimana ( @Anno INT = 0, @Settimana INT = 0 ) AS SELECT @anno AS Anno, @settimana AS Sett, tf.idxDipendente, tf.idxFase, ISNULL(ir.OreTot, 0) as OreTot FROM ( SELECT DISTINCT @Anno as Anno, @Settimana as Sett, d2a.idxDipendente, ir.idxFase FROM Dip2ATR d2a CROSS JOIN ImpiegoRisorse ir WHERE ISNULL(d2a.Gruppo,'') <>'' AND ir.Anno = @Anno AND ir.Sett = @Settimana ) as tf LEFT OUTER JOIN ImpiegoRisorse ir ON tf.idxDipendente = ir.idxDipendente AND tf.idxFase = ir.idxFase AND ir.Anno=tf.Anno AND ir.Sett=tf.Sett RETURN go /********************************************************** * STORED stp_IR_importSettimana * * importa i dati di registro attivitā x anno e settimana selezionate * * mod: S.E.L. 2013.09.04 * **********************************************************/ alter PROCEDURE stp_IR_importSettimana ( @Anno INT = 0, @Settimana INT = 0 ) AS DECLARE @InizioAnno AS DATETIME; DECLARE @SettInizioAnno AS INT; DECLARE @InizioSettimana AS DATETIME; DECLARE @FineSettimana AS DATETIME; -- CALCOLO DIFFERENZA SETTIMANA DA GIORNO 0 A INIZIO ANNO SET @InizioAnno = CONVERT( DATETIME, CONVERT(CHAR(4), @anno ) + '0101' ); SET @SettInizioAnno = datediff(week, 0, @InizioAnno); -- Calcolo il giorno di inizio settimana richiesta e il primo gg della settimana successiva SET @InizioSettimana = dateadd(week, @SettInizioAnno + @Settimana -1 , 0 ); SET @FineSettimana = dateadd(week, @SettInizioAnno + @Settimana , 0 ); -- con merge ( query corretta ) WITH cte AS -- calcolo totale ore lavorate x dipendente / fase x la settimana richiesta ( SELECT @Anno AS Anno, @Settimana AS Sett, ra.idxDipendente , CASE WHEN af.idxFaseAncest = 0 THEN af.idxFase ELSE af.idxFaseAncest END AS idxFaseAncest , SUM(oreTot) AS OreTot FROM dbo.RegAttivita AS ra INNER JOIN dbo.AnagFasi AS af ON ra.idxFAse=af.idxFase INNER JOIN dbo.Dip2ATR AS d2a ON d2a.idxDipendente=ra.idxDipendente WHERE inizio >= @InizioSettimana AND inizio < @FineSettimana AND ISNULL(d2a.Gruppo,'') <> '' -- tolgo i dipendenti senza un gruppo assegnato GROUP BY CASE WHEN af.idxFaseAncest = 0 THEN af.idxFase ELSE af.idxFaseAncest END, ra.idxDipendente ) MERGE dbo.ImpiegoRisorse AS target USING cte AS source ON target.Anno = source.Anno AND target.Sett = source.Sett AND target.idxDipendente = source.idxDipendente AND target.idxFase = source.idxFaseAncest WHEN MATCHED THEN -- se esiste riga aggiorno UPDATE SET target.OreTot = source.OreTot WHEN NOT MATCHED BY TARGET THEN -- se non esiste in destinazione inserisco record INSERT (Anno,Sett,idxDipendente,idxFase , OreTot) VALUES (source.Anno,source.Sett,source.idxDipendente,source.idxFaseAncest , source.OreTot) WHEN NOT MATCHED BY SOURCE AND target.Anno = @Anno AND target.Sett = @Settimana THEN -- se esiste in destinazione ma non nella sorgente cancello DELETE; -- OUTPUT $action, inserted.*, deleted.*; -- da usare x test e vedere i dati modificati /* -- con merge WITH cte AS -- calcolo totale ore lavorate x dipendente / fase x la settimana richiesta ( SELECT @Anno AS Anno, @Settimana AS Sett, ra.idxDipendente , CASE WHEN af.idxFaseAncest = 0 THEN af.idxFase ELSE af.idxFaseAncest END AS idxFaseAncest , SUM(oreTot) AS OreTot FROM dbo.RegAttivita AS ra INNER JOIN dbo.AnagFasi AS af ON ra.idxFAse=af.idxFase INNER JOIN dbo.Dip2ATR AS d2a ON d2a.idxDipendente=ra.idxDipendente WHERE DATEPART(wk, inizio) = @Settimana AND YEAR(inizio) = @Anno AND ISNULL(d2a.Gruppo,'') <> '' -- tolgo i dipendenti senza un gruppo assegnato GROUP BY CASE WHEN af.idxFaseAncest = 0 THEN af.idxFase ELSE af.idxFaseAncest END, ra.idxDipendente ) MERGE dbo.ImpiegoRisorse AS target USING cte AS source ON target.Anno = source.Anno AND target.Sett = source.Sett AND target.idxDipendente = source.idxDipendente AND target.idxFase = source.idxFaseAncest WHEN MATCHED THEN -- se esiste riga aggiorno UPDATE SET target.OreTot = source.OreTot WHEN NOT MATCHED BY TARGET THEN -- se non esiste in destinazione inserisco record INSERT (Anno,Sett,idxDipendente,idxFase , OreTot) VALUES (source.Anno,source.Sett,source.idxDipendente,source.idxFaseAncest , source.OreTot) WHEN NOT MATCHED BY SOURCE THEN -- se esiste in destinazione ma non nella sorgente cancello DELETE; -- OUTPUT $action, inserted.*, deleted.*; -- da usare x test e vedere i dati modificati -- **** questa č quella schifosa di SAM -- svuoto eventuali record precedenti... DELETE FROM ImpiegoRisorse WHERE Anno = @Anno AND Sett = @Settimana -- creo record... INSERT INTO ImpiegoRisorse(Anno,Sett,idxDipendente,idxFase,OreTot) SELECT @Anno, @Settimana, idxDipendente, af.idxFaseAncest, SUM(oreTot) AS OreTot FROM RegAttivita ra INNER JOIN AnagFasi af on ra.idxFAse=af.idxFase WHERE DATEPART(wk, inizio) = @Settimana AND YEAR(inizio) = @Anno GROUP BY af.idxFaseAncest, idxDipendente */ RETURN go commit go -- registro versione... INSERT INTO [dbo].[LogUpdateDb] ([Versione],[Data]) VALUES(202, GETDATE()) GO SELECT TOP 10 * FROM LogUpdateDb ORDER BY Versione DESC GO