Torna al Thread

SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO ALTER TRIGGER [DETTAGLIO_TURNI] ON [dbo].[ALBO_TURNO] AFTER INSERT AS -- DICHIARAZIONE VARIABILI... DECLARE @tipo_albo as VARCHAR(50) DECLARE @descrizione as VARCHAR(100) DECLARE @idturno as INT DECLARE @n_dif as INT DECLARE @dett_idturno as INT DECLARE @data_inizio as DATETIME DECLARE @data_fine as DATETIME DECLARE @totale_giorni as INT DECLARE @tipo_albo_A as VARCHAR(9) DECLARE @tipo_albo_B as VARCHAR(9) DECLARE @data_odierna as DATETIME DECLARE @tot_avvocati as INT DECLARE @avv_giorno as INT DECLARE @avv_giornoA as INT DECLARE @avv_giornoB as INT DECLARE @conta_giorni as INT DECLARE @incremento_giorni as INT DECLARE @incr_dif_giorno as INT DECLARE @nuovo_idturno as INT DECLARE @idalboturno as INT DECLARE @old_turni as INT DECLARE @tot_giorniA as INT DECLARE @tot_giorniB as INT DECLARE @conta_giorni_incremento as INT DECLARE @conta_avvocati as INT DECLARE @avv as INT DECLARE @altri_turni AS INT DECLARE @neg_giorni_incremento as INT ------------------------------------------------------------------------------------------------------- -- SET VARIABILI PER EVITARE PROBLEMI CON NULL o 0 SET @totale_giorni = 0 SET @tot_avvocati = 0 SET @avv_giorno = 0 SET @conta_giorni = 0 SET @incremento_giorni = 0 SET @incr_dif_giorno = 0 SET @idalboturno = 0 SET @old_turni = 0 -------------------------------------------------------------------------------------------------------- -- seleziona il turno inserito da tabella temporanea INSERTED... --PER TRIGGER SELECT @tipo_albo = Albo_turno.Tipo, @data_inizio = Albo_turno.Inizio, @data_fine = Albo_turno.Fine, @descrizione = Albo_turno.Descrizione, @idturno = Albo_turno.IdTurno, @n_dif = Albo_turno.NUM_MINMO_AVVOCATI_GIORNO FROM INSERTED AS T_TURNI JOIN Albo_turno ON ( Albo_turno.IdTurno = T_TURNI.IdTurno ) SET @nuovo_idturno = @idturno + 1 -- conta i giorni (passo le variabili da db) SELECT @totale_giorni = DATEDIFF(dd, @data_inizio, @data_fine) -- select da vista avvocati per tipo difensori selezionato.. (controllare anche data_fine_iscrizione?) IF @tipo_albo = 'DIFO' BEGIN SET @tipo_albo_A = 'DIFM' SET @tipo_albo_B = 'CPT' -- select per contare.. SELECT @tot_avvocati = COUNT(*) FROM VALBO_ISCRIZIONE_DIF_ORDINARI SELECT @tot_avvocati As tot_avvocati DECLARE Avvocati CURSOR LOCAL SCROLL -- select per recuperare id_anagrafica ed utilizzare il Cursore FOR SELECT ID_ANAGRAFICA FROM VALBO_ISCRIZIONE_DIF_ORDINARI END IF @tipo_albo = 'DIFM' BEGIN SET @tipo_albo_A = 'DIFO' SET @tipo_albo_B = 'CPT' -- select per contare.. SELECT @tot_avvocati = COUNT(*) FROM VALBO_ISCRIZIONE_DIF_MINORI SELECT @tot_avvocati as tot_avvocati -- dichiarazione CURSORE DECLARE Avvocati CURSOR LOCAL SCROLL FOR SELECT ID_ANAGRAFICA FROM VALBO_ISCRIZIONE_DIF_MINORI END IF @tipo_albo = 'CPT' BEGIN SET @tipo_albo_A = 'DIFM' SET @tipo_albo_B = 'DIFO' -- select per contare.. SELECT @tot_avvocati = COUNT(*) FROM VALBO_ISCRIZIONE_DIF_CPT SELECT @tot_avvocati as tot_avvocati DECLARE Avvocati CURSOR LOCAL SCROLL -- select per recuperare id_anagrafica ed utilizzare il Cursore FOR SELECT ID_ANAGRAFICA FROM VALBO_ISCRIZIONE_DIF_CPT END OPEN Avvocati DECLARE @idanagrafica varchar(9) -- GIORNI PER AVVOCATO -- tot_giorni * n_dif_minimo / tot_avvocati = tot_giorni_avvocato (con intero successivo) SET @incremento_giorni = ((@totale_giorni * @n_dif)/@tot_avvocati) -- controllo se c'è resto.. IF ((@totale_giorni * @n_dif)%@tot_avvocati) <> 0 BEGIN SET @incremento_giorni = @incremento_giorni + 1 END -- ogni avvocato deve essere difensore per almeno 2 giorni di seguito.. -- quindi se l'incremento è minore di 2 deve essere uguale a 2 IF @incremento_giorni < '2' BEGIN SET @incremento_giorni = '2' END -- AVVOCATI AL GIORNO -- numero variabile.. prendere in considerazione il primo intero e l'intero successivo.. SET @avv_giorno = (@incremento_giorni * @tot_avvocati)/@totale_giorni SET @avv_giornoA = @avv_giorno -- controllo il resto della divisione.. se <> 0 @avv_giornoB = @avv_giorno + 1.. -- altrimenti i due valori sono uguali.. IF ((@incremento_giorni * @tot_avvocati)%@totale_giorni) <> 0 BEGIN SET @avv_giornoB = @avv_giorno + 1 END ELSE BEGIN SET @avv_giornoB = @avv_giorno END -- conteggi giorni totali difensori... -- giorni con N difensori SET @tot_giorniA = ((@avv_giornoA * @incremento_giorni)/@totale_giorni) -- giorni con M difensori SET @tot_giorniB = @totale_giorni - @tot_giorniA -- ciclo per totale dei giorni SET @conta_giorni = 1 SET @conta_giorni_incremento = 0 SET @conta_avvocati = 0 WHILE @conta_giorni <= @totale_giorni BEGIN -- ogni giorno @avv deve essere ZERO SET @avv = 0 IF @conta_giorni <= @tot_giorniA BEGIN SET @avv_giorno = @avv_giornoA END ELSE BEGIN SET @avv_giorno = @avv_giornoB END -- ciclo per ogni giorno per totale di avvocati/giorno SET @incr_dif_giorno = 1 WHILE @incr_dif_giorno <= @avv_giorno BEGIN SET @conta_avvocati = @conta_avvocati + 1 IF @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM Avvocati INTO @idanagrafica END ELSE BEGIN FETCH FIRST FROM Avvocati INTO @idanagrafica END SET @data_odierna = DATEADD(dd, (@conta_giorni-1), @data_inizio) SET @neg_giorni_incremento = -1 * @conta_giorni_incremento SET @old_turni = 0 SET @altri_turni = 0 -- query che controlla i turni già assegnati SELECT @old_turni = COUNT(*) FROM ALBO_TURNO_DETTAGLIO_1 CROSS JOIN ALBO_TURNO WHERE ALBO_TURNO_DETTAGLIO_1.idalbo = @idanagrafica AND ( ALBO_TURNO.Tipo = @tipo_albo_A OR ALBO_TURNO.Tipo = @tipo_albo_B ) AND ( ALBO_TURNO_DETTAGLIO_1.Data BETWEEN DATEADD(dd, (@neg_giorni_incremento + 1), @data_odierna) AND DATEADD(dd, (@incremento_giorni-@conta_giorni_incremento), @data_odierna) ) SELECT @old_turni As old_turni -- (nel caso in cui il ciclo ricominci..) controllare che questo avvocato non abbia -- già un set di giorni in questo turno... SELECT @altri_turni = COUNT(*) FROM ALBO_TURNO_DETTAGLIO_1 WHERE ALBO_TURNO_DETTAGLIO_1.idalbo = @idanagrafica AND ALBO_TURNO_DETTAGLIO_1.idturno = @nuovo_idturno SELECT @altri_turni As altri_turni IF (@old_turni = 0 AND (@altri_turni = 0 OR @altri_turni <= @incremento_giorni)) BEGIN -- se non ci sono turni sovraposti assegna il turno all'avvocato x N giorni (incremento_giorni) -- seleziono il dettaglio con idturno max per aumentare di uno... SET @idalboturno = 1 SET @dett_idturno = 1 SELECT @dett_idturno = MAX(idalboturno) FROM Albo_turno_dettaglio_1 if (@dett_idturno) = null begin set @dett_idturno = 0 end SET @idalboturno = @dett_idturno + 1 INSERT Albo_turno_dettaglio_1 ( idalboturno, idalbo, idturno, data ) VALUES ( @idalboturno, @idanagrafica, -- da cursore @nuovo_idturno, @data_odierna ) -- valorizza il numero degli avvocati del giorno + 1 SET @incr_dif_giorno = @incr_dif_giorno + 1 END ELSE BEGIN -- non incrementare la variabile... SET @incr_dif_giorno = @incr_dif_giorno END END SET @conta_giorni_incremento = (@conta_giorni_incremento + 1) IF @conta_giorni_incremento <= @incremento_giorni BEGIN -- torno indietro di N avvocati SET @avv = (-1 * @conta_avvocati) FETCH RELATIVE @avv FROM Avvocati INTO @idanagrafica SET @conta_avvocati = 0 END ELSE BEGIN SET @conta_giorni_incremento = 0 SET @conta_avvocati = 0 END SET @conta_giorni = @conta_giorni + 1 END CLOSE Avvocati DEALLOCATE Avvocati GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5