· 9 years ago · Jan 11, 2017, 02:50 PM
1-- Grupp 3 - (av de som gör om momentet)
2
3-- Trigger för säker tilldelning av befattningshavare
4CREATE TRIGGER BefattningsTilldelning
5ON Befattningshavare
6INSTEAD OF INSERT, UPDATE AS
7
8DECLARE @aktiviteter table (
9 descriptionz VARCHAR(300),
10 startDate Date,
11 endDate Date
12)
13
14DECLARE @nyaktiviteter table (
15 descriptionz VARCHAR(300),
16 sDate Date,
17 eDate Date
18)
19DECLARE @start AS DATE
20DECLARE @end AS DATE
21
22DECLARE @start2 AS DATE
23
24-- Plockar ut de aktiviteter som den anställda har sedan innan
25INSERT INTO @aktiviteter
26SELECT Aktivitet.Arbetsuppgift, Aktivitet.StartDatum, Aktivitet.SlutDatum
27FROM inserted, Befattningshavare, Befattning, Aktivitet
28WHERE inserted.AnställningsNr = Befattningshavare.AnställningsNr
29AND Befattningshavare.BefattningsNr = Befattning.BefattningsNr
30AND Befattning.ProjektNr = Befattningshavare.ProjektNr
31AND Befattning.ProjektNr = Aktivitet.ProjektNr
32AND Befattning.BefattningsNr = Aktivitet.BefattningsNr
33
34-- Plockar ut aktiviteterna för befattningen vi vill tilldela
35INSERT INTO @nyaktiviteter
36SELECT Aktivitet.Arbetsuppgift, Aktivitet.StartDatum, Aktivitet.SlutDatum
37FROM inserted, Befattning, Aktivitet
38WHERE inserted.BefattningsNr = Befattning.BefattningsNr
39AND inserted.ProjektNr = Befattning.ProjektNr
40AND Befattning.BefattningsNr = Aktivitet.BefattningsNr
41AND Befattning.ProjektNr = Aktivitet.ProjektNr
42
43
44SELECT @start2 = sDate
45FROM @nyAktiviteter
46WHERE sDate <= GETDATE()
47
48IF(@start2 is not null AND @start2 != '')
49BEGIN
50 RAISERROR('Denna befattning har en aktivitet som redan påbörjats och får därmed inte ändras/tilldelas',16,1)
51END
52ELSE
53BEGIN
54
55 -- Går igenom aktivitetslistorna för att leta efter datumkollisioner
56 SELECT @start = startDate, @end = endDate
57 FROM @aktiviteter, @nyaktiviteter
58 WHERE
59 (sDate >= startDate AND sDate <= endDate)
60 OR
61 (sDate <= startDate AND eDate >= startDate)
62
63 -- Om ingen kollision skedde
64 IF ((@start is null OR @start = '') AND (@end is null OR @end = ''))
65 BEGIN
66 -- Om det är insert
67 IF NOT EXISTS (SELECT * FROM DELETED)
68 BEGIN
69 INSERT INTO Befattningshavare
70 SELECT ProjektNr, AnställningsNr, BefattningsNr FROM inserted
71 END
72
73 -- Om det är update
74 ELSE
75 BEGIN
76 DECLARE @pNR AS Char(5)
77 DECLARE @aNR AS int
78 DECLARE @bNR AS int
79
80 SELECT @pnr = inserted.ProjektNr, @aNR = inserted.AnställningsNr, @bNR = inserted.BefattningsNr
81 FROM inserted
82
83 UPDATE Befattningshavare SET AnställningsNr = @aNR WHERE @pNR = Befattningshavare.Projektnr AND @bNR = Befattningshavare.BefattningsNr
84 END
85 END
86
87 -- Om kollision skedde
88 ELSE
89 BEGIN
90 RAISERROR('En kollision i datum har skett. Befattningen kunde inte läggas till eller ändras.',16,1)
91 END
92END
93
94-- Trigger för säker borttagning av befattning
95GO
96CREATE TRIGGER BefattningsBorttagning
97ON Befattning
98INSTEAD OF DELETE AS
99
100DECLARE @pNR AS CHAR(5)
101DECLARE @bNR AS int
102
103DECLARE @p AS Char(5)
104DECLARE @b AS int
105
106SELECT @p = deleted.ProjektNr, @b = deleted.BefattningsNr
107FROM deleted
108
109SELECT @pNR = deleted.Projektnr, @bNR = deleted.BefattningsNr
110FROM Befattningshavare, deleted
111WHERE Befattningshavare.ProjektNr = deleted.ProjektNr
112AND Befattningshavare.BefattningsNr = deleted.BefattningsNr
113
114IF ((@pNR is null OR @pNR = '') AND (@bNR is null OR @bNR = ''))
115BEGIN
116 DELETE FROM Befattning WHERE ProjektNr = @p AND BefattningsNr = @b
117END
118ELSE
119BEGIN
120
121 DECLARE @start AS DATE
122
123 SELECT @start = Aktivitet.StartDatum
124 FROM Aktivitet, deleted
125 WHERE Aktivitet.BefattningsNr = deleted.BefattningsNr
126 AND Aktivitet.ProjektNr = deleted.ProjektNr
127 AND Aktivitet.StartDatum <= GETDATE()
128
129 IF (@start is null OR @start = '')
130 BEGIN
131 DELETE FROM Befattning WHERE ProjektNr = @p AND BefattningsNr = @b
132 END
133 ELSE
134 BEGIN
135 RAISERROR('Befattningen kan ej tas bort. Anställd har redan börjat jobba.', 16, 1)
136 END
137END