Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
J'ai mis en place un projet Qgis dans le quel les utilisateurs peuvent rajouter des points qui correspondent à des infractions (dépôts de déchet, épandage …) commises sur notre territoire.
Dans cette couche infraction il y a des informations sur la parcelle où est située l'infraction.
Et je souhaitais faire une fonction déclencheur qui permet de récupérer automatiquement l'identifiant unique de la parcelle (geo_parcelle) qui est dans ma couche geo_parcelle. C'est pas une faute la table est le champ geo_parcelle ont le même nom.
Schéma : cadastre_35_2022_22_2022 Schéma : ppc
Table : geo_parcelle Table : infraction
Colonne : geo_parcelle Colonne: geo_par
La fonction utilisée:
REATE FUNCTION ppc.info_parcelle()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
IF TG_OP = 'INSERT' THEN
NEW.geo_par := (SELECT geo_parcelle
FROM cadastre_35_2022_22_2022.geo_parcelle,ppc.infraction)
WHERE ST_Contains(geo_parcelle.geom,NEW.geom_point);
END IF;
RETURN NEW;
END;
$BODY$;
ALTER FUNCTION ppc.info_parcelle()
OWNER TO postgres;
Le trigger:
CREATE TRIGGER info_parcelle
BEFORE INSERT
ON ppc.infraction
FOR EACH ROW
EXECUTE FUNCTION ppc.info_parcelle();
Et du coup, j'ai un message d'erreur sur Qgis quand je souhaite enregistrer la nouvelle infraction.
J'ai testé la requête en dehors de la fonction et elle fonctionne, elle me renvoi bien geo_parcelle.
Message d'erreur sur Qgis:
Impossible de valider les changements pour la couche Infraction point
Erreurs : ERROR: 1 feature(s) not added.
Erreur du fournisseur de données :
Erreur PostGIS lors de l'ajout d'entité : ERREUR: entrée manquante de la clause FROM pour la table « geo_parcelle »
LINE 3: WHERE ST_Contains(geo_parcelle.geom,NEW.geom_poin...
^
QUERY: SELECT (SELECT geo_parcelle
FROM cadastre_35_2022_22_2022.geo_parcelle,ppc.infraction)
WHERE ST_Contains(geo_parcelle.geom,NEW.geom_point)
CONTEXT: fonction PL/pgSQL ppc.info_parcelle(), ligne 6 à affectation
Merci d'avance pour votre aide.
Bien cordialement,
Hors ligne
Je me demande si l'ambiguité ne vient pas de l'affectation dans une variable. Avez-vous toujours le problème si vous remplacez la fonction avec "SELECT geo_parcelle.geo_parcelle FROM cadastre..." ?
Julien.
https://rjuju.github.io/
Hors ligne
Effectivement, j'avais tester de rajouter geo_parcelle pour éviter toute ambiguïté mais il y a toujours la même erreur.
J'ai testé avec un autre jeu de donnée: table geo_commune
champ nomcommune
Problème identique.
Jean
Hors ligne
Ah, je viens de voir le problème!
NEW.geo_par := (SELECT geo_parcelle
FROM cadastre_35_2022_22_2022.geo_parcelle,ppc.infraction)
WHERE ST_Contains(geo_parcelle.geom,NEW.geom_point);
La clause WHERE est en dehors de la clause SELECT, du fait du premier ensemble de parenthèses.
Julien.
https://rjuju.github.io/
Hors ligne
En déplaçant les parenthèses j'ai une amélioration mais toujours un message d'erreur
Erreur du fournisseur de données :
Erreur PostGIS lors de l'ajout d'entité : ERREUR: plus d'une ligne renvoyée par une sous-requête utilisée comme une expression
Effectivement quand je test la requête, elle me revoie tout les geo_parcelle qui contient un point mais je pensais que en utilisant NEW.geom_point dans la fonction ca allait prendre que le point du nouvel enregistrement ?
Hors ligne
Oui, sur un trigger BEFORE INSERT new devrait contenir la valeur insérée. Vous pouvez toujours ajouter un "RAISE NOTICE '%', st_astext(new.geom_point);" et effectuer un INSERT manuellement et valider le contenu.
Effectivement quand je test la requête, elle me revoie tout les geo_parcelle qui contient un point mais je pensais que en utilisant NEW.geom_point dans la fonction ca allait prendre que le point du nouvel enregistrement ?
Comment ça? Si vous testez la requête avec un point quelconque la requête vous renvoit toutes les parcelles ? Etes-vous sur que votre table geo_parcelle ne contient pas de geometrie qui se chevauchent ?
Julien.
https://rjuju.github.io/
Hors ligne
Bonjour,
J'ai trouver le problème !!
NEW.geo_par := (SELECT geo_parcelle
FROM cadastre_35_2022_22_2022.geo_parcelle)
WHERE ST_Contains(geo_parcelle.geom,NEW.geom_point);
Dans le FROM j'avais ppc.infraction alors que c'est un trigger qui est sur cette même table.
Du coup, ca renvoyait plusieurs NEW.geo_point
Merci de votre aide
Bonne journée
Hors ligne
Pages : 1