#1 Thu 07 September 2017 11:11
- Angie☼
- Juste Inscrit !
- Date d'inscription: 22 Aug 2017
- Messages: 9
QGIS & PostGIS: déplacer un point créé par un trigger ?
Bonjour à tous,
Après quelques heures de recherches infructueuses sur le net je sollicite votre aide. J'ai une base de données oiseaux sur postgresql reliée à Qgis pour exploitation.
J'ai 2 tables : 1 table "couple" et une table "nid" qui ont respectivement un id_couple et un id_nid uniques. Le champ id_couple est présent dans les 2 tables ce qui me permet d'établir une relation sur Qgis et ainsi depuis le formulaire couple je peux remplir le formulaire nid associé. Sur postgresql j'ai codé un trigger pour que lorsque je saisis une nouvelle ligne dans la table nid, un point (géométrique) se créé à l'endroit où se trouve le couple.
Code:
CREATE OR REPLACE FUNCTION crea_nid() RETURNS trigger AS $$ BEGIN if new.id_couple is not null then new.geom = max(couple.geom) from couple, nid where new.id_couple = couple.id_couple; return new; else return new; end if; END; $$ LANGUAGE plpgsql; CREATE TRIGGER crea_nid BEFORE INSERT OR UPDATE ON nid FOR EACH ROW EXECUTE PROCEDURE crea_nid();
Je précise que je n'ai pas de grandes compétences sur postgres et en code en général, je débute tout juste et me débrouille avec ce que je trouve dans la doc et sur les forums, en évitant au maximum d'écrire des choses que je ne comprends pas, donc je ne serai pas étonnée que vous trouviez ma façon de coder simpliste ou incohérente
Le max(couple.geom) c'est parce que je peux avoir plusieurs nids par couple et que la fonction ne fonctionne pas si ça retourne plusieurs lignes
Le problème avec ce code est que je ne peux plus déplacer le point nid ensuite dans Qgis, une idée de quoi changer dans le code pour que le point reste déplaçable?
Hors ligne
#2 Thu 07 September 2017 12:19
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
Bonjour,
Le Update dans la déclaration du trigger fait qu'il ré-exécute la fonction de replacement à chaque édition d'une entité (donc annule le déplacement que vous venez de faire). Supprimez-le et ce devrait aller
Code:
CREATE TRIGGER crea_nid BEFORE INSERT ON nid FOR EACH ROW EXECUTE PROCEDURE crea_nid();
Hors ligne
#3 Thu 07 September 2017 12:49
- Angie☼
- Juste Inscrit !
- Date d'inscription: 22 Aug 2017
- Messages: 9
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
Super merci beaucoup pour l'efficacité !!
Hors ligne
#4 Fri 08 September 2017 10:43
- Angie☼
- Juste Inscrit !
- Date d'inscription: 22 Aug 2017
- Messages: 9
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
j'ai à nouveau besoin d'aide, lors de la création d'un point, j'ai fait un trigger pour que mes champs "commune", "x_couple" et "y_couple" se remplissent automatiquement en fonction de l'endroit où se trouve le point
Code:
CREATE OR REPLACE FUNCTION crea_couple() RETURNS trigger AS $$ BEGIN if new.commune is null or new.commune='' then new.commune = commune.nom from commune where st_within(new.geom, commune.geom); else return new; end if; new.x_couple := st_x(new.geom); new.y_couple := st_y(new.geom); return new; END; $$ LANGUAGE plpgsql; CREATE TRIGGER crea_couple AFTER UPDATE ON couple FOR EACH ROW EXECUTE PROCEDURE crea_couple();
Maintenant j'aimerai que ces champs se mettent à jour lorsque je déplace mon point, mais je ne trouve pas comment. Je me dis que le problème vient du "new" mais je ne sais pas comment le remplacer par "point sélectionné dans Qgis"
Dernière modification par Angie☼ (Fri 08 September 2017 10:56)
Hors ligne
#5 Fri 08 September 2017 11:11
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
Bonjour,
Remplace le "After Update" par "Before Update". Le fait de modifier les champs de l'entité fait partie de la mise à jour de cette entité et donc les instructions du trigger sont à appliquer avant que PG enregistre les changements sur cet objet (une fois fait, l'objet n'est plus new)!
J'ignore si mon explication est claire... (les notions de before/after peuvent ne pas paraître intuitives mais c'est juste un raisonnement qu'il faut intégrer). Regarde un peu la doc là-dessus sinon...
Hors ligne
#6 Fri 08 September 2017 11:24
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 170
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
Bonjour,
Si tu veux conserver le calcul automatique lors de la création il faudra partir sur
Code:
BEFORE INSERT OR UPDATE OF ....
Sylvain
Hors ligne
#7 Fri 08 September 2017 11:46
- Angie☼
- Juste Inscrit !
- Date d'inscription: 22 Aug 2017
- Messages: 9
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
oui c'est très clair merci à vrai dire je les ai un peu tous testé before / after, insert/update et aucun ne fonctionne, mais je me suis rendue compte de plusieurs erreurs. Déjà j'ai besoin de 2 triggers différents : 1 pour la création d'un point, l'autre pour la mise à jour. Ensuite pour ma fonction de mise à jour j'ai enlevé les "if" car je veux mettre à jour le champ peu importe ce qu'il y a dedans. J'ai donc écrit
Code:
CREATE OR REPLACE FUNCTION maj_couple() RETURNS trigger AS $$ BEGIN new.commune := commune.nom from commune where st_within(new.geom, commune.geom); new.x_couple := st_x(new.geom); new.y_couple := st_y(new.geom); return new; END; $$ LANGUAGE plpgsql; CREATE TRIGGER maj_couple BEFORE UPDATE ON couple FOR EACH ROW EXECUTE PROCEDURE maj_couple();
mais comme je l'ai dit, je n'ai aucune modif de mes champs quand je déplace mon point
Hors ligne
#8 Fri 08 September 2017 11:52
- Angie☼
- Juste Inscrit !
- Date d'inscription: 22 Aug 2017
- Messages: 9
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
Bonjour,
Si tu veux conserver le calcul automatique lors de la création il faudra partir surCode:
BEFORE INSERT OR UPDATE OF ....Sylvain
c'était la première synthaxe que j'ai essayé mais ça ne modifie pas non plus mes champs
Hors ligne
#9 Fri 08 September 2017 13:27
- Sylvain PIERRE
- Participant assidu
- Lieu: Strasbourg
- Date d'inscription: 6 Sep 2005
- Messages: 170
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
Etant donné que le déclenchement du trigger se fait sur la création ou le déplacement d'un point, c'est donc le champ contenant la géométrie des objets qui doit être ciblé dans la déclaration du trigger :
Code:
BEFORE INSERT OR UPDATE OF 'nom du champ contenant la geometrie de l'objet'
Dernière modification par Sylvain PIERRE (Fri 08 September 2017 13:27)
Hors ligne
#10 Fri 08 September 2017 14:09
- Angie☼
- Juste Inscrit !
- Date d'inscription: 22 Aug 2017
- Messages: 9
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
exact!! merci beaucoup Sylvain Pr que cela fonctionne j'ai du écrire update BEFORE INSERT OR UPDATE OF geom ON 'nom de la table'
Dernière modification par Angie☼ (Fri 08 September 2017 14:24)
Hors ligne
#11 Mon 30 April 2018 15:42
- sporito
- Participant actif
- Date d'inscription: 4 Mar 2008
- Messages: 126
Re: QGIS & PostGIS: déplacer un point créé par un trigger ?
Bonjour,
je relance le sujet car ça ne fonctionne pas chez moi, je souhaite que le nom de la commune se mette à jour lorsque je déplace mon point sur une nouvelle commune, est-ce qu'il faut écrire 2 trigger ?:
CREATE TRIGGER update_nomcom
BEFORE INSERT OR UPDATE
ON "DPF_Installation"."INSTALLATION_DPF"
FOR EACH ROW
EXECUTE PROCEDURE "DPF_Installation".update_nomcom();
CREATE TRIGGER update_nomcom2
BEFORE INSERT OR UPDATE OF geom
ON "DPF_Installation"."INSTALLATION_DPF"
FOR EACH ROW
EXECUTE PROCEDURE "DPF_Installation".update_nomcom();
Dernière modification par sporito (Mon 30 April 2018 17:42)
Hors ligne