Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1