#1 Thu 04 August 2016 16:40
- legannec
- Participant occasionnel
- Lieu: Sainte-Marie-Aux-Mines
- Date d'inscription: 8 Aug 2011
- Messages: 39
Le trigger le plus simple du catalogue !
Bonjour à tous et merci d'avoir pris le temps de lire ce post.
Je souhaitais mettre en place en trigger très simple permettant de calculer automatiquement la longueur de mes nouvelles multi-lignes et c'est l'échec, j’aurais bien besoin d'un coup de pouce pour débloquer la situation.
config :
windows 7 Pro,
Qgis 2.14.4,
Postgis 2.2,
Postgresql 9.4
schéma : "ep"
table : " ep_reseau"
colonne : "longueur" numeric, 10,2
j'avais essayé ça :
Code:
CREATE OR REPLACE FUNCTION calcul_long_reseau() RETURNS "trigger" AS $$ BEGIN NEW.longueur= round(CAST (length(NEW.geom) AS numeric),0); RETURN NEW; END; $$ LANGUAGE 'plpgsql'VOLATILE; CREATE TRIGGER calcul_long_reseau BEFORE INSERT OR UPDATE ON ep.ep_reseau FOR EACH ROW EXECUTE PROCEDURE calcul_long_reseau();
et non seulement ça ne fonctionne pas mais en plus j'ai un message d'erreur qui apparait dans qgis lors de la sauvegarde de ma couche après une modif ou création d'un nouvel objet :
Impossible de valider les changements pour la couche ep_reseau
Erreurs : ERREUR : 1 attribut non-ajouté.
Erreur du fournisseur de données :
Erreur PostGIS lors de l'ajout d'entité : ERREUR: la fonction length(geometry) n'est pas unique
LINE 1: SELECT round(CAST (length(NEW.geom) AS numeric),0)
^
HINT: N'a pas pu choisir un meilleur candidat dans les fonctions. Vous pourriez
avoir besoin d'ajouter des conversions explicites de type.
QUERY: SELECT round(CAST (length(NEW.geom) AS numeric),0)
CONTEXT: fonction PL/pgsql calcul_long_reseau(), ligne 3 à affectation
Merci d'avance
legannec, Sigiste à la com'com du Val d'Argent
Hors ligne
#2 Thu 04 August 2016 17:25
Re: Le trigger le plus simple du catalogue !
Bonjour,
Sans essayer, je vois déjà une erreur qui peut être à l'origine de votre problème.
Vous utilisez "length" qui calcule une longueur de la chaine de caractères (votre fonction cherche à calculer la longueur du champ de votre colonne geom) qui est une fonction PostgreSQL (voir https://www.postgresql.org/docs/9.5/sta … ing.html).
Vous devriez plutôt utiliser ST_length, une fonction de PostGIS qui lui va prendre votre géométrie et calculer réellement une longueur (voir http://postgis.net/docs/manual-2.2/ST_Length.html).
Cordialement
Thomas Gratier
Dernière modification par ThomasG (Thu 04 August 2016 17:26)
Hors ligne
#3 Fri 05 August 2016 08:41
- legannec
- Participant occasionnel
- Lieu: Sainte-Marie-Aux-Mines
- Date d'inscription: 8 Aug 2011
- Messages: 39
Re: Le trigger le plus simple du catalogue !
Bonjour Thomas,
Après consultation des liens conseillés :
Code:
CREATE OR REPLACE FUNCTION long_reseau() RETURNS "trigger" AS $$ BEGIN NEW.longueur= ST_Length(NEW.geom); RETURN NEW; END; $$ LANGUAGE 'plpgsql'VOLATILE; CREATE TRIGGER calcul_long_reseau BEFORE INSERT OR UPDATE ON ep.ep_reseau FOR EACH ROW EXECUTE PROCEDURE long_reseau();
Merci encore, c'était mon premier trigger et c'est loin d'être le dernier !
Dernière modification par legannec (Fri 05 August 2016 08:42)
legannec, Sigiste à la com'com du Val d'Argent
Hors ligne