Ok, dus mijn schema is dit:
Tabel: Timesheet_Hours
Kolommen:
- Timesheet_Id (PK, int)
- Staff_Id (int)
- BookedHours (int)
- Posted_Flag (boolean)
Dit is een extreem vereenvoudigde versie van de tabel, maar het zal dienen voor de doeleinden van deze uitleg. Neem aan dat een persoon maar één roosterrecord kan hebben.
Wat ik probeer te doen is records toevoegen aan een andere tabel, WorkLog genaamd. Aan elk record hier is een tijd gekoppeld. Als die tabel is bijgewerkt, wil ik ook Timesheet_Hours bijwerken.
Voordat ik Timesheet_Hours update, wil ik eerst controleren of de relevante Timesheets nog niet zijn gepost, en dan wil ik controleren of er in de eerste plaats een record is om bij te werken.
Het eerste deel van het if-statement, dat controleert of de timesheets nog niet zijn gepost, werkt prima. Het probleem is het tweede deel. Het controleert of het record dat het gaat bijwerken al bestaat. Het probleem is dat er altijd een fout optreedt.
NB: De onderstaande code is geëxtraheerd uit een opgeslagen procedure die wordt uitgevoerd door de update-, insert- en delete-triggers in de WorkLog-tabel. @PersonID is een van de parameters voor die tabel. De opgeslagen procedure werkt prima als ik commentaar geef op het tweede deel van deze verklaring.
IF EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Posted_Flag = 1
AND Staff_Id = @PersonID
)
BEGIN
RAISERROR('Timesheets have already been posted!', 16, 1)
ROLLBACK TRAN
END
ELSE
IF NOT EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Staff_Id = @PersonID
)
BEGIN
RAISERROR('Default list has not been loaded!', 16, 1)
ROLLBACK TRAN
END
Antwoord 1, autoriteit 100%
Heb je gecontroleerd of er inderdaad een rij is waar Staff_Id = @PersonID? Wat je hebt gepost werkt prima in een testscript, ervan uitgaande dat de rij bestaat. Als u commentaar geeft op de insert-instructie, wordt de fout weergegeven.
set nocount on
create table Timesheet_Hours (Staff_Id int, BookedHours int, Posted_Flag bit)
insert into Timesheet_Hours (Staff_Id, BookedHours, Posted_Flag) values (1, 5.5, 0)
declare @PersonID int
set @PersonID = 1
IF EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Posted_Flag = 1
AND Staff_Id = @PersonID
)
BEGIN
RAISERROR('Timesheets have already been posted!', 16, 1)
ROLLBACK TRAN
END
ELSE
IF NOT EXISTS
(
SELECT 1
FROM Timesheet_Hours
WHERE Staff_Id = @PersonID
)
BEGIN
RAISERROR('Default list has not been loaded!', 16, 1)
ROLLBACK TRAN
END
ELSE
print 'No problems here'
drop table Timesheet_Hours