#1 Tue 09 September 2025 08:48
- ccam86
- Participant occasionnel
- Date d'inscription: 28 Sep 2022
- Messages: 36
QGIS: Probl de valeurs ambigues dans listes deroulantes
Description du problème :
Bonjour à tous,
Je rencontre un problème dans QGIS avec la gestion des valeurs dans les listes déroulantes liées à une table externe.
Contexte (voir données exemple de la liste déroulantes) :
J'ai une couche avec un champ CS_VEGAQUA qui représente le pourcentage de recouvrement de végétation aquatique.
Ce champ est lié à une table externe LD_canal, où chaque libellé (ex: '0 à 20 %', '20 à 40 %', etc.) a une note numérique associée (ldcan_note).
Plusieurs libellés différents partagent la même note numérique. Par exemple, '0 à 20 %' et '80 à 100 %' ont tous deux la note 2.
Problème :
Quand je sélectionne une valeur dans la liste déroulante pour CS_VEGAQUA, QGIS semble mélanger les libellés ayant la même note numérique.
Si je choisis "80 à 100%" = note de '2' → QGIS enregistre "0 à 20%" = note de '2'.
Si je choisis "Absent" (note = 0) → QGIS m’affiche "absence" ailleurs.
Je souhaite conserver le libellé que j'ai choisi, sans qu'il soit remplacé par un autre libellé ayant la même note.
⚠️ Car le problème, c’est que je dois absolument stocker **les notes numériques** (champs en `Integer64`) pour mes calculs du type :
```
"CS_VEGRIPI" + "CS_ENVACAN" + "CS_VEGAQUA"
```
Donc je ne peux pas mettre `ldcan_id` comme clé, sinon je perds mes calculs.
Ce que j'ai essayé :
- J'ai configuré le champ CS_VEGAQUA avec un widget de type "Valeur relationnelle" pour afficher les libellés textuels tout en stockant les notes numériques. (En gros, une concaténation des éléments de ma table déroulante depuis mon excel joint)
- J'ai utilisé un filtre pour n'afficher que les valeurs de la classe 'recouvrementvegaquatique'. --> "ldcan_classe" = 'recouvrementvegaquatique'
- J'ai défini des valeurs par défaut et des contraintes pour les champs CS_VEGAUTO et CS_VEGENVA en fonction de CS_VEGAQUA.
exemple de contrainte : (Végétation aquatique autochtone) CS_VEGAUTO --> "CS_VEGAQUA" != 0 (absent) OR "CS_VEGAUTO" = 0 (absent)
exemple de valeur par défaut :
CASE
WHEN "CS_VEGAQUA" = 'absence' THEN 3 -- 'absence' dans presenceabsence
ELSE "CS_VEGENVA" -- Garde la valeur existante
END
Question :
Comment puis-je configurer QGIS pour qu'il conserve le libellé que j'ai sélectionné dans la liste déroulante, sans le remplacer par un autre libellé ayant la même note numérique ?
Est-ce que je dois modifier la structure de ma table LD_canal ou y a-t-il une solution dans QGIS pour gérer ce problème ? (version Qgis :3.40 LTR et essaie avec 3.44.2)
Informations supplémentaires :
Mon champ CS_VEGAQUA est de type entier (Integer64) en 11 caractères et stocke les notes numériques (ldcan_note).
Les libellés et les notes sont définis dans la table LD_canal.
Merci d'avance pour votre aide !
Voici les données exemple de la liste déroulantes en pièce jointe --> LD_canal ou sinon via ce tableau code :
Code:
Ma table de référence `LD_canal`: +------------+------------------------+-----------+---------------------------+ | ldcan_id | ldcan_intitule | ldcan_note| ldcan_classe | +------------+------------------------+-----------+---------------------------+ | 154 | absence | 3 | presenceabsence | | 155 | présence | 0 | presenceabsence | +------------+------------------------+-----------+---------------------------+ | 126 | absence | 0 | recouvrementvegaquatique | | 127 | 0 à 20% | 2 | recouvrementvegaquatique | | 128 | 20 à 40% | 4 | recouvrementvegaquatique | | 129 | 40 à 60% | 5 | recouvrementvegaquatique | | 130 | 60 à 80% | 4 | recouvrementvegaquatique | | 131 | 80 à 100% | 2 | recouvrementvegaquatique | +------------+------------------------+-----------+---------------------------+ | 150 | absence | 0 | vegetationautochtone | | 151 | 1 espèce | 1 | vegetationautochtone | | 152 | 2 et 3 espèces | 3 | vegetationautochtone | | 153 | 4 espèces et plus | 5 | vegetationautochtone | +------------+------------------------+-----------+---------------------------+
Dernière modification par ccam86 (Tue 09 September 2025 08:55)
Hors ligne
#2 Tue 09 September 2025 21:32
- arnaudp
- Participant actif
- Date d'inscription: 20 Sep 2020
- Messages: 50
Re: QGIS: Probl de valeurs ambigues dans listes deroulantes
Bonjour ccam86,
Est-ce que vous ne pourriez pas stocker dans votre couche la valeur ldcan_id, ainsi vous éviteriez l'ambiguité que la note implique.
Ensuite vous faites une jointure (https://docs.qgis.org/3.40/fr/docs/user … two-layers) entre votre couche et la table LD_canal en vous basant sur ldcan_id.
Vous pourriez ensuite faire vos calculs avec la note jointe :
Code:
"CS_VEGRIPI" + "CS_ENVACAN" + "LD_canal_ldcan_note"
Est-ce que ça ne permettrait pas de résoudre le problème ?
Y-a-t-il d'autre contrainte sur le champ CS_VEGAQUA ?
Hors ligne
#3 Wed 10 September 2025 08:24
- ccam86
- Participant occasionnel
- Date d'inscription: 28 Sep 2022
- Messages: 36
Re: QGIS: Probl de valeurs ambigues dans listes deroulantes
Problème : Gestion des libellés et notes dans QGIS
Dans ma couche, je devais gérer des libellés de recouvrement (ex. *0 à 20%*, *80 à 100%*) liés à une table externe `LD_canal`, où plusieurs libellés partagent la même note numérique (`ldcan_note`).
Résultat : quand je choisissais un libellé dans la liste déroulante, QGIS le remplaçait parfois par un autre ayant la même note (perte du libellé choisi).
Solution adoptée
1. Séparer les rôles des champs
* `CS_VEGAQUA` : affiche les libellés (widget Valeur relationnelle)
* `CS_VEGNOTE` : stocke uniquement les notes numériques pour les calculs (champ ajouté)
2. Configuration du widget Valeur relationnelle
* Table : `LD_canal`
* Clé : `ldcan_id` (unique)
* Valeur affichée : `ldcan_intitule`
* Valeur stockée : `ldcan_id`
* Filtre : `ldcan_classe = 'recouvrementvegaquatique'`
3. Conversion id → note
```sql
CASE
WHEN "CS_VEGAQUA" = 126 THEN 0
WHEN "CS_VEGAQUA" = 127 THEN 2
WHEN "CS_VEGAQUA" = 128 THEN 4
WHEN "CS_VEGAQUA" = 129 THEN 5
WHEN "CS_VEGAQUA" = 130 THEN 4
WHEN "CS_VEGAQUA" = 131 THEN 2
ELSE NULL
END
```
4. Contraintes et valeurs par défaut
Exemple pour `CS_VEGAUTO` :
```sql
("CS_VEGNOTE" = 126 AND "CS_VEGAUTO" = 0) OR ("CS_VEGNOTE" != 126)
```
Bénéfices
* Conservation du libellé choisi dans la liste déroulante
* Calculs automatiques fiables grâce à `CS_VEGNOTE`
* Cohérence garantie par des contraintes
Contexte technique
* QGIS 3.40 LTR et 3.44.2
* Champs `Integer64` pour `CS_VEGNOTE` et `CS_VEGAQUA`
Hors ligne