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 27/05/2010 12:32:52

LeHibou
Membre

[Débutant] Trigger/Calcul

Bonjour à tous,

il y a deux points noirs que j'aimerais éclaircir.
En premier lieu, j'ai cherché sur le net.
Je déteste poster sans être sûr de ce que je fais.

J'ai trouvé sur plusieurs sites la synthaxe pour faire un calcul:
http://www.informaticien.be/forum_topic … n_SQL.html
http://www.commentcamarche.net/forum/af … e-calculer

etc…

Maintenant, j'utilise pgAdmin 3. Voici la table concernée:

-- Table: test.toto

-- DROP TABLE test.toto;

CREATE TABLE test.toto
(
  entree numeric,
  sortie numeric,
  total numeric,
  id_produit serial NOT NULL,
  CONSTRAINT toto_pkey PRIMARY KEY (id_produit)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE test.toto OWNER TO postgres;

et voici ce que je veux mettre en SQL dans la table total:

SELECT *
FROM toto.entree, toto.sortie, [entree]+[sortie] 
AS total
FROM toto;

Pourquoi cela ne marche-t'il pas comme sur les sites visités? Le "Ok" de la fenêtre reste grisé.

Autre question:
Admettons que je doive automatiser le processus dans le cadre d'un suivi des stocks, comment puis-je faire? J'ai essayé les triggers, mais j'ai toujours des erreurs:

-- Function: test."Trigg_toto"()

-- DROP FUNCTION test."Trigg_toto"();

CREATE OR REPLACE FUNCTION test."Trigg_toto"()
  RETURNS trigger AS
$BODY$DECLARE
total numeric;
BEGIN
total = toto.entree - toto.sortie;
RETURN NEW;
END $BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION test."Trigg_toto"() OWNER TO postgres;

Quand je change NEW par total, j'ai un message d'erreur.
Avez-vous une idée svp?

A bientôt

Dernière modification par LeHibou (27/05/2010 12:34:06)

Hors ligne

#2 27/05/2010 13:53:53

gleu
Administrateur

Re : [Débutant] Trigger/Calcul

Pourquoi cela ne marche-t'il pas comme sur les sites visités? Le "Ok" de la fenêtre reste grisé.

De quelle fenêtre parlez-vous ? ça ne pose aucun problème dans l'éditeur de requêtes (ie le query tools). sauf évidemment les crochets qui ne correspondent à rien dans une syntaxe PostgreSQL.

Quand je change NEW par total, j'ai un message d'erreur. Avez-vous une idée svp?

total est de type numeric, or une fonction trigger ne peut renvoyer que le résultat du trigger (ie soit new, soit old, soit null). Voir http://docs.postgresql.fr/8.4/plpgsql-trigger.html pour les détails.


Guillaume.

Hors ligne

#3 27/05/2010 14:30:47

LeHibou
Membre

Re : [Débutant] Trigger/Calcul

Ok…
J'ai l'agréable sensation de comprendre!!

J'ai réussi la ligne de commande dans le Query Tool. Mais ce que je voulais moi, c'est que le résultat se mette à jour lorsque j'entre les données dans la table… Ainsi, je peux imprimer la table et voir quels ont été les mouvements sans avoir à faire de requête(s). Et ça c'est impossible donc?

Hors ligne

#4 27/05/2010 14:38:54

gleu
Administrateur

Re : [Débutant] Trigger/Calcul

Si, via un trigger. Mais le trigger doit renvoyer NEW, et la colonne de total doit être mise à jour. Voir le lien fourni plus haut, il doit contenir un exemple de ce type.


Guillaume.

Hors ligne

#5 27/05/2010 15:42:26

LeHibou
Membre

Re : [Débutant] Trigger/Calcul

Gleu,

J'ai vraiment essayé, même en suivant le lien. Il y a un binz:

-- Function: test."Trigg"()

-- DROP FUNCTION test."Trigg"();

CREATE OR REPLACE FUNCTION test."Trigg"()
  RETURNS trigger AS
$BODY$BEGIN
NEW.total := SUM(toto.entree - toto.sortie);
RETURN NEW;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION test."Trigg"() OWNER TO postgres;

Le message d'erreur est le suivant: "error missing FROM-clause entry for table "toto"".

C'est un peu usant…  Dites, qu'est-ce qui ne va pas précisément dans mon code? je tourne en rond en essayant plusieurs possibilités mais là…


[EDIT] j'ai une piste: c'est la somme qui déconne. Ce code:

-- Function: test."Trigg"()

-- DROP FUNCTION test."Trigg"();

CREATE OR REPLACE FUNCTION test."Trigg"()
  RETURNS trigger AS
$BODY$BEGIN 
NEW.total := 999;
RETURN NEW;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION test."Trigg"() OWNER TO postgres;

Fonctionne à merveille…
Donc qu'est-ce qui ne va pas avec ma somme?

[/EDIT]

Dernière modification par LeHibou (27/05/2010 16:29:37)

Hors ligne

#6 27/05/2010 17:11:17

gleu
Administrateur

Re : [Débutant] Trigger/Calcul

Vous devriez avoir :

NEW.total := NEW.entree + NEW.sortie;

Ainsi vous additionnez la nouvelle valeur de la colonne entrée à la nouvelle valeur de la colonne sortie. Ce qui fait que cette fonction trigegr peux être utilisé suite à un INSERT et à un UPDATE.


Guillaume.

Hors ligne

#7 27/05/2010 18:52:49

LeHibou
Membre

Re : [Débutant] Trigger/Calcul

AAAAAAAHHHHHHH!!!!!

Parfois je m'étonne... comment n'ai-je pas… Bref, Merci beaucoup Gleu.
Au fait, j'ai vu sur votre blog que vous avez eu de la promotion au sein de cette grande communauté qu'est PostreSQL.

Vous nous tiendrez au courant de quand sortira la prochaine version de postgres et pgAdmin?

Merci à vous en tous les cas, vous venez de me retirer une belle épine du pied.

A bientôt,

LeHibou

Hors ligne

#8 28/05/2010 10:34:53

gleu
Administrateur

Re : [Débutant] Trigger/Calcul

Les deux devraient sortir en même temps et je dirais que je ne serais pas étonné de les voir sortir début juillet.  En tout cas, la beta 2 (des deux) devrait sortir lundi 7 juin. Et j'en parlerais à coup sûr sur mon blog car la traduction du manuel à commencer et qu'on devrait avoir un début de quelque chose pour la beta 2.

Merci.


Guillaume.

Hors ligne

#9 28/05/2010 14:07:41

LeHibou
Membre

Re : [Débutant] Trigger/Calcul

Super,
J'ai pas mal de boulot avec mon entreprise, mais en tout cas, si je peux aider pour les traductions, sachez que je suis là.

Bien sûr, je ne peux pas m'y consacrer à plein temps mais j'existe.

A bientôt,

LeHibou2

Hors ligne

#10 28/05/2010 16:28:20

gleu
Administrateur

Re : [Débutant] Trigger/Calcul

OK, c'est noté. On demandera si on a besoin.


Guillaume.

Hors ligne

Pied de page des forums