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);


Comentarii

Postări populare de pe acest blog

RpiCar

DevExpress Theme Changer ...