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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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
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
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
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
Bonjour Gilles,
Merci pour toutes ces infos.
--
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
"Gilles LE BARBIER" <glebarbier@segilog.com> a écrit dans le message de
news: uk2o9uN%23GHA.2300@TK2MSFTNGP04.phx.gbl...
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
-- 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