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é ?

#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

 

Pied de page des forums

Copyright Association GeoRezo