Un trigger qui ne fonctionne pas à 100%

cs_Aldo38 Messages postés 4 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 22 août 2009 - 22 août 2009 à 10:57
 haydii - 10 juin 2013 à 18:18
Bonjours à toutes et à tous,
Par soft je crée une facture composée d'un enregistrement principale dans une table facture,
suivi d'enregistrements dans une autre table(TAB_ACT), lié par un ID à la table facture.
J'ai écrit un trigger qui devait me permettre de mettre à jour, dans le cas d'une insertion
ou d'un update, une colonne dans la table liée TAB_ACT (il s'agit d'un ID qui fait référence à une troisième table).

Le problème auquel je suis confronté est le suivant :
Lorsque je dois mettre à jour plusieurs enregistrements de la table liée (TAB_ACT), un seul
enregistrement est mis à jour.
J'avoue avoir essayé plusieurs syntaxes, mais je suis sec. Je n'arrive pas à mettre à jour
tous les enregistrements de la table liée en insert ou en update.

Voici le trigger :
CREATE TRIGGER TR_UpdACT_sql
ON TAB_ACT FOR INSERT,UPDATE as

declare
@ActRef varchar(10),
@ActId int,
@ActIdInter int,
@ActNature tinyint,
@ActDate datetime

begin
select @ActRef =TAB_ACT.ACTREF, @ActId = TAB_ACT.ACTID, @ActNature = TAB_ACT.ACTNATURE,
@ActDate = TAB_ACT.ACTDATE FROM TAB_ACT
IF (@ActId is NULL)
BEGIN
IF (@ActNature=0)
BEGIN
-- Ici je recherche l'ID que je vais mettre dans la colonne ACTID de la tabe TAB_ACT
select @ActIdInter (select DICT_ACT.ACTID from DICT_ACT WHERE DICT_ACT.ACTCODE
@ActRef AND DICT_ACT.APPLICDATE IS NOT NULL AND CONVERT
(datetime,DICT_ACT.APPLICDATE,103)=( select MAX(DICT_ACT.APPLICDATE)
FROM DICT_ACT WHERE DICT_ACT.ACTCODE = @ActRef AND (DICT_ACT.EXPIRADATE IS NULL OR
DICT_ACT.EXPIRADATE > CONVERT(datetime, @ActDate,103))
AND DICT_ACT.APPLICDATE < CONVERT(datetime, @ActDate,103)))
-- Ici je mets à jour l'enregistrement. Quand je crée deux enregistrements il semblerait
- que seul le deuxième soit mis à jour
UPDATE TAB_ACT SET ACTID @ActIdInter where ACTREF @ActRef and ACTDATE = @ActDate
END
END
END

Je ne suis pas expert en procédure stokckée (je fais de l'auto formation), alors si quelqu'un a une idée, elle sera la bienvenue. Merci par avance.

2 réponses

nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
24 août 2009 à 11:47
Déjà si je peux me permettre, un code lisible et correctement indenté permet un debugage plus facile, la c'est tout simplement illisible et rebutoire.

Ensuite ton code me fait tout simplement bondir...

select @ActRef =TAB_ACT.ACTREF, @ActId = TAB_ACT.ACTID, @ActNature = TAB_ACT.ACTNATURE, 
@ActDate = TAB_ACT.ACTDATE FROM TAB_ACT 

Sans clause WHERE ? donc tu n'a aucune idée de la ligne renvoyé ... un fois de temps a autre c'est celle que tu voulais tu as de la chance, les autres fois ce sont des lignes qui ne t'interressent pas ... Magie de l'aléatoire :)

La correction ? assure toi que cette requete ne te renvois qu'une ligne et une seule ! (et tant qu'a faire, celle dont tu as besoin !)
0
svp aidez moi a trouver le résultat

ECRire le script de création d'aun déclencheur a permettant d'incrémenter automatiquelent le champ matricule de table personnel
0
Rejoignez-nous