PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : PL/pgSQL » Trigger de gestion des stock. » 12/05/2010 17:23:01

Ok, merci beaucoup. Je vous envoi ça ce soir vers 19h.

#2 Re : PL/pgSQL » Trigger de gestion des stock. » 12/05/2010 13:07:13

Pas de soucis, tout ça est déjà prêt et prévu, mais je préférerai ne pas le rendre public, je peux vous l'envoyer par mail ou autre moyen?
Bien évidemment la solution, si elle existe sera mise sur le forum.

#3 Re : PL/pgSQL » Trigger de gestion des stock. » 11/05/2010 20:18:59

Je reposte à nouveau espérant que quelqu'un puisse m'apporter une réponse car je suis vraiment coincé.
Je me rends compte avoir oublié de mentionné que la table t_product à laquelle fait référence la table t_order_product est alimentée par 4 tables enfants. Est-ce que le problème pourrez venir de là?

Je résume, ma table t_order_product est relié (via la possession d'une clé étrangére) à une table t_order et une table t_product (la même qui est en relation avec 4 tables enfants). Cette dernière table posséde 2 clés étrangères la reliant à une table t_picture, t_catégorie.

La question reste la même: pourquoi j'ai le message d'erreur ci dessous quand j'essaye d'insérer une nouvelle ligne dans ma table t_order_product?

ERREUR: une instruction insert ou update sur la table "t_order_product" viole la contrainte de clé étrangère "product_idop"
    DETAIL: La clé (product_id)= (2) n'est pas présente dans la table "t_product".

D'avance merci pour toutes vos réponses.

#4 Re : PL/pgSQL » Trigger de gestion des stock. » 30/04/2010 10:51:04

Il y en a eu mais il n'y en a plus. Le problème ne vient donc pas de là.
Je ne comprends vraiment pas pourquoi cela ne marche pas.
Toute les idées sont les bienvenues.
Merci d'avance.

#5 Re : PL/pgSQL » Trigger de gestion des stock. » 29/04/2010 17:20:53

Il me renvoie 1 (une entrée).

Et, très interessant si je modifie mon trigger le passant de "after insert or update..." à "before insert or...".
Il ne me renvoi pas d'erreur mais bien évidemment il ne conserve pas la ligne rentrée dans la table t_order_product" puisque la fonction associée au trigger comprend un "return null", si je met "return new", l'erreur est a nouveau renvoyée.

Est-ce que cela permet d'avancer?

#6 Re : PL/pgSQL » Trigger de gestion des stock. » 29/04/2010 16:28:54

Effectivement, désactiver le trigger n'y fait rien. Cependant il existe bien une ligne pour laquelle l'id_product (qui correspond au champ product_id en tant que clé étrangère dans la table t_order_product) est égal à 2 dans la table t_product. Voilà pourquoi je ne comprends pas l'erreur.
Est-ce que vous auriez une idée? Avez vous besoin d'informations supplémentaires pour pouvoir me répondre?

Merci pour la petite explication du billet. Ce n'est donc pas un bug.

#7 Re : PL/pgSQL » Trigger de gestion des stock. » 29/04/2010 16:04:12

Merci à vous deux pour vos réponses rapides.

Pour info j'ai bien compris ce qu'est l'objet NEW et je l'avait utilisé comme tel dans un précédent trigger:

 Create or replace function ins_stock () returns opaque as $$
	Begin
		UPDATE t_product
		Set stock_web=stock_web - new_product.quantity
		Where id_product = insert_product_id;
	Return null;
	End;
$$ language plpgsql;

Create trigger ins_stock_O
	after Insert on t_order_product
	for each row execute procedure ins_stock();

Mais comme cela me renvoyait une erreur, j'ai essayé d'adapter du haut de ma petite expérience un code écrit pour mysql serveur ce qui à donné le triste résultat que j'ai publié au dessus.

Aprés avoir pris en compte vos corrections mon programme me renvoi exactement la même erreur lorsque j'essaye de rentrer une nouelle ligne dans ma table t_order_product à savoir:

ERREUR: une instruction insert ou update sur la table "t_order_product" viole la contrainte de clé étrangère "product_idop"
DETAIL: La clé (product_id)= (2) n'est pas présente dans la table "t_product".

Voilà le trigger corrigé:

 CREATE OR REPLACE FUNCTION gest_stock()
  RETURNS trigger AS
$BODY$
	declare stock varchar;
	declare	id_prod integer;
	declare	q integer;
	begin
		select into q new.quantity;
		select into id_prod new.product_id;
	update t_product
			set stock_web = stock_web + q 
			where id_product=id_prod;
		q :=0;
		select into q old.quantity;
		select into id_prod old.product_id;
	update t_product
			set stock_web = stock_web - q 
			where id_product=id_prod;
	return null;	
	end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION gest_stock() OWNER TO postgres;

Mais j'ai lu ici http://blog.guillaume.lelarge.info/inde … g%C3%A8res (c'est d'ailleurs votre blog Gleu) , si j'ai bien compris, qu'il y avait un problème sous postgres avec des trigger qui désactivé les clés étrangères.

Est-ce que ce que je cherche à faire est impossible?
La version de postgreSQL que j'utilise: 8.4

Julien

#8 PL/pgSQL » Trigger de gestion des stock. » 29/04/2010 15:12:14

Rahan
Réponses : 15

Bonjour,

Je suis plus ou moins débutant sur postgres. Je conçois actuellement une base de données pour la gestion de stock.
J'ai donc créer une table produit:

CREATE TABLE t_product
(
  id_product bigserial NOT NULL,
  code character varying(4),
  "name" character varying(50) NOT NULL,
  description character varying(250) NOT NULL,
  price_ht double precision NOT NULL,
  stock_web integer NOT NULL,
  picture_id integer,
  category_id integer NOT NULL,
  CONSTRAINT id_product PRIMARY KEY (id_product),
  CONSTRAINT category_idep FOREIGN KEY (category_id)
      REFERENCES t_category (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT picture_idp FOREIGN KEY (picture_id)
      REFERENCES t_picture (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE t_product OWNER TO postgres;

Une table commande:

 CREATE TABLE t_order
(
  id serial NOT NULL,
  create_date date NOT NULL,
  price_ht double precision NOT NULL,
  user_id integer NOT NULL,
  CONSTRAINT order_id PRIMARY KEY (id),
  CONSTRAINT user_ido FOREIGN KEY (user_id)
      REFERENCES t_user (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE

Et une table permettant le lien entre commande et produit:

 CREATE TABLE t_order_product
(
  id serial NOT NULL,
  product_id integer NOT NULL,
  quantity integer,
  price_ht double precision NOT NULL,
  order_id integer NOT NULL,
  CONSTRAINT order_product_id PRIMARY KEY (id),
  CONSTRAINT order_idop FOREIGN KEY (order_id)
      REFERENCES t_order (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT product_idop FOREIGN KEY (product_id)
      REFERENCES t_product (id_product) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE t_order_product OWNER TO postgres;

Aprés plusieurs heures de recherche sur le net et d'essai, je n'ai pas réussi à concevoir un trigger et fonction associé qui permettrait de mettre à jour la champs stock_web de la table t_product à partir de la quantité commandée, renseignée dans le champ quantity de la table t_order_product. Tout ce que j'ai trouvé était à executer sous oracle ou mysql serveur:
http://www.sqlfr.com/codes/TRIGGER-MAJ_48866.aspx

Voilà ou j'en suis actuellement:

 DROP FUNCTION gest_stock()cascade;
CREATE OR REPLACE FUNCTION gest_stock()
  RETURNS opaque AS
$BODY$
	declare stock varchar;
	declare	id_prod integer;
	declare	q integer;
	begin
		select into q new.quantity
		where id_prod = new.product_id;
	update t_product
			set stock_web = stock_web + q 
			where id_product=id_prod;
		q = 0;
		select into q old.quantity 
		where id_prod = product_id;

	update t_product
			set stock_web = stock_web - q 
			where id_product=id_prod;
	return null;	
	end;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION gest_stock() OWNER TO postgres;

CREATE TRIGGER gestion_stock
  after INSERT or delete or update
  ON t_order_product
  FOR EACH ROW
  EXECUTE PROCEDURE gest_stock();

Ca ne marche bien évidemment pas.

Merci d'ores et déjà pour toute l'aide et les réponses que vous pourrez m'apporter.

Pied de page des forums

Propulsé par FluxBB