Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

ThomasG
Membre
Lieu: Nantes
Date d'inscription: 9 Sep 2005
Messages: 947
Site web

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

 

Pied de page des forums

Powered by FluxBB