
/*****************************************
* STORED stp_UDC_delete_byRdQ
*
* Elimina gli UDC associati ad un rapporto di qualità dato rapporto qualità
*
* Steamware, S.E.L.
* mod: 2012.02.14
*
****************************************/
create PROCEDURE [dbo].[stp_UDC_delete_byRdQ_NEW]
(
	@nRapQual NUMERIC(6,0),
	@ExecBatchInter BIT  = 0 -- 0 Eseguita in Batch , 1 in Interattivo
)
AS

-- NON USATA **** 
-- NUOVA VERSIONE X VERIFICARE NEL CASO SIA ESEGUITA IN UNA TRANSAZIONE PRECEDENTE --- NON USATA

-- Attenzione!!! Cancella tutti i cartellini degli UDC materia prima del rapporto qualità anche se sono scaricati 
-- comunque sono presenti nello StoricoCartellini ( perdo però a che RapportoQualità facevano riferimento, mettere riferimento nelle note? )

/*---------------------------------------
- Query x eliminazione UDC e tab 
- collegate dato un Rapp di Qualità
---------------------------------------*/

/*  NON FUNZIONA A CAUSA DEI TRIGGER
WITH cte AS  -- Tutti i cartellini su AS400 annullati che hanno un cartellino in RilPro
(
    SELECT r.UDC
    FROM RilPro.RapQual AS r
    INNER JOIN dbo.ElencoCartellini AS e
    ON r.UDC = e.UDC
    WHERE r.BenesQual = 'A'
)
	-- Cancello la posizione degli UDC a magazzino
	DELETE dbo.PosizioneUdcCorrente
	FROM dbo.PosizioneUdcCorrente AS P
		INNER JOIN RilPro.RapQual AS r
		ON p.UDC = r.UDC
	WHERE r.nRapQual = @nRapQual
	-- SELECT * FROM dbo.PosizioneUdcCorrente WHERE r.nRapQual = @nRapQual

    -- Se non sono ancora scaricati cancello il record movimento di scarico materia prima
	DELETE dbo.AS400_BatchConsumoMP
	FROM dbo.AS400_BatchConsumoMP AS b
		INNER JOIN RilPro.RapQual AS r
		ON b.UDC = r.UDC
	WHERE r.nRapQual = @nRapQual AND b.DataInvioAs IS NULL
    
    SELECT * FROM dbo.AS400_BatchConsumoMP
    	
    -- Cancellazione Cartellini Materia Prima di un Rapporto qualità
    SELECT * FROM dbo.ElencoCartellini
*/

SET NOCOUNT ON;
SET ANSI_NULLS OFF;
SET XACT_ABORT ON;       -- Se c'è un errore fa il rollback di tutta la transazione e non solo quella in errore
SET LOCK_TIMEOUT 600000; -- 10 min - Setto il tempo massimo di attesa del lock della tabella che è valido solo per la durata 
                         -- della connessione e di default è settato a -1 (infinito). ATTENZIONE che se viene dato un errore
                         -- di lock deve essere controllato 

IF @ExecBatchInter = 1     -- Se interattiva diminuisco il tempo di lock massimo a 15 sec
   SET LOCK_TIMEOUT 15000;

  DECLARE @TRAN AS INT, @State AS INT ;
  SET @TRAN =  @@TRANCOUNT;  SET @State = XACT_STATE();

-- Se per il rapporto qualità esiste almeno un cartellino UDC
IF ( SELECT COUNT(UDC) FROM RilPro.RapQual WHERE nRapQual = @nRapQual ) > 0
BEGIN
 BEGIN TRY;
  BEGIN TRANSACTION;
      
      -- =====================================================
      -- Cancella tutti gli UDC di un RQ 
      -- =====================================================
      SELECT ROW_NUMBER() OVER (ORDER BY UDC) AS Riga,UDC
      INTO #Temp
      FROM RilPro.RapQual
      WHERE nRapQual = @nRapQual;                -- Rapporto di qualità da cancellare

      DECLARE @Riga AS INT = 1
             ,@Fine AS INT = 0
             ,@UDC nVarchar(50);
      
      SELECT @Fine = MAX(Riga) FROM #Temp;

      WHILE @Riga <= @Fine
       BEGIN 
            -- Leggo UDC da cancellare uno alla volta
            SELECT @UDC = UDC FROM #Temp WHERE Riga = @Riga;

            -- ======================================================
            -- Cancella i dati del singolo UDC 
            -- =======================================================
            -- Attenzione che sulle cartelle ci sono dei trigger
            DELETE dbo.PosizioneUdcCorrente WHERE UDC = @UDC

            DELETE dbo.RelazUDC             WHERE UDC_child   = @UDC
            DELETE dbo.RelazUDC             WHERE UDC_parent  = @UDC
            DELETE dbo.ElencoCartellini     WHERE UDC = @UDC
          
            -- sgancio il cartellino AS400 da quello GMW ( cancellato )
            UPDATE RilPro.RapQual SET UDC = NULL WHERE UDC = @UDC

            --SELECT * FROM  dbo.PosizioneUdcCorrente WHERE UDC = @UDC
            --SELECT * FROM dbo.RelazUDC WHERE UDC_child = @UDC
            --SELECT * FROM dbo.ElencoCartellini WHERE UDC = @UDC
            --SELECT * FROM RilPro.RapQual WHERE UDC = @UDC

--       IF @nRapQual = 20 Select 1/0
       -- Select 1/0

        SET @Riga = @Riga + 1   -- Incremento contatore x UDC in tabella Temp
        -- SELECT @UDC
       END

       -- Se esiste la tabella #Temp la cancello
       IF OBJECT_ID(N'tempdb..#Temp') IS NOT NULL
         DROP TABLE #Temp;

   COMMIT TRANSACTION;
  END TRY
 
  BEGIN CATCH;

      --IF (ERROR_NUMBER() = 1222)             -- se vi è un lock per troppo tempo posso controllarlo x rieseguire
      --     BEGIN; PRINT 'Tabella Bloccata';  -- Segnalo l'errore specifico di lock
      --     END;
      --ELSE PRINT 'Errore Generico';          -- se l'errore non è un deadlock esco dal WHILE
  
      IF XACT_STATE() <> 0 AND @TRAN = 0  -- solo se vi sono transazioni aperte faccio il rollback ( da verificare nel caso sia richiamato 
          ROLLBACK TRANSACTION            -- all'interno di un'altra transazione )

      -- Cancello La Tabella TEMP se esiste ( messo x per sicurezza )
      -- EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='#Temp')
      -- *** QUI HO IL PROBLEMA SE XACT_STATE() = -1 perchè da errore 
      IF OBJECT_ID(N'tempdb..#Temp') IS NOT NULL
          DROP TABLE #Temp;
      
      -- Uso RAISERROR mandare in errore la procedura e x per tornare le info 
      -- sull'errore originale che ha portato l'esecuzione nel blocco CATCH
      DECLARE @ErrorNumber INT;
      DECLARE @ErrorMessage NVARCHAR(4000);
      DECLARE @ErrorSeverity INT;
      DECLARE @ErrorState INT;
      SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(), @ErrorNumber = ERROR_NUMBER();

      IF @ExecBatchInter = 0  -- Sollevo errore solo se richiesto dai parametri ( es. esecuzione da un Job Batch )
        RAISERROR (@ErrorMessage,@ErrorSeverity,@ErrorState);  -- Se non uso RAISERROR la procedura non mi da errore es. se schedulata
 
  END CATCH;

END
