automatyczne uzupełnianie jednej tabeli po zmianie w innej

0

Witam,
Dane wejściowe:

MS SQL 2008 R2
Baza danych: baza
tabele w bazie:
pracownicy z polami NRID[int], ZATRUDNIONY[datetime], ZWOLNIONY[datetime]
kalendarze z polami: pracNRID, DATA

Proszę o pomoc w rozwiązaniu problemu w jaki sposób uzupełniać tabelę kalendarze w przypadku dodania pracownika lub po zmianie wartości ZATRUDNIONY/ZWOLNIONY.
jeden wiersz w tabeli kalendarze przechowuje jeden miesiąc pracy danego pracownika, czyli
dla NTID = 10, ZATRUDNIONY=2012-02-01 i ZWOLNIONY=2013-05-30
powinno zostać utworzonych 16 rekordów
10,2012-02-01
10,2012-03-01
10,2012-04-01
...
10,2013-05-01

Jak to zrobić?

Z góry wielkie dzięki za pomoc.

0

a jak pracuje cały czas, czyli zwolniony jest null to ile tych rekordów ma utworzyć? BTW jakaś mocno nieżyciowa ta struktura z kalendarzem

0

Zatrudniony / zwolniony is not null

jeśli chodzi o strukturę,
wszelkie propozycje / uwagi mile widziane

0

a skąd dzisiaj wiesz kiedy krystyna z gazowni będzie zwolniona?

0

bo podpisuje odpowiednią umowę (ale to nie jest sednem sprawy)

w przypadku gdy zostnie wcześniej zwolniona rekordy dla niej na czas "przyszły" mogą pozostać w tabeli kalendarze

0

jest bo ja np. cały czas staram się zrozumieć po co Ci te rekordy w tabeli kalendarz

0

hmmmmm
powiem tak...
takie jest zadanie

0

to w trigerze odpalasz procedurę, która Ci wstawi żądaną ilość rekordów. Nie wiem na ile mssql pozwala w trigerach wykonywać trochę bardziej skomplikowane operacje ale może zamiast osobną procedurą będzie to można zrobić bezpośrednio w trigerze

0

tak się domyślałem
ale bardziej mnie interesuje teraz ja to zrobić
jak w triggerze zawrzeć reakcję na A0 nowy rekord, b) modyfikację pól w istniejącym rekordzie
no i jak potem wstawiać rekordy do kalendarzy zwłaszcza w sytuacji zmiany pól w pracowniku już istniejącym (sprawdzać czy już dana data dla pracownika istnieje i aby dodać tylko nowe daty)

dzięki abrakadaber za zainteresowanie

0

czy ktoś może rzucić jakimś przykładem, linkiem?

0

ale przykładem czego? Opis T-SQLa masz na stronach MSa. Poczytaj o triggerach i o procedurach składowanych (stored procedures). Napisz konkretnie z czym masz problem. Przecież jak jest wstawiany nowy rekord to w tym momencie znasz obie daty - wystarczy zrobić pętlę od daty do daty i w niej wstawiać rekordy. Tak samo przy zmianie rekordu tylko wypadało by usunąć rekordy, które już się w nowej dacie nie łapią i dodać nowe.

0

pierwszy raz tworzę wyzwalacze i procedury więc proszę o wyrozumiałość
wypociłem coś takiego:


CREATE Trigger UpdateOsobyGraf
On Osoby
AFTER Insert,Update
AS
BEGIN
Declare @Os_Recid Int;
Declare @Os_grafikOD datetime;
Declare @Os_grafikDO datetime;
Declare @Os_grafikDO_OLD datetime;

SET @Os_Recid = (SELECT i.RecId FROM inserted i);
SET @Os_grafikOD = (SELECT i.GrafikOD From inserted i);
SET @Os_grafikDO = (SELECT i.GrafikDO From inserted i);
SET @Os_grafikDO_OLD = (SELECT d.GrafikDO From deleted d);
SET NOCOUNT ON
IF(UPDATE (GrafikOD) OR UPDATE (GrafikDO))
BEGIN
IF (@Os_grafikDO_OLD IS NULL) -- jeżeli nowy wiersz w tabeli Osoby to dodaj wszystkie miesiace OD..DO
BEGIN
WHILE (@Os_grafikOD<=@Os_grafikDO)
BEGIN
INSERT INTO GrafikPosilkow ([OsobaID],[DataGraf]) VALUES (@Os_Recid,@Os_grafikOD)
SET @Os_grafikOD = DateAdd(month, 1, @Os_grafikOD)
END
END
ELSE --jeżeli update dodaj wszystkie miesiące OD..DO pod warunkiem że takich rekordów jeszczenie ma
BEGIN
WHILE (@Os_grafikOD <= @Os_grafikDO)
BEGIN
IF NOT EXISTS (SELECT 1 FROM GrafikPosilkow gp WHERE gp.osobaID=@Os_Recid AND gp.DataGraf=@Os_grafikOD)
BEGIN
INSERT INTO GrafikPosilkow ([OsobaID],[DataGraf]) VALUES (@Os_Recid,@Os_grafikOD)
END
SET @Os_grafikOD = DateAdd(month, 1, @Os_grafikOD)
END
END
END
END

SET NOCOUNT OFF

i generalnie działa
ale wydaje mi się, że jest to mało optymalne rozwiązanie
poza tym jeśli zostanie przedział zmniejszony procedura powinna wykonać update na tabeli GrafikiPosilkow
i dla wierszy pozostałych (czyli between @Os_grafikDO AND @Os_grafikDO_OLD) w kolumnie GrafikiPosilkow.Pomin dać 1 ale nie mam pojęcia jak to jeszcze wcisnąć

Proszę radę jak powyższą procedurę zoptymalizować i dodać opisany warunek

z góry wielkie dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1