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