GESTION DE STOCK À L'AIDE D'UN TRIGGER [SQL SERVER 2000]

Inekman Messages postés 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 juin 2006 - 10 avril 2005 à 12:06
Moundir76 Messages postés 281 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 10 janv. 2012 à 11:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30645-gestion-de-stock-a-l-aide-d-un-trigger-sql-server-2000

Moundir76 Messages postés 281 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 4
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 4
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
night_enami Messages postés 2 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 15 janvier 2006
15 janv. 2006 à 17:03
ok :) c comme tu veux ;)
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 1
15 janv. 2006 à 17:01
salut salut,

J'avais abandonne la creation de cette application car je ne m'en sortais pas et puis je ne bosse pas ds ce domaine donc pas evident !

mais bon je vais essayer de tester cela cette semaine et je te tiens au courant !

Merci et bonne semaine

Christophe
night_enami Messages postés 2 Date d'inscription vendredi 13 janvier 2006 Statut Membre Dernière intervention 15 janvier 2006
15 janv. 2006 à 16:34
Bonjour tt lmonde (comme réponse pour jimmy69)
c vrai quand j cré un trigger comme celui ke ta fai il m'envoie des fois ce conflit d'instruction

D'après cke g compris par le truc ke vs voulez faire, j propose un trigger ki gère la suppression d'une personne ds une table tpersonne tt en sachant ke l'id de celle-ci existe ds une table tnews (j'espère ke g bien expliké)
essaie ce code en tt cas pour moi il marche bien:
Create trigger supp_pers on tpersonne instead of delete
as
begin
if(select count(*) from tnews,deleted where tnews.id=deleted.id)>0
begin
print'Impossible de supprimer cet personne: elle est liée à une autre table'
rollback transaction
end
else
begin
delete tpersonne from tpersonne,deleted
where tpersonne.id=deleted.id
print'personne supprimée avec succès'
end
end

Ce trigger ne permet pa la suppression de la personne si jamais elle est liée à la table tnews mais si vs voulez la supprimer vs n'avez ka ajouté un ptit code de suppression

j'espere ke ça va aider certain

bon courage!!!
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
27 avril 2005 à 11:34
Oui, tout simplement :)

Parce que ton trigger doit faire des actions dans d'autres tables.
C'est tout bete, bon courage ;)
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 1
27 avril 2005 à 11:27
salut Mindiell,

donc si je pige bien je fais un trigger sur la table tpersonnes avec plusieurs actions dedans !

delete tnews
delete tpersonnes
etc....

? je debute sorry si mes questions sont un peu simpliste !

Bonne journée

Christophe
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 1
27 avril 2005 à 11:25
salut inekman,

Oui tu as raison j'ai trouve un exemple sur le net mais chez moi ca tourne pas !

voila le trigger que j'ai realise

mon schema est celui ci :
Tables
-----------

Tpersonnes = pkpersonnes,nom, prenom ...
Tnews = pknews,titre, description, fkpersonnes

le trigger place sur la table Tpersonnes

create Trigger SuppPers on Tpersonnes
--Suppression
for delete
as

--Liaison
delete from Tnews
from Tnews tn
inner join DELETED d
on tn.fkpersonnes = d.pkpersonnes

mais qd je fais ds l'analyseur de requete un
delete from Tpersonnes where pkpersonnes = 3 par exemple il me dit :

Conflit entre l'instruction DELETE et la contrainte COLUMN REFERENCE 'FK__Tnews__fkpersonn__1B0907CE'. Le conflit est survenu dans la base de données 'BurgoTest', table 'Tnews', column 'fkpersonnes'.
L'instruction a été arrêtée.


A mon avis le trigger enfin la requete n'est pas bonne mais je vois pas trop comment faire !
si tu as une idee elle est la bienvenue !

Merci

Christophe
Mindiell Messages postés 558 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 5 septembre 2007 1
27 avril 2005 à 11:21
Jimmy> pas besoin, tu fais plusieurs actiosn dans ton trigger :

DELETE FROM News WHERE personne_id = ID

DELETE FROM Personnes WHERE personne_id = ID

et puis c'est tout ^^
Inekman Messages postés 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 juin 2006
27 avril 2005 à 11:17
Il me semble que si tu veux supprimer une personne, l'identifiant de la personne doit se retrouver dans la table "conceptuelle" deleted créée par le trigger...à confirmer :)
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 1
27 avril 2005 à 10:42
salut ,
je viens de lire ton code qui me permet aussi d'en apprendre un peu plus sur les triggers !

J'ai une p'tite question !

est il possible de faire passer un parametre a un trigger !
je m'explique !
j'ai une table Tpersonne et a cette table est lie une table Tnews !
je veux supprimer une personne
je dois d'abord supprimer les news de cette personne!
Puis je faire un trigger before delete Tpersonnes
en lui passant la pk de la table Tpersonnes

Si oui comment je fais pour lui faire passe rle parametre !

Je te remercie

Christophe
Inekman Messages postés 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 juin 2006
10 avril 2005 à 12:06
Yes merci ça pète, j'avais besoin d'un exemple pour apprendre les trigger.

Merci beaucoup.

Inekman.9/10
Rejoignez-nous