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

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Wed 21 July 2021 00:42

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

QGIS: verifier si doublon - Contrainte valeurs uniques

Bonsoir,

Pour le fonctionnement de mon formulaire, j'aimerais m'assurer que les infos renseignées dans un champs ne soient pas en double ; sauf cas particuliers.
J'ai donc ajouté un champ à cocher (0 false - 1 true) ; et j'aimerais que si ce champ est = à 0 et qu'une valeur en double est trouvée, la contrainte de valeurs uniques s'applique, en revanche, s'il est sur 1, alors l'enregistrement est possible.

Pensez-vous que ce soit possible ?

J'ai trouvé sur le forum :
https://georezo.net/forum/viewtopic.php?pid=318398

Code:

Code:

with_variable(
    'min_distance',
    1000,
    case 
        when aggregate('points', 'count', "fid", filter:=distance(geometry(@parent), $geometry) < @min_distance) > 1
        then
        else
    end
)

Je me dit qu'en adaptant, ce pourrait fonctionner. Dans mon cas je n'ai qu'une colonne à checker ("Code_esp") ; en revanche je ne sais pas vraiment comment adapter.

Je vais voir pour produire un fichier QGIS en guise d'exemple.

Merci de votre attention,  Bonne soirée !

Dernière modification par Giene (Wed 21 July 2021 00:42)

Hors ligne

 

#2 Wed 21 July 2021 12:02

aheurion
Participant actif
Lieu: NANTES
Date d'inscription: 8 Oct 2020
Messages: 141

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Bonjour Giene,

J'ai l'impression qu'il y a une petite différence entre ce que tu dis et ce que ton code tend à faire :
- ce que j'ai compris : tu souhaites vérifier que ton champ (appelons-le "Mon_champ", de ta couche 'Ma_couche') contienne une info unique (dans le cas où "champ_à_cocher" =0)
- ce que ton code tend à faire : il va chercher toutes les entités proches (<1000) dans la couche 'points' (qui je suppose est la même que la couche 'Ma_couche' ?), et s'il y en a plusieurs il va appliquer ce qu'il y aura après le then (un booléen dans ce cas)

Veux-tu donc vérifier si l'info est en doublon ou bien s'il y a une autre entité trop proche ? Ou bien vérifier si l'info est en doublon mais uniquement parmi les entités les plus proches ?

Pour ce dernier cas il faut rajouter une condition dans ton filtre et bien penser à écrire cette expression dans le calculateur d'expression de la contrainte. Ce qui donnera qqchose comme ça :

Code:

 with_variable(
    'min_distance',
    1000,
    case 
    when
          aggregate(
                'points',
                'count',
                "fid",
                distance(geometry(@parent), $geometry) < @min_distance
                AND
                "Mon_champ"=attribute('Mon_champ',@parent)
           )>1
     then 0
     else 1
     end
)

then 0 : la contrainte a trouvé un doublon pour le champ et dans la distance
else 1 : aucun doublon ou au-delà de la distance => pas de contrainte

Hors ligne

 

#3 Wed 21 July 2021 12:19

Julien81
Participant actif
Lieu: Giroussens
Date d'inscription: 14 Jan 2019
Messages: 148

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Bonjour,
si je comprends bien quand votre champs à cocher = faux le "Code_esp" doit être unique, quand vrai il peut se doublonner.
Donc il faut bien, pour le paramétrage de saisie dans le champ "Code_esp", éditer une contrainte par expression :
-on on crée un tableau avec toutes les valeurs uniques (dans le cas ou champ case à cocher =0) de "Code_esp" aggrègées
-Un 'case when' pour vérifier que la valeur saisie n'est pas dans ce tableau quand la case à cocher = 0
Donc quelque chose comme :

Code:

 CASE 
 WHEN "champacocher" is false 
 THEN array_contains("Code_esp", string_to_array(concatenate_unique("Code_esp","champacocher", "champacocher" is false, ','), ',')) is false
 END

Peut-être de mémoire arrayplus à installer dans le dépot d'extensions pour les expression array.
cdlt

Hors ligne

 

#4 Wed 21 July 2021 20:59

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

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Bonsoir,

Merci pour vos deux réponse.

@aheurion : Je n'aurais pas du ajouter le code que j'ai trouvé sur le forum, il vous a induit en erreur.

Comme l'a écrit Julien81 par la suite, quand le champs à cocher ("Ret_lim") = "faux" le "Code_esp" doit être unique, quand "vrai" il peut se doublonner.

@Julien81 : J'ai essayé votre solution, mais pour le moment il ne se passe rien.
Si je renforce la contrainte par expression, alors aucune saisie n'est possible ; si je décoche l'option, alors la contrainte ne s'applique pas car je peux ajouter des doublon (que Ret_lim soit "vrai" ou "faux").

En outre, si je télécharge l'extension ArrayPlus, QGIS crashe (version de QGIS : 3.20).

Je joins un fichier test pour que vous puissiez visualiser, si vous le souhaitez.

https://www.cjoint.com/c/KGvs6kStkHz

Le champ concerné se trouve ici :

   > Couche "Formulaire_Bota_v1.1" ; champ : "Code_esp"

Notez que les couches "Formulaire_Bota_v1.1" et "TERRAIN_SAISIE_LISTE_PT" sont en relation.
Ainsi, dans un fonctionnement normal, pour ajouter des lignes à "Code_est" il faut remplir la couche "TERRAIN_SAISIE_LISTE_PT" qui, entre les deux, est la seule à avoir une géométrie.


Edit: J'ai oublié de préciser que normalement j'aimerais ajouter une autre contrainte qui est que la première lettre doit jours être une majuscule (de là dépend le génération d'une liste).
Je comptais utiliser qqch du genre "upper( left( "Code_esp" ,1))". Mais je ne sais pas comment je vais faire fonctionner les deux expressions à la suite.



De mon côté, je vais essayer de comprendre ce qui cloche..
Je vous remercie pour votre aide !

Bonne fin de soirée !

Dernière modification par Giene (Thu 22 July 2021 01:16)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#5 Thu 22 July 2021 09:09

aheurion
Participant actif
Lieu: NANTES
Date d'inscription: 8 Oct 2020
Messages: 141

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Si tu n'as pas besoin de la distance il suffit d'enlever la partie correspondante :

Code:

case 
    when
          aggregate(
                'points',
                'count',
                "fid",
                "Mon_champ"=attribute('Mon_champ',@parent)
           )>1
     then 0
     else 1
end

L'expression de contrainte doit ressortir un booléen dans tous les cas, donc pour rajouter la contrainte sur la première lettre en majuscule il suffit de rajouter l'expression après un AND :

Code:

case 
    when
          aggregate(
                'points',
                'count',
                "fid",
                "Mon_champ"=attribute('Mon_champ',@parent)
           )>1
     then 0
     else 1
end

AND

left("Code_esp",1)=upper(left("Code_esp",1))

Hors ligne

 

#6 Thu 22 July 2021 17:00

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

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Bonjour,

Il vaut mieux éviter de s'appuyer sur le code que j'ai utilisé en guise d'exemple, pensant qu'il pouvait être utile.

Je n'ai ni 'point', ni 'count', ni "fid" dans ma table attributaire.
A noter qu'il s'agit également d'une couche sans géométrie (si ça peut servir). 

Le code proposé par Julien81 semblait correspondre, mais je n'arrive pas à le faire fonctionner pour le moment..


Si j'enlève les  'points', 'count' et "fid" du code que vous avez écris, ce dernier n'est alors plus valide.

En essayant quelque chose comme ça :


Code:

 CASE 
 WHEN "Ret_lim" is false 
 THEN array_contains("Code_esp", string_to_array(concatenate_unique("Code_esp","Ret_lim", "Ret_lim" is false, ','), ',')) is false
 END
 
 and
 
 left("Code_esp",1)=upper(left("Code_esp",1))

La contrainte du code en majuscule fonctionne, en revanche, pas celle avec la vérification des codes en doubles (si champ "ret_lim" = false)
Au passage, je vous remercie également pour la partie du code qui met en majuscule.


Bonne journée !

Dernière modification par Giene (Thu 22 July 2021 17:16)

Hors ligne

 

#7 Sun 25 July 2021 00:13

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

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Bonsoir,

Je ne parviens ni à faire fonctionner ce code :

Code:

 CASE 
 WHEN "champacocher" is false 
 THEN array_contains("Code_esp", string_to_array(concatenate_unique("Code_esp","champacocher", "champacocher" is false, ','), ',')) is false
 END

Modifié à maintes reprises, avec un résultat NULL systématique.


Ni celui-ci :
(Pour lequel j'ai pratiquement réussi, mais qui ne fonctionne pas encore).


Code:

case 
    when
          aggregate(
                'SAISIE_PT',
                'count',
                "Habitat",
                "Habitat"=attribute('Habitat',@parent)
           )>1
     then 0
     else 1
end

Ou

Code:

case 
    when
          aggregate(
                'SAISIE_PT',
                'count',
                "Habitat"=attribute("Habitat",@parent))>1
     then 0
     else 1
end

J'ai systématiquement 1 en guise de résultat, ce qui n'est pas ce que je veux.

Il y a quelque chose sur cette ligne :

Code:

"Habitat"=attribute("Habitat",@parent))> 2

Qui fait que les attributs ne sont pas comptés, puisque le résultat est 1 même pour les attributs dont le nombre dépasse 1.

Bonne soirée !

Dernière modification par Giene (Sun 25 July 2021 00:32)

Hors ligne

 

#8 Sun 25 July 2021 00:43

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

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Edit :

J'ai adapté comme ceci :

Code:

 left("Code_esp",1)=upper(left("Code_esp",1))
 AND 
 CASE 
 WHEN "Ret_lim" = 'False'
    THEN 
        count("Code_esp","Code_esp") < 2    
 END

Code:

 left("Code_esp",1)=upper(left("Code_esp",1))
 
 AND
 
 CASE 
 WHEN "Ret_lim" = 'False' or "Ret_lim" = False
    THEN 
        count("Code_esp") >= 0    
 Else
        count("Code_esp") = 0
 END

Sauf que lorsque la case "False" n'est pas cochée. A la première saisie, j'ai un message d'erreur qui m'indique que la contrainte n'est pas respectée (notez que la case renforcer les contraintes est cochée) et que l'enregistrement ne sera pas effectué.
Et pourtant ! La ligne est bel et bien renseignée à la fin...


Je pense qu'il y a un conflit entre le moment où count("Code_esp") est = à 0 et le moment où j'enregistre et où il est à 1.

Dernière modification par Giene (Sun 25 July 2021 01:33)

Hors ligne

 

#9 Sun 25 July 2021 23:58

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

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Edit : Message supprimé

Dernière modification par Giene (Mon 26 July 2021 00:02)

Hors ligne

 

#10 Mon 26 July 2021 12:02

aheurion
Participant actif
Lieu: NANTES
Date d'inscription: 8 Oct 2020
Messages: 141

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Re-Bonjour,

Alors:
- 'SAISIE_PT' ça doit bien être l'id que tu obtiens en double-cliquant sur la couche dans le calculateur d'expressions.
- 'count' n'est pas un élément de ta couche, il s'agit juste d'une expression qui indique à l'aggregate de récupérer non pas le contenu d'un champs mais le nombre de correspondances.
- "fid" ici on renseigne un des champs au pif, il ne sera pas utilisé (je me demande même si cet argument n'est pas optionnel ? à voir).

Pour le code en lui-même petit edit pour l'attribute : il faut mettre @parent d'abord et ensuite le nom du champ entre apostrophes simples :

Code:

attribute(@parent,'Habitat')

Ce qui donne :

Code:

case 
    when
          aggregate(
                'SAISIE_PT',
                'count',
                "Habitat",
                "Habitat"=attribute(@parent,'Habitat')
           )>0
     then 0
     else 1
end

strictement supérieur à 0 ( et non pas 1) car on recherche au moins 1 exemplaire déjà présent, autant pour moi.

(Et bien sûr en rajoutant la contrainte sur la majuscule avec :

Code:

AND left("Code_esp",1)=upper(left("Code_esp",1))

)

Dernière modification par aheurion (Mon 26 July 2021 12:03)

Hors ligne

 

#11 Tue 27 July 2021 22:03

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

Re: QGIS: verifier si doublon - Contrainte valeurs uniques

Bonsoir,

Je vous remercie pour votre aide ! A priori, tout fonctionne bien smile

Bonne fin de journée !

Hors ligne

 

Pied de page des forums

Powered by FluxBB