Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Trigger/déclencheur insert (MSDE 2000 + ACCESS)

3 réponses
Avatar
Pierre Fauconnier
Bonjour

Je travaille avec MSDE 2000 géré par Access.

J'ai une table Contrats et une table Commandes. Des commandes peuvent être
enregistrées, liées ou non à un contrat.
Je souhaite utiliser un déclencheur pour mettre ma table contrats à jour
avec les qtés commandées, à chaque ajout de commande.
Je pensais utiliser ceci:
-----
ALTER TRIGGER AjoutCommande
ON dbo.tCommandes
for insert
as
update tcontrats set concdeqte = inserted.comqte from tcontrats inner join
inserted on tcontrats.conid = inserted.conid
-----

Le déclencheur fonctionne lorsque j'ai un numéro de contrat dans ma table de
commandes. Par contre, lorsque ma commande n'est pas liée à un contrat, j'ai
un message qui me dit, en substance:
"Conflit d'écriture: Cet enregistrement a été modifié par un autre
utilisateur...Si vous continuez, vous remplacerez les données de l'autre
utilisateur..."
Si j'annule, ma commande est bien enregistrée, si je réponds "sauvegarder
l'enregistrement", il me le sauve une deuxième fois...

C'est évidemment gênant pour l'utilisateur final d'avoir ce genre de
messages...

Est-ce dû à mon déclencheur? J'ai essayé avec
if update(conid)
update ...

Mais je n'arrive pas à fermer mon bloc IF. Si je mets END, il refuse, ENDIF
aussi.

Merci pour l'aide que vous pourrez m'apporter.

--
Pierre Fauconnier (pierre.fauconnier@nospam.nospam) (Skype:
pierre_fauconnier)
"Les choses qui n'ont rien en commun ont en commun qu'elles n'ont rien en
commun"
Remplacez nospam.nospam par pfi.be pour répondre. Merci

3 réponses

Avatar
Gilles LE BARBIER
Une nouvelle version toujours pas testée
Tu ne m'as pas précisé le message d'erreur



une procédure stockée
ALTER PROCEDURE [dbo].[MAJcontrat]
@conid int
AS
DECLARE
BEGIN
update tcontrats set concdeqte = (Select SUM(comqte) from AjoutCommande
Where conid = @conid)
from tcontrats where tcontrats.conid = @conid
END



ALTER TRIGGER AjoutCommande
ON dbo.tCommandes
for insert,update
as
DECLARE
@QteOk int,
@ex_id int,
@new_id int
BEGIN
@QteOk = 0
SELECT @ex_id = ISNULL(conid,0) FROM DELETED
SELECT @new_id = ISNULL(conid,0) FROM INSERTED
IF @new_id <> @ex_id
BEGIN
-- conid a été retiré en MAJ
IF @ex_id > 0
BEGIN
EXECUTE MAJcontrat @ex_id
END
-- conid a été positionné
IF @new_id > 0
BEGIN
@QteOk = 1
EXECUTE MAJcontrat @new_id
END
END
IF UPDATE(comqte) AND @QteOk = 1 AND @new_id > 0
BEGIN
-- évite de mettre à jour une deuxième fois
EXECUTE MAJcontrat @new_id
END

END

A+
Gilles
Avatar
Gilles LE BARBIER
c'est compliqué c'est vrai

mais maintenant tu n'as plus a t'occupper de ce champ calculé
en effet à la moindre modifiction suppression ou insertion tes qte sur
contrats sont à jour

les puristes te diront que ce champ calculé n'était pas nécessaire
puisque la requete
Select SUM(comqte) from TCommandes Where conid = X
te donne le résultat

Mais bon à l'utilisation il peut être necessaire d'avoir des informations
toutes faite pour ne pas lancer la même requete dans tous tes sources

A+

Gilles
Avatar
Pierre Fauconnier
Bonjour Gilles,

Merci pour toutes ces infos.


--
Pierre Fauconnier () (Skype:
pierre_fauconnier)
"Les choses qui n'ont rien en commun ont en commun qu'elles n'ont rien en
commun"
Remplacez nospam.nospam par pfi.be pour répondre. Merci

"Gilles LE BARBIER" a écrit dans le message de
news: uk2o9uN%
c'est compliqué c'est vrai

mais maintenant tu n'as plus a t'occupper de ce champ calculé
en effet à la moindre modifiction suppression ou insertion tes qte sur
contrats sont à jour

les puristes te diront que ce champ calculé n'était pas nécessaire
puisque la requete
Select SUM(comqte) from TCommandes Where conid = X
te donne le résultat

Mais bon à l'utilisation il peut être necessaire d'avoir des informations
toutes faite pour ne pas lancer la même requete dans tous tes sources

A+

Gilles