Compléments : Filtre dans 'valeur relationnelle' et contraintes de saisie

la fonction current_value()

L'éditeur d'expression du filtre de l'outil valeur relationnelle propose à partir de QGIS 3.2 de nouvelles fonctions dont current_value('champ') qui renvoi la valeur en cours dans le formulaire du champ désigné. Il s'agit bien de la valeur actuelle dans le formulaire et non de la valeur dans la couche avant de valider. Ceci permet par exemple de filtrer un autre champ en fonction de choix de l'utilisateur pour limiter les valeurs affichées dans une liste déroulante.

Cette fonctionnalité s'avère très utile dans l'alimentation d'un formulaire où les options proposées pour un champ dépendent d'un choix effectué par ailleurs.

Exemple :

on souhaite alimenter une table avec des bassins versants et cours d'eau. Les cours d'eau proposés sont filtrés en fonction du bassin versant retenu.

Le projet se compose de deux tables :

Table Bassin contenant la liste des ruisseaux par bassin

Table Avis contenant un champ BV et un champ Cours d'eau

Table Bassin contenant la liste des ruisseaux par bassin

Table Avis contenant un champ BV et un champ Cours d'eau

L'alimentation de la table Avis s'effectue par un formulaire dont :

le champ «BV» utilise l'outil d'édition Liste de valeurs :

Le champ «Cours d'eau» utilise valeur relationnelle et un filtre  :

Les contraintes de saisie

Tous les outils d'édition de QGIS proposent de définir une contrainte. Elle permet de s'assurer que la valeur de l'attribut saisi sera conforme aux règles édictées. De plus, il est possible d'indiquer qu'un champ doit être non vide (valeur NULL non possible), indépendamment de la règle édictée dans la contrainte.

Lorsque la valeur de l'attribut n'est pas conforme à la contrainte,une croix orange apparaît à coté du champs en mode formulaire. Dans le cas d'une contrainte renforcée, c'est une crois rouge. On peut lire l'intitulé de la contrainte à respecter en survolant la croix.

La syntaxe des contraintes s'appuie sur les expressions QGIS, ce qui permet une grande variété de contrôles : on peut donc contrôler qu'une valeur numérique est incluse entre des bornes ou que le texte saisi réponde à une expression rationnelle.

Quelques exemples :

  • Contrôle que la valeur saisie n'existe pas dans le champ «id » : dbvaluebyid(@layer name, 'id', $id) = "id"

  • Contrôle que la valeur saisie pour le champ «Hauteur» corresponde au choix effectué dans le champ « Habitat »