Gestion de stock à l'aide d'un trigger [sql server 2000]

Soyez le premier à donner votre avis sur cette source.

Vue 40 276 fois - Téléchargée 4 193 fois

Description

Ce petit exemple permet de voir le fonctionnement d'un trigger sur un insert dans la table invent.
Ce trigger se déclenche lorsque l'on insert un enregistrement dans la table invent. Il décrémente ainsi le stock de l'article si celui-ci est suivi en stock. On retrouve cette information dans la table article grâce au champ "ART_suivi". si ART_suivi = 0 pas de suivi de stock. Si ART_suivi = 1 => suivi de stock donc décrémentation du stock de cette article.

Le zip contient un script de création de la base, ainsi que de l'insertion de données. Les dernières lignes permettent de voir l'éffet du trigger.

Source / Exemple :


create trigger Gestion_stock
on invent
FOR INSERT
AS
IF (select ART_suivi from Articles,inserted where Articles.ART_Ref = Inserted.ART_Ref) > 0
BEGIN
	update S SET
	S.Stock_Art = (S.Stock_Art - I.Quantite)
	FROM Stock as S INNER JOIN Inserted as I
	ON S.ART_Ref = I.ART_Ref
END

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
10 janv. 2012 à 11:36
Merci pour ton aide
fun_moncif Messages postés 5 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 7 mars 2007
17 oct. 2006 à 14:14
bonjour Les Amis, g besion d'un tutorial et des exemples progrissiv pr mieu comprendre les triggers !
svp...
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 3
10 juin 2006 à 13:15
En fait lors d'une insertion de la forme :

INSERT INTO Tbl_1
(Chp_1, Chp_2, Chp_3)
SELECT
Chp_1, Chp_2, Chp_3
FROM
Tbl2
WHERE Tbl_2.Chp_4=@Condition

on voie que si la condition 'Tbl_2.Chp_4=@Condition'
Est satisfaite par plusieurs enregistrement de Tbl_2 alors
on inserrera toutes ces lignes en même temps

Daqns ce cas le trigger n'est lancer qu'une seule fois pour l'ensemble des lignes inserer (et c'est heureux car je t'explique pas le temps que ca metrait lors d'une insertion de 1000000 enregistrement).

dans ce cas la pseudo Table inserted ne contient pas 1 mais plusieurs enregistrement.

sinon pour le Art_suivi je suis aller un peu vite ,
il manque effectivement une Jointure :
voilà ma nouvelle proposition

create trigger Gestion_stock
on invent
FOR INSERT
AS
update S SET
Stock_Art = (S.Stock_Art - I.Quantite)
FROM
Stock as S
INNER JOIN Inserted as I
ON S.ART_Ref = I.ART_Ref
INNER JOIN Articles As A
ON A.ART_Ref = I.ART_Ref
WHERE
A.ART_suivi = 1
cs_Draven Messages postés 62 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 8 octobre 2006
10 juin 2006 à 11:50
Je ne suis pas convaincu par mon message. Comme son nom l'indique un trigger d'insert va se déclencher sur chaque insertion sur la table, ou alors je n'ai pas compris ta phrase "une insertion de plusieurs enregistrements".

Quand a ton trigger il ne risque pas de fonctionner puisque le champ "ART_suivi" ne fais pas parti de la table "invent" mais de la table "Article"
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 3
9 juin 2006 à 22:58
ce n'est pas la peine d'utiliser un triger pour supprimer les enregistrement de table qui aurait en clef etrangere une reference à une ligne que l'on veut supprimer, les mise a jours et suppression en cascade sont la pour ça.


Ensuite je pense que le triger n'aura pas l'effet souhaiter dans le cas d'une insertion de plusieurs enregistrement en effet dans ce cas le triger n'est executer qu'une foie, et les tables automatique inserted et deleted contienne tous les enregistrement affecter.

Je propose donc :

create trigger Gestion_stock
on invent
FOR INSERT
AS
update S SET
S.Stock_Art = (S.Stock_Art - I.Quantite)
FROM Stock as S INNER JOIN Inserted as I
ON S.ART_Ref = I.ART_Ref
WHERE ART_suivi = 1
Afficher les 15 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.