Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/06/2011, 23h52   #1
 
amina ahbari
Inscription : septembre 2010
Messages : 19
Détails du profil
Informations personnelles :
Nom : amina ahbari

Informations forums :
Inscription : septembre 2010
Messages : 19
Points : -2
Points : -2
Par défaut Mise à jour stock_trigger

salut,
je veux créer un trigger qui permet de mettre à jour la quantité en stock d'un produit lors d'une opération effectuée dans la table achatProduit
sachant que les tables sont les suivantes;
produit(ref,nom,QtStock,prix unitaire)
achat(produit(num,#refpro,dateachat,QtAchete)

bon voilà mon essai,mais je pense qu'il y a un problème car rien ne change plus.et je pense que le problème est dû dans l'utilisation de "for update" car nous voulons que la table produit soit automatiquement modifiée alors le trigger est appliqué sur la table produit mais for quoi?je sais pas!!
Code :
1
2
3
4
5
6
7
8
9
CREATE TRIGGER MiseAJour
ON produit FOR UPDATE	
AS
declare @qtstock int,@qtacheté int
SET @qtstock=(SELECT QtStock FROM inserted)
SET @qtacheté=(SELECT QtAchete FROM Achat A INNER JOIN inserted I ON A.ref=I.ref)
begin
UPDATE Produit SET stock=(@qtstock-@qtacheté)
end
si vous avez une réponse aidez moi svp,pour que je puisse compléter mon exercice.et merci
ahbari est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 07h24   #2
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
bonjour,
Il y a plusieurs problèmes dans ton trigger.
Dans
Code :
SET @qtstock=(SELECT QtStock FROM inserted)
tu considère qu'il y a une seule lignes modifiée. Ce n'est pas forcément le cas.
Si tu fais update produit set designation=null sans where dans inserted tu auras tous tes produits.

D'autre part dans
Code :
UPDATE Produit SET stock=(@qtstock-@qtacheté)
Tu mets à jour ta table complète pas uniquement les références modifiées.

Enfin ton trigger est un trigger sur produit alors que
Citation:
lors d'une operation effectuer dans la table achatProduit
Ce qui veut dire que tu as besoin d'un trigger sur Achatproduit et pas sur produit.

a+
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/07/2011, 10h28   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour


en effet il y a plusieurs incohérences comme le dit soazig.

Si vous tenez a passer par des triggers pour faire cela, il vous en faudra pour prévoir tous les cas susceptibles d'engendrer la modification du stock :
- ajout d'un ligne dans la table des achat
- modification d'une ligne de la table achat
- ...

De plus, cette information est redondante puisque vous avez (je suppose) le stock initial quelque part, et les différents achats. Il me semble bien plus simple et performant de supprimer la colonne stock de votre table produit, et de créer une vue qui reprend la calcul du stock. au besoin, vous pouvez indexer cette vue. Le sgbdr se chargera alors automatiquement de maintenir la valeur de stock a chaque modification des tables sous-jacentes...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/07/2011, 11h03   #4
 
amina ahbari
Inscription : septembre 2010
Messages : 19
Détails du profil
Informations personnelles :
Nom : amina ahbari

Informations forums :
Inscription : septembre 2010
Messages : 19
Points : -2
Points : -2
voilà une deuxieme essai après modification;
Code :
1
2
3
4
5
6
7
8
 
ALTER TRIGGER modifier
ON Achatproduit after UPDATE	
AS
begin
IF UPDATE(quantite_acheté)
UPDATE Produit SET stock=(stock-Qtacheté) FROM inserted  WHERE Produit.ref=Inserted.ref
end
je pense le trigger est maintenant logiquement correct mais rien ne change pas
dans la table produit
ahbari est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 12h11   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
vous ne prenez pas en compte l'insertion dans la table achat ?

votre trigger est "after update", et sera donc declenché à chaque ordre UPDATE sur la table achat. pas en cas d'insertion.

d'autre part, si vous faite comme ceci, vous aurez vite des incohérences
voici un exemple :

1/ pour un produit, le stock est de 10. Il existe déjà une ligne dans achat pour ce produit avec une quantité de 5

2/ Vous mettez à jour la quantité à 3
votre trigger se déclenche, et met a jour la table produit, avec le stock a 7 (10 - 3 = 7)

3/ Vous faite a nouveau un update de la table achat et vous repassez la quantité a 5 (comme initialement)
votre trigger se declenche, et passe le stock a 2 (7 - 5)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 12h35   #6
 
amina ahbari
Inscription : septembre 2010
Messages : 19
Détails du profil
Informations personnelles :
Nom : amina ahbari

Informations forums :
Inscription : septembre 2010
Messages : 19
Points : -2
Points : -2
Ah oui tu as raison, j'ai rencontré ce problème,
bon s'il est possible de créer le bon trigger, car j'ai déjà essayé plusieurs fois,mais rien
ahbari est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h54.


 
 
 
 
Partenaires

Hébergement Web