Ok, alors mon schéma est le suivant:
Tableau: Timesheet_Hours
Colonnes:
Ceci est une version extrêmement simplifiée du tableau, mais elle servira aux fins de cette explication. Supposons qu'une personne ne peut avoir qu'un seul enregistrement de feuille de temps.
Ce que j'essaie de faire est d'ajouter des enregistrements à une autre table, appelée WorkLog. Chaque enregistrement ici a un temps associé. Lorsque cette table est mise à jour, je souhaite également mettre à jour Timesheet_Hours.
Avant de mettre à jour Timesheet_Hours, je souhaite d'abord vérifier que les feuilles de temps pertinentes n'ont pas encore été publiées, puis vérifier s'il existe réellement un enregistrement à mettre à jour.
La première partie de l'instruction if, qui vérifie que les feuilles de temps n'ont pas déjà été postées, fonctionne bien. Le problème est la deuxième partie. C'est checkint pour voir que le disque qu'il va mettre à jour existe déjà. Le problème est que cela soulève toujours une erreur.
NB: Le code ci-dessous est extrait d'une procédure stockée exécutée par les déclencheurs update, insert et delete de la table WorkLog. @PersonID est l'un des paramètres de cette table. La procédure stockée fonctionne bien si je commente la deuxième partie de cette déclaration.
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
Avez-vous vérifié qu'il existe en fait une ligne où Staff_Id = @PersonID? Ce que vous avez posté fonctionne bien dans un script de test, en supposant que la ligne existe. Si vous commentez l'instruction insert, l'erreur est alors générée.
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