Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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 Sat 27 November 2021 12:16

Giene
Participant actif
Date d'inscription: 1 Dec 2018
Messages: 75

QGIS 3.22: Contrainte si champ non null sur une autre couche

Bonjour,

J'aimerais contraindre un champ selon le contenu d'un autre champ, situé sur une autre couche.

Tout d'abord, il s'agit de ces deux champs ; situés dans deux couches en relation:
- "Pla-cort" ; sur la couche "TERRAIN_SAISIE_LISTE_PT"

- "Recouvr" sur la couche "Formulaire_Bota_v1.1"


Ce que je cherche à faire :
Lorsque le champ "Pla-cort" est complété ; alors ne pas pouvoir valider si le champ "Recouvr" n'est pas complété également.
Si le champ "Pla-cort" est vide, alors "Recouvr" peut être complété ou non.

J'ai testé comme ceci, sans succès :

Code:

CASE
WHEN aggregate(layer:='TERRAIN_SAISIE_LISTE_PT',aggregate:='min_length',expression:="Pla-cort") > 0
THEN
    "Recouvr" is not null
END

Code:

CASE
WHEN aggregate(layer:='TERRAIN_SAISIE_LISTE_PT',aggregate:='min_length',expression:="Pla-cort") > 0
THEN
    "Recouvr" is not null
ELSE
    "Recouvr" is null or "Recouvr" is not null
END

J'ai l'impression que :

Code:

aggregate(layer:='TERRAIN_SAISIE_LISTE_PT',aggregate:='min_length',expression:="Pla-cort")

est systématiquement = à 0.


Je vous remercie de votre attention,

Bonne journée !

Dernière modification par Giene (Sat 27 November 2021 12:19)

Hors ligne

 

#2 Sun 28 November 2021 11:59

Giene
Participant actif
Date d'inscription: 1 Dec 2018
Messages: 75

Re: QGIS 3.22: Contrainte si champ non null sur une autre couche

Bonjour,

J'ai encore essayé avec la fonction aggregate, mais ça n'est pas ça, je me retrouve avec l'ensemble des données contenues dans le champ désigné regroupées, alors que j'aimerais travailler uniquement avec le champ en cours de remplissage dans la couche parent et connaître sa valeur (NULL / pas NULL).
Les deux couches parents / enfant sont liées via un ID et je pense qu'il faut que je m'appuie sur cet ID.

La couche enfant n'a pas de géométrie, ce qui fait que je ne peux pas utiliser les fonctions spaciales.


Test

Code:

CASE
WHEN
aggregate(layer:='TERRAIN_SAISIE_LISTE_PT',aggregate:='concatenate',expression:="Pla-cort" || "Ident") is not NULL
THEN
    CASE
    WHEN
    length(aggregate(layer:='TERRAIN_SAISIE_LISTE_PT',aggregate:='concatenate',expression:="Pla-cort" || "ID")) - length("ID_esp")> 0 
    THEN
        "Recouvr" is not null
    ELSE
        "Recouvr" is null or "Recouvr" is not null
    END
ELSE
    "Recouvr" is null or "Recouvr" is not null
END

Donc, finalement pour contourner le problème en attendant de trouver mieux ; comme les deux couches sont liées par un ID, lorsque le champ "Pla-cort" est non NULL, j'ajoute '@P' à la fin de l'identifiant.
Ensuite, dans les contraintes, puisque l'ID apparaît aussi dans la couche fille, il me suffit de m'y prendre comme ça pour vérifier si "Pla-cort" est nul ou pas :

Code:

CASE
WHEN
length("ID_esp") - length(replace("ID_esp",'@','')) > 0
THEN
    "Recouvr" is not NULL
ELSE
    "Recouvr" is NULL or "Recouvr" is not NULL
END

Si Pla-cort est NULL, pas d'  '@P' dans l'ID, la contrainte retourne 0 ; sinon la contrainte retourne 1.


A plus tard !

Hors ligne

 

Pied de page des forums

Powered by FluxBB