>Nel senso che se la durata è espessa in anni inserisci il dato
>nella TextBox e ti calcolo la data di scadenza se invece non
>è un anno intero la data di scadenza se la calcola l'utente e
>tanti saluti!!
Quindi mi stai dicendo che la colonna durata rappresenta SEMPRE un numero espresso in anni?
OK, basta capirsi
>**Si tratta di Autorizzazioni Comunali che variano da Comune
>a Comune (ad esempio in alcuni Comuni la validità è di 3 anni
>"fine anno" e ciò vuol dire che se la data di rilascio è il 15/07/08
>la data di scadenza è 31/12/11.
Mmmm... ad ogni post le regole cambiano.
Teniamo buone queste, OK?
USE tempdb;
CREATE TABLE dbo.Tempistiche(
TempisticaID int NOT NULL IDENTITY PRIMARY KEY,
Data datetime NOT NULL,
Durata int NOT NULL DEFAULT 0,
Scadenza datetime NULL,
CONSTRAINT CHK_Durata CHECK(Durata >= 0)
);
GO
CREATE FUNCTION dbo.ufn_GetLastYearDay(
@Today datetime
)
RETURNS datetime
BEGIN
RETURN DATEADD(year, DATEDIFF(year, 0, @Today) + 1, -1);
END
GO
CREATE TRIGGER dbo.trIU_Tempistiche
ON dbo.Tempistiche
AFTER INSERT, UPDATE
AS
IF UPDATE(Data) OR UPDATE(Durata)
BEGIN
UPDATE T
SET Scadenza = DATEADD(year, I.Durata, dbo.ufn_GetLastYearDay(I.Data))
FROM dbo.Tempistiche AS T
JOIN INSERTED AS I
ON T.TempisticaID = I.TempisticaID
WHERE I.Durata > 0;
END
GO
INSERT dbo.Tempistiche(Data, Durata) VALUES('20080101', 3);
INSERT dbo.Tempistiche(Data, Durata) VALUES('20080715', 3);
INSERT dbo.Tempistiche(Data, Durata) VALUES('20081231', 3);
INSERT dbo.Tempistiche(Data, Durata) VALUES
('20070101', 5)
, ('20070715', 5)
, ('20071231', 5);
INSERT dbo.Tempistiche (Data, Scadenza) VALUES('20060101', '20101231');
SELECT *
FROM dbo.Tempistiche;
/* Output:
TempisticaID Data Durata Scadenza
------------ ----------------------- ----------- -----------------------
1 2008-01-01 00:00:00.000 3 2011-12-31 00:00:00.000
2 2008-07-15 00:00:00.000 3 2011-12-31 00:00:00.000
3 2008-12-31 00:00:00.000 3 2011-12-31 00:00:00.000
4 2007-01-01 00:00:00.000 5 2012-12-31 00:00:00.000
5 2007-07-15 00:00:00.000 5 2012-12-31 00:00:00.000
6 2007-12-31 00:00:00.000 5 2012-12-31 00:00:00.000
7 2006-01-01 00:00:00.000 0 2010-12-31 00:00:00.000
(7 row(s) affected)
*/
UPDATE dbo.Tempistiche
SET Durata = 6
WHERE Data BETWEEN '20080101' AND '20081231';
SELECT *
FROM dbo.Tempistiche;
/* Output:
TempisticaID Data Durata Scadenza
------------ ----------------------- ----------- -----------------------
1 2008-01-01 00:00:00.000 6 2014-12-31 00:00:00.000
2 2008-07-15 00:00:00.000 6 2014-12-31 00:00:00.000
3 2008-12-31 00:00:00.000 6 2014-12-31 00:00:00.000
4 2007-01-01 00:00:00.000 5 2012-12-31 00:00:00.000
5 2007-07-15 00:00:00.000 5 2012-12-31 00:00:00.000
6 2007-12-31 00:00:00.000 5 2012-12-31 00:00:00.000
7 2006-01-01 00:00:00.000 0 2010-12-31 00:00:00.000
(7 row(s) affected)
*/
DROP FUNCTION dbo.ufn_GetLastYearDay;
DROP TABLE dbo.Tempistiche;
La funzione scalare ufn_GetLastYearDay si preoccupa di calcolare l'ultimo giorno dell'anno della data passata come argomento, mentre il trigger trIU_Tempistiche aggiornerà la colonna Scadenza in fase di inserimento oppure di aggiornamento delle colonne Data o Durata.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org