@dataFrom) BEGIN -- calcolo totale "raw" delle ore SET @oreTot = CAST(ISNULL(DATEDIFF(minute, @dataFrom, @dataTo), 0) AS float) / 60; -- definisco tabella cte ricorsiva WITH mycte AS ( SELECT CAST(dbo.f_dateOnly(DATEADD(dd,1,@dataFROM)) AS DATETIME) DateValue UNION ALL SELECT DateValue + 1 FROM mycte WHERE DateValue + 1 < dbo.f_dateOnly(@dataTo) ) -- carico nella tab temporanea i sabati e le domeniche... INSERT into @tmp_dates(DateValue, h) SELECT *, CASE ((DATEPART(dw, DateValue) + @@DATEFIRST) % 7) WHEN 0 THEN 16 ELSE 24 END AS h FROM mycte WHERE ((DATEPART(dw, DateValue) + @@DATEFIRST) % 7) IN (0,1) OPTION (MAXRECURSION 0) -- carico le festività per le date NON ancora presenti insert into @tmp_dates(DateValue, h) select data as DateValue, 24 as h--, descrizione from CalendFesteFerie where data between @dataFrom and @dataTo and data not in (select distinct DateValue from @tmp_dates) -- aggiorno sabati/domenica che fossero festivi (ipotesi che hfest > h sab/dom... UPDATE @tmp_dates SET h=24 WHERE DateValue in (SELECT data FROM CalendFesteFerie WHERE data between @dataFrom and @dataTo) -- calcolo INFINE le ore off! SET @oreOff = (SELECT ISNULL(SUM(h),0) FROM @tmp_dates) END -- setto le nuove ore totali... se ho un numero di ore > delle fermate le sottraggo per evitare ore engative... IF(@oreTot > @oreOff) BEGIN SET @oreTot = @oreTot - @oreOff END RETURN @oreTot END]]> 0 BEGIN DROP TABLE ##TMP_nomiTabelle END -- enumero le tab del db in una tab temporanea SELECT IDENT = IDENTITY (INT,1,1), name INTO ##TMP_nomiTabelle FROM sys.Tables -- eseguo reindicizzazione DECLARE @VAR1 INT SET @VAR1 = 1 WHILE @VAR1 < = ( SELECT COUNT(*) FROM ##TMP_nomiTabelle) BEGIN DECLARE @OBJECTNAME VARCHAR(256) -- carico il nome della tab i-esima SELECT @OBJECTNAME = name FROM ##TMP_nomiTabelle WHERE [IDENT] = @VAR1 -- rebuild indice DBCC DBREINDEX(@OBJECTNAME) -- incremento SET @VAR1 = @VAR1 + 1 END --shrink del db DBCC SHRINKDATABASE (@databaseName) END]]> 0) BEGIN UPDATE InterventiMtz SET idxStato = Tra_Ev2Stati.nextIdxStato FROM InterventiMtz INNER JOIN Tra_Ev2Stati ON InterventiMtz.idxStato = Tra_Ev2Stati.idxStato WHERE (InterventiMtz.numIntMtz = @numIntMtz) AND (Tra_Ev2Stati.idxEvento = @idxEvento) END COMMIT TRAN -- calcolo lo stato nuovo... SET @idxStatoNew = ISNULL((SELECT idxStato FROM InterventiMtz WHERE (numIntMtz = @numIntMtz)),0) RETURN (@idxStatoNew)]]> @Original_TagCode) BEGIN -- aggiorno DESTINAZIONI UPDATE SinonimiTag SET TagCode = @TagCode WHERE TagCode = @Original_TagCode -- aggiorno ORIGINI UPDATE SinonimiTag SET TagCodeOrig = @TagCode WHERE TagCodeOrig = @Original_TagCode END -- aggiorno VERO tag... UPDATE AnagTags SET TagCode = @TagCode ,Class = @Class ,TagDescr = @TagDescr WHERE TagCode = @Original_TagCode COMMIT tran]]> etichette -> items SELECT vsm.* FROM Tag2Item t2i INNER JOIN Tag2Macc t2m ON t2i.TagCode = t2m.TagCode INNER JOIN v_statoMag vsm ON vsm.idxItem = t2i.idxItem WHERE t2m.idxMacchina = @idxMacchina RETURN]]> '' THEN [Descrizione] ELSE [CodCostruttore] END, '"', '')))) AS Descrizione ,LTRIM(RTRIM(UPPER(NomeCostruttore))) AS NomeCostruttore ,LTRIM(RTRIM(UPPER(CodCostruttore))) AS CodCostruttore ,LTRIM(RTRIM(UPPER(CodSomaschini))) AS CodInterno FROM [som_ita].[tmp_ImportRic_A] ) MERGE INTO dbo.AnagItems AS Target USING ( SELECT DISTINCT * FROM cteImportRicA ) AS Source ON Target.Famiglia = Source.Famiglia AND Target.Descrizione = Source.Descrizione AND Target.NomeCostruttore = Source.NomeCostruttore AND Target.CodCostruttore = Source.CodCostruttore AND Target.CodInterno = Source.CodInterno WHEN NOT MATCHED BY TARGET THEN INSERT ( Famiglia,Descrizione,NomeCostruttore,CodCostruttore,CodInterno) VALUES ( Famiglia,Descrizione,NomeCostruttore,CodCostruttore,CodInterno) --WHEN MATCHED -- AND Target.TranspCost <> Source.TranspCost AND @flgUpdate = 1 -- THEN -- UPDATE SET Descrizione = Source.Descrizione --WHEN NOT MATCHED BY SOURCE THEN -- DELETE OUTPUT $ACTION INTO @SummaryOfChanges;-- carico i cambiamenti in tabella SELECT * FROM dbo.AnagItems IF @test = 1 ROLLBACK ELSE COMMIT; -- Carico le modifiche fatte in variabile Testo SELECT Change + ' : ' + CONVERT(VARCHAR(10), COUNT(*)) FROM @SummaryOfChanges GROUP BY Change; /* reset dbo.AnagItems DELETE dbo.AnagItems DBCC CHECKIDENT ('dbo.AnagItems', reseed, 0) -- reset idx tabella dopo delete */ END]]> '' THEN [Descrizione] ELSE [CodCostruttore] END, '"', '')))) AS Descrizione -- tolgo eventuali " ,LTRIM(RTRIM(UPPER(NomeCostruttore))) AS NomeCostruttore ,LTRIM(RTRIM(UPPER(CodCostruttore))) AS CodCostruttore ,LTRIM(RTRIM(UPPER(CodSomaschini))) AS CodInterno ,Giacenza FROM [som_ita].[tmp_ImportRic_A] ) ,cteBis AS ( SELECT ai.* ,'MAG00' AS CodLocazione ,tmp.Giacenza FROM cteImportRicA AS tmp INNER JOIN dbo.AnagItems AS ai ON tmp.Famiglia = ai.Famiglia AND tmp.Descrizione = ai.Descrizione AND tmp.NomeCostruttore = ai.NomeCostruttore AND tmp.CodCostruttore = ai.CodCostruttore AND tmp.CodInterno = ai.CodInterno ) -- SELECT idxItem, 'MAG00' AS CodLocazione , Giacenza FROM cteBis WHERE idxItem = 1310 MERGE INTO dbo.MagRic AS Target USING ( SELECT idxItem,CodLocazione,SUM(Giacenza) AS Giacenza FROM cteBis GROUP BY idxItem ,CodLocazione ) AS Source ON Target.idxItem = Source.idxItem AND Target.CodLocazione = Source.CodLocazione WHEN NOT MATCHED BY TARGET THEN INSERT (idxItem,CodLocazione,Giacenza,dtLastUpd) VALUES (idxItem,CodLocazione,Giacenza,@DataImp) WHEN MATCHED THEN UPDATE SET Giacenza = Source.Giacenza ,dtLastUpd = @DataImp --WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $ACTION INTO @SummaryOfChanges;-- carico i cambiamenti in tabella SELECT * FROM dbo.MagRic IF @Test = 1 ROLLBACK ELSE COMMIT; -- Carico le modifiche fatte in variabile Testo SELECT Change + ' : ' + CONVERT(VARCHAR(10), COUNT(*)) FROM @SummaryOfChanges GROUP BY Change; END]]> corrisponde il tag "merge" finale * QUESTO SIGNIFICA che dopo primo import (becero) nei successivi deve guardare la tabella SinonimiTag, ho creato alcuni esempi * * vedi step procedura abbozzati sotto * */ --SELECT * FROM [som_ita].[tmp_ImportRic_A] WHERE Descrizione = '' --SELECT * FROM dbo.SinonimiTag -- delete FROM dbo.SinonimiTag --SELECT * FROM dbo.AnagTags -- delete FROM dbo.AnagTags --SELECT * FROM dbo.Tag2Item -- DELETE FROM dbo.Tag2Item DECLARE @Test BIT = 0; -- se 1 fa il rollback DECLARE @DataImp AS SMALLDATETIME = GETDATE(); DECLARE @SummaryOfChanges TABLE (Change VARCHAR(50)); BEGIN TRANSACTION;; -- ========================================================== -- NUOVI SINONIMI - se ho sinonimi mancanti li carico in modalità 1=1 TagCodeOrig=TagCode -- ========================================================== WITH cteImportRicA AS ( SELECT DISTINCT LTRIM(RTRIM(UPPER(Destinazione))) + '#' + LTRIM(RTRIM(UPPER(Gruppo))) AS TagCodeOrig -- TagCodeOrig FROM [som_ita].[tmp_ImportRic_A] WHERE Destinazione <> '' OR GRUPPO <> '' ) INSERT dbo.SinonimiTag SELECT cte.TagCodeOrig, cte.TagCodeOrig FROM cteImportRicA AS cte LEFT JOIN dbo.SinonimiTag AS st ON cte.TagCodeOrig = st.TagCodeOrig WHERE cte.TagCodeOrig <> '' AND st.TagCode IS NULL -- solo nuovi SELECT 'NEW SinonimiTag: ' + CAST ( @@ROWCOUNT AS VARCHAR(10) ) -- ========================================================== -- INSERT TAGS NUOVI -- ========================================================== INSERT dbo.AnagTags SELECT DISTINCT st.TagCode,'','' FROM dbo.SinonimiTag AS st LEFT JOIN dbo.AnagTags AS at ON st.TagCode = at.TagCode WHERE st.TagCode <> '' AND at.TagCode IS NULL -- solo nuovi SELECT 'NEW AnagTags: ' + CAST ( @@ROWCOUNT AS VARCHAR(10) ) -- ========================================================== -- INSERIMENTO NEW Item-TagCode -- ========================================================== ;WITH cteImportRicA -- normalizzo campi in ingresso AS ( SELECT LTRIM(RTRIM(UPPER(Gruppo))) AS Famiglia ,LTRIM(RTRIM(UPPER(REPLACE(CASE WHEN ISNULL([Descrizione], '') <> '' THEN [Descrizione] ELSE [CodCostruttore] END, '"', '')))) AS Descrizione -- tolgo eventuali " ,LTRIM(RTRIM(UPPER(NomeCostruttore))) AS NomeCostruttore ,LTRIM(RTRIM(UPPER(CodCostruttore))) AS CodCostruttore ,LTRIM(RTRIM(UPPER(CodSomaschini))) AS CodInterno ,LTRIM(RTRIM(UPPER(Destinazione))) + '#' + LTRIM(RTRIM(UPPER(Gruppo))) AS TagCodeOrig -- TagCodeOrig FROM [som_ita].[tmp_ImportRic_A] ) ,cteNew AS -- ricavo idxItem e TagCode effettivo ( SELECT DISTINCT ai.idxItem, st.TagCode FROM cteImportRicA AS tmp INNER JOIN dbo.AnagItems AS ai ON tmp.Famiglia = ai.Famiglia AND tmp.Descrizione = ai.Descrizione AND tmp.NomeCostruttore = ai.NomeCostruttore AND tmp.CodCostruttore = ai.CodCostruttore AND tmp.CodInterno = ai.CodInterno INNER JOIN dbo.SinonimiTag AS st ON tmp.TagCodeOrig = st.TagCodeOrig ) --SELECT idxItem, TagCode FROM cteNew -- inserisco new Item-TagCode MERGE INTO dbo.Tag2Item AS Target USING ( SELECT * FROM cteNew ) AS Source ON Target.idxItem = Source.idxItem AND Target.TagCode = Source.TagCode WHEN NOT MATCHED BY TARGET THEN INSERT (idxItem,TagCode) VALUES (idxItem,TagCode) -- WHEN MATCHED THEN UPDATE SET Giacenza = Source.Giacenza ,dtLastUpd = GETDATE() -- WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $ACTION INTO @SummaryOfChanges;-- carico i cambiamenti in tabella IF @Test = 1 ROLLBACK ELSE COMMIT; -- Carico le modifiche fatte in variabile Testo SELECT Change + ' Tag2Item: ' + CONVERT(VARCHAR(10), COUNT(*)) FROM @SummaryOfChanges GROUP BY Change; END]]>