Message posté par : aheurion
----------------------------------------
-----------------
Citation :
En ce qui concerne le deuxième code, il me retourne soit des vides ('') soit une
erreur avec l'impossibilité de de calculer l'agrégat
-----------------
Ah ça doit être à cause du passage entre int et string : l'aggregate va chercher un
string (avec 'concatenate_unique') donc pour pouvoir incrémenter il faut le
transformer en int (
-----------------
Code :
to_int(right("ID",5))+1
-----------------
)
Le souci c'est que Qgis ne comprend pas que ces string qu'il récupère peuvent
effectivement être transformés en int (ce qu'on ne peut pas faire avec toutes les
chaînes de caractères).
J'avais eu ce souci une fois, pour le régler il faut utiliser le to_int en dehors de
l'aggregate.
Sinon j'ai planché un peu sur ton problème et je pense avoir trouvé une solution qui
couvre toutes les possibilités.
1) commencer par vérifier qu'on a bien coché la contrainte d'unicité (et la
renforcer si besoin), comme ça le formulaire indiquera si l'ID par défaut est en
doublon (même si on verra dans la formule ci-après que ça ne devrait pas arriver)
2) on va renseigner une formule dans la valeur par défaut et il faudra bien cocher la case
"Appliquer la valeur par défaut sur la mise à jour". On est obligé de cocher la
case avec la formule qu'on va utiliser mais pas de souci, il n'y a aucun risque
puisqu'on va dire au départ de la formule :
-----------------
Code :
if("ID_STRING" is not null, "ID_STRING",
---------reste de l'expression----------
)
-----------------
3) Dans la formule on va chercher quelques infos : l'ID du câble précédent et l'ID
max dans la couche. On va les utiliser dans une variable pour pouvoir les utiliser autant
de fois qu'on veut sans avoir à tout réécrire :
-----------------
Code :
with_variable('ID_precedent',
aggregate(
'lignes_reperes_84fb1a4d_e1bb_4412_9bc1_46c4f465ee79',
'concatenate_unique',
"ID_STRING",
intersects(start_point(geometry(@parent)),end_point($geometry))
),
---------reste de l'expression----------
)
-----------------
-----------------
Code :
with_variable('ID_max',
array_last(array_sort(aggregate(
'lignes_reperes_84fb1a4d_e1bb_4412_9bc1_46c4f465ee79',
'array_agg',
"ID_STRING"
))),
---------reste de l'expression----------
)
-----------------
4) On crée notre ID à l'aide de l'ID du câble précédent :
-----------------
Code :
with_variable('proposition_ID',
concat(
'C',
lpad(
to_int(
right(@ID_precedent,5)
)+1,
5,
'0'
)
),
---------reste de l'expression----------
)
-----------------
5) On regarde s'il y a doublon entre ce nouvel ID et les autres déjà présents dans la
couche :
-----------------
Code :
with_variable('booleen_doublon',
aggregate(
'lignes_reperes_84fb1a4d_e1bb_4412_9bc1_46c4f465ee79',
'count',
1,
@proposition_ID="ID_STRING"
)>0
,
---------reste de l'expression----------
)
-----------------
6)On crée un nouvel ID qui sera ID_max+1 (dans le cas d'un doublon ou d'un câble
non créé à la suite d'un autre) :
-----------------
Code :
with_variable('proposition_ID_2',
concat(
'C',
lpad(
to_int(
right(@ID_max,5)
)+1,
5,
'0'
)
),
---------reste de l'expression----------
)
-----------------
7)Enfin on va sortir ce qu'on veut en fonction de la situation : câble à la suite
d'un autre et pas de doublon : ID_X+1 / câble isolé ou doublon : IDmax+1 :
-----------------
Code :
CASE
WHEN @ID_precedent is not null AND NOT @booleen_doublon THEN @proposition_ID
ELSE @proposition_ID_2
END
-----------------
Ce qui donne si on colle tout bout à bout :
-----------------
Code :
if("ID_STRING" is not null, "ID_STRING",
with_variable('ID_precedent',
aggregate(
'lignes_reperes_84fb1a4d_e1bb_4412_9bc1_46c4f465ee79',
'concatenate_unique',
"ID_STRING",
intersects(start_point(geometry(@parent)),end_point($geometry))
),
with_variable('proposition_ID',
concat(
'C',
lpad(
to_int(
right(@ID_precedent,5)
)+1,
5,
'0'
)
),
with_variable('ID_max',
array_last(array_sort(aggregate(
'lignes_reperes_84fb1a4d_e1bb_4412_9bc1_46c4f465ee79',
'array_agg',
"ID_STRING"
))),
with_variable('booleen_doublon',
aggregate(
'lignes_reperes_84fb1a4d_e1bb_4412_9bc1_46c4f465ee79',
'count',
1,
@proposition_ID="ID_STRING"
)>0
,
with_variable('proposition_ID_2',
concat(
'C',
lpad(
to_int(
right(@ID_max,5)
)+1,
5,
'0'
)
),
CASE
WHEN @ID_precedent is not null AND NOT @booleen_doublon THEN @proposition_ID
ELSE @proposition_ID_2
END
))))))
-----------------
Désolé si c'est un peu indigeste, mais ça devrait fonctionner pas trop mal ^^
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=345410#p345410
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net