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 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  wink

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: 3947

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é !! smile

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: 3947

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 smile  à 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 sad

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 ?

Sylvain PIERRE a écrit:

Bonjour,

Si tu veux conserver le calcul automatique lors de la création il faudra partir sur

Code:

  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 smile 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

 

Pied de page des forums

Powered by FluxBB