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 :
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
);
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
 
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
);
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
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;
enfin le code du trigger :

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();
en résume je voudrais mettre a jour le champ quantite_stock du table articles
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