#1 Wed 30 October 2019 15:15
QGIS v3: Formulaire relation N:M avec checkbox
Bonjour,
Je dois implémenter un formulaire de type N:M
Mon cas est le suivant. J'ai trois tables :
- rue
- règlement
- rue_reglement
où un règlement peut s'appliquer à plusieurs rues et une rue peut se voir attribuer plusieurs règlements, d'où table intermédiaire rue_reglement
J'aurais besoin, lorsque je suis dans le formulaire des règlements, de renseigner les rues qui y sont associées.
Pour cela, je trouvais la solution des checkboxes assez intéressante. Un exemple en python ui existe ici pour des analyses terrain de pesticides :
https://medspx.fr/blog/Qgis/better_qgis … art_three/
Je me demandais si les dernières versions de qgis permettaient de rendre aisément ce type de formulaire ?
geodata au cerema et petits billets en géomatique
Hors ligne
#2 Wed 30 October 2019 23:22
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS v3: Formulaire relation N:M avec checkbox
Bonsoir Mathieu,
Je vais regarder mais à ma connaissance il n'y a toujours pas de prise en charge de formulaire n:m.
Après, tu peux faire un truc pour le simuler en particulier si tu es sur postgres.
Créer dans ta table règlement un champs array qui stockerait les rues. (C'est d'ailleurs ce que fait le cerema avec les tables des fichiers fonciers)
Dans le formulaire Qgis, tu définis ce champs en utilisant le widget valeur relationnelle pointant vers la couche rue et en autorisant la saisie multiple. Tu auras le rendu des boîtes à cocher.
Ensuite tu crées une vue sous postgres pour dumper la table règlement et simuler ta table reglement_rue que tu importes dans Qgis. Puis tu crées une relation dans Qgis entre la table rue et la table rue_reglement.
Ça doit pouvoir marcher. Peut-être pas forcément académique et pas forcément génial si tu as beaucoup de rues.
Je te tiens au courant.
Bon courage,
Hors ligne
#3 Thu 31 October 2019 12:07
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS v3: Formulaire relation N:M avec checkbox
Salut Mathieu,
je viens de regarder en faisant des tests.
Qgis utilise les clés étrangères composites depuis la 3.10
Depuis la dernière version (3.10) on a la possibilité d'utiliser les clés étrangères composites d'après le changelog
Data Management
Feature: Composite Foreign Keys
In QGIS 3.10, we added the possibility to create layer relationships which utilise composite foreign keys. QGIS now fully supports editing parent and child features which are linked with more than one attribute.
Définition des tables dans postgres
Code:
CREATE TABLE essai.rue ( id integer NOT NULL DEFAULT nextval('essai.rue_id_seq'::regclass), nom character varying(100) COLLATE pg_catalog."default", CONSTRAINT rue_pk PRIMARY KEY (id) ); CREATE TABLE essai.reglement ( id integer NOT NULL DEFAULT nextval('essai.reglement_id_seq'::regclass), nom character varying(100) COLLATE pg_catalog."default", CONSTRAINT reglement_pk PRIMARY KEY (id) ); create table essai.rue_reglement ( id_rue integer references essai.rue (id), id_reglement integer references essai.reglement(id), primary key (id_rue, id_reglement) );
Après avoir importé les tables dans qgis, quand tu définis tes relations de manière automatique tout se fait correctement.
Formule de mise en forme
Tu peux personnaliser l'affichage des rues et du règlements avec ce genre de formule (sinon ca te renvoie l'id)
pour personnaliser l'affichage du sous-formulaire :
Code:
format('%1 - %2', attribute(get_feature_by_id('rue', "id_rue" ),'nom'), attribute(get_feature_by_id('reglement', "id_reglement" ),'nom') )
Cela semble donc prometteur mais ici on utilise le widget relation.
Bonne journée,
Hors ligne
#4 Mon 04 November 2019 11:18
Re: QGIS v3: Formulaire relation N:M avec checkbox
wow merci beaucoup lejedi76
Je testerai sous la 3.10
En attendant, ces petites explorations m'ont permis de comprendre les drill down forms. Il faut :
- créer un champ rues_json de type JSON (texte) en geopackage qui stockera les clés étrangères de la couche rues
On peut, accessoirement, rajouter un champ de saisie texte saisie_nom_rue et filtrer la liste rues_json
selon ce qu'on met dans ce champ de saisie à la façon d'une auto-complétion grâce à l'expression
Code:
name like '%'||current_value('saisie_nom_rue')||'%'
Et pour avoir un champ où l'on sépare les noms de rue voulus par une virgule :
Code:
regexp_match(name,array_to_string(string_to_array(current_value('saisie_nom_rue'), ','), '|')) > 0
Les détails sont en PJ
geodata au cerema et petits billets en géomatique
Hors ligne