DeLa - PanaLa
Recent a trebuit sa implementez un sistem in care sa am istoric al diferitelor inregistrari. Spre exemplu persoanele isi pot schimba totul mai putin CNP, Data Nasterii; astfel a trebuit sa creez o procedura care sa se ocupe de un camp din tabela mea istoric si anume campul PanaLa(date).
Structura istoricului ar arata astfel:
ID | FK | ...... | DeLa | PanaLa
Ce trebuie sa se intample in acest trigger?
Parcurg inregistrare cu inregistrare si incepand cu a II-a inregistrare inlocuiesc recurent PanaLa al inregistrarii anterioare cu DeLa -1(o zi) al inregistrarii actuale, iar la sfarsit dupa ce ies din bucla am grija sa pun la ultima inregistrare PanaLa gen 01.01.3000 o data din viitor.
Iata procedura aceasta primeste ca parametru NumeleTabelei, Denumirea campului FK dupa care filtreaza datele si bine inteles ID-ul campului
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[alex_Manage_DeLa_PanaLa]
@TableName nvarchar(max),
@ForeignKeyName nvarchar(max),
@ForeignKeyID int
AS
Declare @SqlExec nvarchar(max);
Set @SqlExec = '
Declare @parID int;
Declare @parDeLa date;
Declare @Flag bit;
Set @Flag = 0;
Declare
crsTemp
Cursor For
Select
Id, DeLa
From
' + @TableName + '
Order By
Id
Where
' + @ForeignKeyName + ' = ' + Cast(@ForeignKeyID As nvarchar(max)) +';
OPEN crsTemp;
FETCH NEXT FROM crsTemp;
WHILE @@FETCH_STATUS = 0
BEGIN
If @Flag = 1
BEGIN
Update
' + @TableName + '
Set
PanaLa = DATEADD(day,DATEDIFF(day,0,@parDeLa)-1,0)
Where
Id = @parID
END
ELSE
If @Flag = 0
BEGIN
Set @Flag = 1;
END
FETCH NEXT FROM crsTemp Into @parID, @parDeLa;
END
Update
' + @TableName + '
Set
PanaLa = Cast( ''01/01/3000'' As DateTime )
Where
Id = @parID
CLOSE crsTemp;
DEALLOCATE crsTemp;
';
Execute(@SqlExec);
Structura istoricului ar arata astfel:
ID | FK | ...... | DeLa | PanaLa
Ce trebuie sa se intample in acest trigger?
Parcurg inregistrare cu inregistrare si incepand cu a II-a inregistrare inlocuiesc recurent PanaLa al inregistrarii anterioare cu DeLa -1(o zi) al inregistrarii actuale, iar la sfarsit dupa ce ies din bucla am grija sa pun la ultima inregistrare PanaLa gen 01.01.3000 o data din viitor.
Iata procedura aceasta primeste ca parametru NumeleTabelei, Denumirea campului FK dupa care filtreaza datele si bine inteles ID-ul campului
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[alex_Manage_DeLa_PanaLa]
@TableName nvarchar(max),
@ForeignKeyName nvarchar(max),
@ForeignKeyID int
AS
Declare @SqlExec nvarchar(max);
Set @SqlExec = '
Declare @parID int;
Declare @parDeLa date;
Declare @Flag bit;
Set @Flag = 0;
Declare
crsTemp
Cursor For
Select
Id, DeLa
From
' + @TableName + '
Order By
Id
Where
' + @ForeignKeyName + ' = ' + Cast(@ForeignKeyID As nvarchar(max)) +';
OPEN crsTemp;
FETCH NEXT FROM crsTemp;
WHILE @@FETCH_STATUS = 0
BEGIN
If @Flag = 1
BEGIN
Update
' + @TableName + '
Set
PanaLa = DATEADD(day,DATEDIFF(day,0,@parDeLa)-1,0)
Where
Id = @parID
END
ELSE
If @Flag = 0
BEGIN
Set @Flag = 1;
END
FETCH NEXT FROM crsTemp Into @parID, @parDeLa;
END
Update
' + @TableName + '
Set
PanaLa = Cast( ''01/01/3000'' As DateTime )
Where
Id = @parID
CLOSE crsTemp;
DEALLOCATE crsTemp;
';
Execute(@SqlExec);
Comentarii