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 Mon 02 May 2022 17:00

m_mclr
Juste Inscrit !
Date d'inscription: 20 Dec 2021
Messages: 2

PostGis Trigger mise a jour d'un champ

Bonjour à tous,

Je débute avec les triggers et j'ai du mal a comprendre la mise en forme de la requête...

J'ai deux tables, une de ponctuels relative à des places et une de polygone relative à des quartiers

J'aimerai pouvoir mettre à jour (lors de la création d'une place) le nom du quartier dans lequel elle se trouve
Dans ma table "place" j'ai le champ "id_quartier" qui est lié par une relation Fk à ma table "quartier" et ainsi je peux récupérer le "nom_quartier"

J'ai essayé le trigger suivant , mais malheureusement je n'obtiens pas le résultat escompté..

Code:

CREATE OR REPLACE FUNCTION set_quartier()
  RETURNS trigger AS
$BODY$
DECLARE
BEGIN

IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE'
THEN UPDATE place
SET id_quartier =  quartier.id_quartier
FROM quartier WHERE  st_contains(quartier.geom, NEW.geom); 

END IF;

return NEW;
END;
$BODY$
LANGUAGE plpgsql;

CREATE OR REPLACE TRIGGER set_quartier_trig 
AFTER INSERT OR UPDATE
ON place
FOR EACH ROW
EXECUTE PROCEDURE set_quartier();

Merci d'avance! smile  Margaux

Hors ligne

 

#2 Mon 02 May 2022 17:08

Franck2908
Participant actif
Date d'inscription: 5 Mar 2010
Messages: 85

Re: PostGis Trigger mise a jour d'un champ

Bonjour,

vous pouvez essayer ça :

IF NEW.geom is not null THEN
    IF (TG_OP = 'INSERT')  THEN
                SELECT INTO NEW.id_quartier  id_quartier FROM quartier  WHERE st_contains(NEW.geom,quartier.geom);
                RETURN NEW;
           
           
    ELSIF (TG_OP = 'UPDATE' AND NEW.geom IS DISTINCT FROM OLD.geom) THEN
                SELECT INTO NEW.id_quartier id_quartier FROM quartier WHERE st_contains(NEW.geom,quartier.geom);
                RETURN NEW;
    END IF;   

END IF;

RETURN NEW;

Hors ligne

 

#3 Tue 03 May 2022 09:53

m_mclr
Juste Inscrit !
Date d'inscription: 20 Dec 2021
Messages: 2

Re: PostGis Trigger mise a jour d'un champ

Merci pour votre réponse, malheureusement cela n'a pas l'air de fonctionner..
Lorsque j'ajoute une nouvelle entité sur QGIS, le formulaire d'attribut me propose encore une liste déroulante de tous mes quartiers . Peut-être ai-je manqué une manip

Hors ligne

 

#4 Tue 03 May 2022 10:30

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: PostGis Trigger mise a jour d'un champ

Bonjour
Essayez ça :

Code:

IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN 
   NEW.id_quartier =  quartier.id_quartier FROM quartier WHERE  st_contains(quartier.geom, NEW.geom); 
END IF;

D'autre part, dans votre cas il faut faire un trigger BEFORE.
Vous allez utiliser les triggers AFTER quand vous mettrez à jour une autre table que la table appelant le trigger.
Or c'est la table place qui appel et qui est mise à jour.
Ex: si vous aviez voulu mettre à jour la table des quartiers à partir des places, dans ce cas vous auriez utilisé un trigger AFTER.

Cordialement
JP

Hors ligne

 

#5 Tue 03 May 2022 10:35

Franck2908
Participant actif
Date d'inscription: 5 Mar 2010
Messages: 85

Re: PostGis Trigger mise a jour d'un champ

m_mclr a écrit:

Merci pour votre réponse, malheureusement cela n'a pas l'air de fonctionner..
Lorsque j'ajoute une nouvelle entité sur QGIS, le formulaire d'attribut me propose encore une liste déroulante de tous mes quartiers . Peut-être ai-je manqué une manip


Rajouter une entité sur QGIS et regarder directement dans votre table via PGAdmin si le quartier a été mis à jour.
Votre formulaire d'attribut n'a pas lieu d'avoir une liste de déroulante pour le quartier puisque cela est intégré automatiquement par trigger. Il faut revoir votre formulaire et enlever ce choix de liste. C'est devenu un champ simple.

Dernière modification par Franck2908 (Tue 03 May 2022 10:36)

Hors ligne

 

Pied de page des forums

Powered by FluxBB