Pages: 1
- Sujet précédent - QGIS 3.0.1: Création d'un identifiant unique et automatique - Sujet suivant
#1 Wed 16 May 2018 10:40
- BOYER.M
- Participant actif
- Date d'inscription: 5 Sep 2012
- Messages: 148
QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
Mes couches ont leur premier champs qui est un ID.
Ces couches de points et de lignes seront modifiées en numérisant des éléments et donc il y aura de nouvelles entités de créées.
Je voudrais donc qu'a chaque création de nouvelle entité mon champs ID soit automatiquement renseigné par : N°INSEE de la commune + XXX (diminutif du nom de la couche) + 5 chiffres (00001, 00002, ...). N°INSEE de la commune est présent dans un champs de la couche nommé "INSEE".
Dans ma calculatrice de champs j'ai utilisé la formule : "INSEE" || 'XXX' || lap(to_string(@row_number),5,0)
Cela fonctionne très bien, mais effectivement que pour les entités déjà présentent dans ma couche. Si je crée une nouvelle entité le champs ID sera vide.
Donc je vais dans les propriétés de la couche, dans l'onglet formulaire d'attributs et la je laisse bien 'édition de texte' en 'type d'outils' puis en 'valeur par défaut' je renseigne ma formule écrite plus haut. Il m'est indiqué dans l'aperçu la valeur comme 'NULL'. Le champs ID n'est pas renseigné lors de la création d'une nouvelle entité.
Du coup j'ai remplacé @row_number par $id, l'aperçu dans les propriétés de ma couche est bon.
Cependant lorsque je crée ma nouvelle entité elle est toujours 'NULL'.
Puisque je souhaite qu'il débute juste après la dernière valeur. Si mon dernière ID est '30150XXX00327', je veux que l'entité créée est comme ID '30150XXX00328' quand la couche contient déjà des entités où j'ai calculé avec la calculatrice de champs l'ID. Sinon que l'ID commence à '30150XXX00000'.
J'espère avoir étais claire dans mes propos.
Cordialement,
Hors ligne
#2 Wed 16 May 2018 12:39
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
Voir la note de la doc sur l'option valeur par défaut: impossible d'utiliser d'autres champs de l'entité en cours de création pour en générer un autre.
Par contre, on peut utiliser les autres entités/couches donc en supposant que l'on dispose d'une couche commune et en ayant installé l'extension reffunctions,
Code:
concat(geomwithin( 'commune', 'champinsee'), 'XXX', lpad(count($id)+1, 5, 0)) -- pas trop sûr du +1
devrait renvoyer quelque chose de pas trop mal, je pense. A tester en condition plus réelle que moi.
En ligne
#3 Wed 16 May 2018 16:28
- BOYER.M
- Participant actif
- Date d'inscription: 5 Sep 2012
- Messages: 148
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
Avec concat('XXX', lpad(count($id)+1, 5, 0)) j'ai bien un id = XXX01935 par exemple qui fait bien suite au dernier.
Je n'arrive pas à utiliser la fonction geomwithin pour le moment je vais plus m'y pencher dessus.
Edit : C'est bon, je suis arrivé. Merci
Dernière modification par BOYER.M (Wed 16 May 2018 17:10)
Hors ligne
#4 Thu 17 May 2018 10:56
- BOYER.M
- Participant actif
- Date d'inscription: 5 Sep 2012
- Messages: 148
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
Pensez-vous qu'il est possible de faire débuter l'ID à "00000" pour la première entité ajouter sur une autre commune. C'est à dire aujourd'hui toutes nos entités sont sur la même commune donc le numéro INSEE est le même, mais rapidement plusieurs communes vont être ajouter. Et donc est-il possible que l'on est finalement un "$id" pour chaque commune.
Peut en utilisant une fonction "CASE WHEN" ? mais QGIS ne comprendra de faire plusieurs "suites" distinctes d'"$id" en fonction du n°INSEE de la commune, une valeur "NULL" met renvoyé à chaque nouvelle entité quelque soit la commune.
Cas pour deux communes, dont l'une à pour n°insee 30000.
Code:
concat(geomwithin('commune','insee'), 'XXX', CASE WHEN 'lot' = "30000" THEN lpad(count($id)+1, 5, 0) ELSE lpad(count($id), 5, 0) END)
Cordialement
Dernière modification par BOYER.M (Thu 17 May 2018 11:21)
Hors ligne
#5 Thu 17 May 2018 14:19
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
La fonction count est une fonction d'agrégation donc elle prend comme paramètre un group_by mais aussi un filtre qui en l'occurrence peut se limiter à la commune en question et QGIS3 apporte une fonction intéressante with_variable (voir l'aide si besoin).
Code:
with_variable('idcom', -- on crée une variable qui va stocker le code insee de la commune geomwithin( 'commune', 'champinsee'), -- le code insee de la commune à stocker with_variable('nbrentites', -- on crée une autre variable qui va stocker le nombre d'entités sur la commune identifiée juste avant count($id; filter:="INSEE"=@idcom), -- le comptage en question limité à la commune concat(@idcom, 'XXX', case when @nbrentites=0 then '00000' else lpad(@nbrentites +1, 5, 0) end) -- on fait la concaténation en utilisant '00000' si pas d'entités, autrement, comme d'hab - je m'interroge toujours sur le +1, cela dit ))
Je n'ai pas testé le code en lui-même, juste quelques fonctions séparées et la logique d'écriture donc à vous de voir si elle correspond pile poil au besoin (et de nous tenir au courant).
En ligne
#6 Thu 17 May 2018 21:48
- BOYER.M
- Participant actif
- Date d'inscription: 5 Sep 2012
- Messages: 148
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
Après rapide test,on y est presque. Le soucis actuellement c'est que pour chaque entité créée dans la seconde commune on a un '00000' puis de nouveau '00000'. L'objectif étant que l'on augmente de un pour chaque nouvelle entité.
Cordialement
Dernière modification par BOYER.M (Thu 17 May 2018 21:53)
Hors ligne
#7 Fri 18 May 2018 09:38
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Si ça renvoie '00000', c'est que @nbrentites est toujours égal à 0, et donc que sa définition count($id, filter:="INSEE"=@idcom) est toujours évaluée à 0, surement parce que le champ "INSEE" n'existe pas dans votre couche.
En ligne
#8 Fri 18 May 2018 17:01
- BOYER.M
- Participant actif
- Date d'inscription: 5 Sep 2012
- Messages: 148
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
effectivement je n'ai pas de champ "INSEE" puisqu'il se nomme "lot". Donc après correction, cette fois-ci, pour toute les entités quelque soit la commune j'ai un id de type : N°INSEE + XXX + 00000. Pour le numéro INSEE c'est il change selon la commune. mais pour le '00000' cela ne bouge pas sur toutes les communes.
Hors ligne
#9 Fri 18 May 2018 17:05
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Partagez le code utilisé et peut-être qu'on pourra trouver ce qui cloche. Autrement on va discuter dans le vide.
En ligne
#10 Mon 21 May 2018 08:29
- BOYER.M
- Participant actif
- Date d'inscription: 5 Sep 2012
- Messages: 148
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
Merci pour votrre aide, voici le code utilisé qui finalement celui que vous avez transmis avec les modfications pour les noms des champs et tables.
Code:
with_variable('idcom', geomwithin('commune_chateaurenard','lot'), with_variable('nbentites', count($id,filter:="lot"=@idcom), concat(@idcom,'REG',case when @nbentites=0 then '00000' else lpad(@nbentites,5,0) end) ))
Dernière modification par BOYER.M (Mon 21 May 2018 08:29)
Hors ligne
#11 Mon 21 May 2018 20:03
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
Code:
with_variable('idcom', geomwithin('commune_chateaurenard','lot'),
Ca veut dire que la couche commune_chateaurenard contient toutes les communes et leur code insee est renseigné dans le champ lot. On est d'accord?
Code:
with_variable('nbentites', count($id,filter:="lot"=@idcom),
Ça veut dire que la couche en cours d'édition contient aussi un champ lot où sont renseignés les codes insee. Est-ce sous le même format, meme type de données que la couche commune_chateaurenard?
Si on est d'accord jusque-là, alors pas c'est pas cool.
Essayez alors de customiser des bouts de ce code en étiquetage de la couche en édition pour voir ce qui est renvoyé à chaque étape (j'ai un doute sur ce que renvoie la partie filtre - visiblement du null). Genre:
"lot"=geomwithin('commune_chateaurenard', 'lot') qui devrait renvoyer 1 si tout est bien renseigné.
En ligne
#12 Tue 22 May 2018 11:11
- BOYER.M
- Participant actif
- Date d'inscription: 5 Sep 2012
- Messages: 148
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
BOYER.M a écrit:Bonjour,
Code:
with_variable('idcom', geomwithin('commune_chateaurenard','lot'),
Ca veut dire que la couche commune_chateaurenard contient toutes les communes et leur code insee est renseigné dans le champ lot. On est d'accord?
On est bien d'accord.
BOYER.M a écrit:Code:
with_variable('nbentites', count($id,filter:="lot"=@idcom),
Ça veut dire que la couche en cours d'édition contient aussi un champ lot où sont renseignés les codes insee. Est-ce sous le même format, meme type de données que la couche commune_chateaurenard?
Si on est d'accord jusque-là, alors pas c'est pas cool.
Non dans la couche d'édition il n'y a pas de champs "lot" le champs se nomme "INSEE". Même type (texte) mais pas même longueur. Peut aller chercher la valeur dans le champs INSEE alors que l'entité n'existe pas lors de l'édition ?
Dernière modification par BOYER.M (Tue 22 May 2018 11:12)
Hors ligne
#13 Tue 22 May 2018 11:33
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS 3.0.1: Création d'un identifiant unique et automatique
Bonjour,
Non dans la couche d'édition il n'y a pas de champs "lot" le champs se nomme "INSEE".
D'où l'erreur... Dans cette formule, on compte les entités dans la couche éditée ayant déjà @idcom pour code insee et donc on doit utiliser le champ contenant ladite information à savoir "INSEE" qui du coup existait bien dans votre couche édition (https://georezo.net/forum/viewtopic.php?pid=309027#p309027 - mais pas dans la couche de superposition).
Peut aller chercher la valeur dans le champs INSEE alors que l'entité n'existe pas lors de l'édition ?
Dans ce contexte-ci, non; on regarde juste les propriétés de celles qui sont déjà là et qui lui ressemblent.
En ligne
Pages: 1
- Sujet précédent - QGIS 3.0.1: Création d'un identifiant unique et automatique - Sujet suivant