Bonjour à tous,
j'ai deux tables table articles et table mouvements_article,je voudrais mettre à jour la quantité dans la table articles par un trigger sur la table mouvements_articles est je n'arrive pas ?
Voila le code de la table articles :
table mouvements_articles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 CREATE TABLE articles ( id_article bigserial NOT NULL, id_sous_famille bigint NOT NULL, article character varying(300) NOT NULL, designation character varying(300) NOT NULL, code character varying(300) NOT NULL, id_fournisseur bigint NOT NULL, quantite_stock integer, quantite_stock_min integer NOT NULL, etat_article character varying(60) NOT NULL, type_derniere_mouvement character varying(40), utilisateur character varying(50), datecreation timestamp with time zone, datemaj timestamp with time zone, CONSTRAINT pk_article PRIMARY KEY (id_article), CONSTRAINT articles_fournisseurs_fk1 FOREIGN KEY (id_fournisseur) REFERENCES fournisseurs (id_fournisseur) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE RESTRICT, CONSTRAINT articles_sousfamilles_fk1 FOREIGN KEY (id_sous_famille) REFERENCES sousfamilles (id_sous_famille) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE RESTRICT, CONSTRAINT un_article_code UNIQUE (code), CONSTRAINT un_article_nom UNIQUE (article) ) WITH ( OIDS=FALSE );
la fonction qui calcule la quantité disponible en stock par différence entre transaction ENTREE et transaction SORTIE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 CREATE TABLE mouvements_articles ( id_mouvement bigserial NOT NULL, id_article bigint NOT NULL, type_mouvement character varying(40) NOT NULL, numero_bon character varying(40), observation character varying(60), quantite integer NOT NULL, utilisateur character varying(50), datecreation timestamp with time zone, datemaj timestamp with time zone, CONSTRAINT pk_mouvements_articles PRIMARY KEY (id_mouvement), CONSTRAINT mouvements_articles_articles_fk1 FOREIGN KEY (id_article) REFERENCES articles (id_article) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE RESTRICT ) WITH ( OIDS=FALSE );
enfin le code du trigger :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 CREATE OR REPLACE FUNCTION maj_quantite_stock() RETURNS trigger AS $BODY$ DECLARE int_quantite_stock integer := 0; int_id_article_temp integer := 0; BEGIN IF (TG_OP = 'INSERT') THEN int_id_article_temp = (SELECT id_article FROM mouvements_articles WHERE id_mouvement = NEW.id_mouvement); int_quantite_stock = (SELECT calcul_quantite_stock (int_id_article_temp)); UPDATE articles SET quantite_stock = int_quantite_stock WHERE articles.id_article = int_id_article_temp; ELSE int_id_article_temp = (SELECT id_article FROM mouvements_articles WHERE id_mouvement = OLD.id_mouvement); int_quantite_stock = (SELECT calcul_quantite_stock(OLD.id_article)); UPDATE articles SET quantite_stock = int_quantite_stock WHERE articles.id_article = int_id_article_temp; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;
en résume je voudrais mettre a jour le champ quantite_stock du table articles
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TRIGGER maj_quantite_stock BEFORE INSERT OR UPDATE OR DELETE ON mouvements_articles FOR EACH ROW EXECUTE PROCEDURE maj_quantite_stock();
pour chaque transaction sur la table mouvements_articles lors d'une requete d'UPDATE / INSERT et aussi DELETE.
Merci d'avance pour l'aide sur le sujet
Partager