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

Printemps des cartes 2024

#1 Fri 24 July 2015 09:08

ecran64
Participant occasionnel
Date d'inscription: 18 Apr 2012
Messages: 49

Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

Bonjour,

Je ne suis pas un expert en bases de données, mais j'essaie de m'y mettre de plus en plus.
J'ai un couche (A) avec des objets qui ont chacun un identifiant unique (A.UID) et un identifiant commun (A.ComID) (qui regroupe plusieurs objets).
À côté, j'ai une table (B) qui contient une description pour chacun des identifiants communs (B.ComID).
J'aimerais conserver ses tables séparées dans postGis, mais dans Qgis, j'aimerais que quand je clique sur un objet, je puis voir et modifier facilement la description de l'objet de la table A avec les infos de la table B associée.
J'ai vu sur les forums qu'il fallait passer par une clé étrangère. J'ai donc définit B.ComID comme clé primaire et dans la table A, j'ai défini A.ComID en clé étrangère qui pointe vers B.ComID.
Par contre, dans Qgis, ça ne change rien, si je clique sur l'objet, je n'ai pas la description associée de la table B.
Ce que j'ai fait pour contourner cela, c'est aller dans les propriétés de la couche, et j'ai fait une jointure. Du coup, j'obtiens ce que je veux au niveau affichage, par contre, si je veux modifier les descriptions de la table B, elles ne sont pas modifiables via le formulaire, il faut que je passe par la table attributaire pour faire mes modifs.

Pourriez-vous me dire ce que je dois faire pour qu'il y ait un lien entre ces 2 tables, et que dans Qgis, ça n'apparaisse comme s'il n'y avait qu'une table ?

Merci.

Hors ligne

 

#2 Fri 24 July 2015 09:23

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

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

Bonjour.
Il faut créer une vue (dont la requête correspond à la requête de jointure que vous souhaitez).
Puis sur la vue vous créez une règle UPDATE.
Vous chargez la vue dans qgis et sauf erreur ça devrait fonctionner
Cordialement.
JP

exemple de règle :

Code:

CREATE OR REPLACE RULE "_UPDATE" AS
    ON UPDATE TO v_pvr DO INSTEAD  UPDATE pvr SET payee = new.payee, montant = new.montant
  WHERE pvr.id_pvr = new.id_pvr;

Dernière modification par JP LLORENS (Fri 24 July 2015 09:25)

Hors ligne

 

#3 Fri 24 July 2015 10:23

ecran64
Participant occasionnel
Date d'inscription: 18 Apr 2012
Messages: 49

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

Merci. Ok, donc on doit passer par une vue. J'aurais pensé que via les clés étrangères ça aurait pu être plus directe.

Hors ligne

 

#4 Fri 24 July 2015 11:06

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1538

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

Bonjour,

Les clés étrangères permettent juste de garantir que le lien qu'on met en place entre deux tables marche tout le temps: on ne peut insérer ou modifier une valeur correspondant à la clé si elle n'est pas présente dans la table de référence. Ca reste au niveau PostgreSQL

Au niveau de QGis, ces clés ne génèrent pas un lien automatique entre les tables: qgis travaille table par table.
Comme le dit JP, une vue vous permettra de lier deux tables en une seule (virtuelle) et de représenter ces deux tables dans qgis.

Nicolas

Hors ligne

 

#5 Fri 24 July 2015 13:54

ecran64
Participant occasionnel
Date d'inscription: 18 Apr 2012
Messages: 49

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

Merci Nicolas pour la précision.
J'ai commencé par tenter de faire la vue via cette commande:

CREATE  VIEW public.vA AS SELECT
  "A".geometry,
  "A".code,
  "A"."ComID",
  "B"."NOM",
  "B"."Obs",
  "B"."Comment"
  FROM public."A", public."B"
WHERE   ("A"."ComID" = "B"."ComID");


J'ai eu ce message: "La requête a été exécutée avec succès en xxx ms, mais ne renvoie aucun résultat."
Par contre, quand je veux l'afficher dans QGis, j'ai:

dbname='A' host=localhost port=54321 user='postgres' password='XXXX' sslmode=disable key='code' srid=2154 type=MULTILINESTRING table="public"."vA" (geometry) sql= est une couche non valide et ne peut être chargée.


Dans PostGis, je vois que la table correspond à ce que j'aimerais avoir (même si je n'arrive pas encore à l'afficher.
Du coup, à quoi sert cette règle?

CREATE OR REPLACE RULE "_UPDATE" AS
    ON UPDATE TO v_pvr DO INSTEAD  UPDATE pvr SET payee = new.payee, montant = new.montant
  WHERE pvr.id_pvr = new.id_pvr;


ça sert à la mise à jour?

Hors ligne

 

#6 Fri 24 July 2015 14:04

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

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

La règle va te permettre , en faisant une mise  à jour dans la vue (dans mon exemple v_pvr) de remonter la modification dans la table source (update pvr set ...). Il me semble que c'était l'objet de ton souci au départ.
On peut aussi mettre des règles en place sur des tables, qui vont avoir une action similaire à un trigger.
Est-ce que, dans postgres, ta vue de renvoie quelque chose ?
D'autre part, dans la vue geometry_columns de ta base, est-ce que ta vue "vA " est correctement référencée (srid, type, coord_dimension, ...) ?

Hors ligne

 

#7 Fri 24 July 2015 15:00

ecran64
Participant occasionnel
Date d'inscription: 18 Apr 2012
Messages: 49

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

Ok, merci pour cet éclaircissement, mais alors dans ta règle, la table "new" correspond à quoi?
Sinon, pour ma vue, je ne sais pas ce qu'il s'est passé, mais ça a finit par s'afficher dans QGis et c'est correcte (peut-être parce que j'ai fait "calculer l'emprise"?). Sinon, elle était correctement référencée.

Hors ligne

 

#8 Fri 24 July 2015 15:49

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

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

new n'est pas une table mais correspond à la valeur que tu vas saisir.
Par exemple et de façon schématique,  si tu faisais un update "vA" set code = 1 la valeur NEW.code serait égale à 1. C'est une variable qui est utilisée dans les triggers et les règles (comme OLD)
http://docs.postgresql.fr/9.1/rules-update.html

Hors ligne

 

#9 Fri 24 July 2015 16:15

ecran64
Participant occasionnel
Date d'inscription: 18 Apr 2012
Messages: 49

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

Merci beaucoup JP pour ton aide.
ça à l'air de marcher, j'ai toute la table qui s'affiche dans mon formulaire. Par contre, quand je n'arrive pas à éditer les valeurs contenues dans la table contenant les descriptions.
Je pense que ça doit venir de la règle, je vais regarder le lien que tu m'a donné.

Hors ligne

 

#10 Fri 24 July 2015 16:30

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

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

Teste ta vue et une requête update sur ta vue directement à  partir de postgres. Si ça plante tu auras un message qui, dans la plupart des cas te donne une piste de recherche, ce qui ne sera pas le cas sous qgis. Une fois que tout roule alors tu rebascules sous qgis.
Bon courage.
JP

Hors ligne

 

#11 Fri 24 July 2015 17:17

ecran64
Participant occasionnel
Date d'inscription: 18 Apr 2012
Messages: 49

Re: Lier 2 tables dans PostGis pour qu'elles ne fassent qu'un dans Qgis ?

En effet, j'ai cette erreur:

********** Erreur **********
État SQL :42601


J'ai essayé de modifier les champs de la table géographique, mais ça ne fonctionne pas. Je dois faire une erreur quelque part. Je retravaillerais dessus la prochaine fois...
MErci en tout cas!

Hors ligne

 

Pied de page des forums

Powered by FluxBB