#1 Thu 11 April 2013 16:02
- Frédérique
- Participant actif
- Date d'inscription: 13 Jul 2007
- Messages: 51
Requête SQL ArcGIS
Bonjour,
Cela ne me semble pas compliqué et pourtant, je ne parviens pas à adapter la toute simple requête SQL reprise ci-dessous pour lui préciser que j'aimerais que si l'attribut (TYPE) contient une chaîne de caractères en plusieurs mots, que chaque mot en ressorte avec la première lettre en majuscule ! Pour l'instant, seule la toute première lettre a une majuscule avec la requête que je vous poste.
Code:
UCase(Left([TYPE],1)) & LCase(Right([TYPE], Len([TYPE]) -1))
Merci d'avance pour vos conseils,
F.
Hors ligne
#2 Thu 11 April 2013 18:02
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Bonjour,
Je suppose que c'est dans l'objectif d’étiqueter votre couche. Si c'est bien le cas, pourriez-vous essayer cette formule (dans l'onglet "Etiquettes", après avoir cliqué sur le bouton "Expression...", il faut cocher l'option "Avancée" puis coller la formule dans le bloc en dessous) et me dire si elle répond à votre besoin ?
Code:
Function FindLabel ( [Nom] ) Dim tabChaine, strChaine, strNewChaine, i, lString, nbString, strChaineTmp strChaine = [Nom] strNewChaine="" If strChaine <> "" then tabChaine = Split(strChaine, " ") nbString = UBound(tabChaine) strNewChaine = tabChaine(0) strChaineTmp = tabChaine(0) If nbString > 1 then For i = 1 to UBound(tabChaine) lString = Len(strChaineTmp) strNewChaine = strNewChaine + " " + UCase(Left(tabChaine(i),1)) & LCase(Right(tabChaine(i), Len(tabChaine(i)) -1)) strChaineTmp = tabChaine(i) Next End If End If FindLabel = strNewChaine End Function
Cordialement,
Kevin
Dernière modification par Kevin Jousseaume (Thu 11 April 2013 18:03)
Hors ligne
#3 Mon 15 April 2013 13:56
- Arnaud Elkaim
- Participant occasionnel
- Lieu: Pau
- Date d'inscription: 5 Sep 2005
- Messages: 43
Re: Requête SQL ArcGIS
Bonjour,
Vous avez aussi la possibilité de passer par le Python pour modifier directement dans la géodatabase via "calculer un champs" choisir python
unicode(!Nom de mon Champs!, 'utf8').title()
Cordialement
Arnaud Elkaim
Hors ligne
#4 Thu 25 April 2013 11:50
- Razorbak
- Participant assidu
- Lieu: Clermont Ferrand
- Date d'inscription: 7 Oct 2007
- Messages: 505
Re: Requête SQL ArcGIS
Bonjour,
La formule en VBScript avancé ne fonctionne pas.
J'obtiens toujours l'ensemble de l'étiquette en majuscules (mais sans message d'erreur).
Merci et bonne journée
Hors ligne
#5 Thu 25 April 2013 13:32
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Auriez-vous un exemple de chaines de caractères ?
Car ma formule découpe la chaîne suivant le caractère espace (" "). Si votre séparateur est un tiret ("-"), il est normal que cela ne fonctionne pas. Il faut remplacer
Code:
tabChaine = Split(strChaine, " ")
par
Code:
tabChaine = Split(strChaine, "-")
Dernière modification par Kevin Jousseaume (Thu 25 April 2013 13:34)
Hors ligne
#6 Thu 25 April 2013 15:07
- Razorbak
- Participant assidu
- Lieu: Clermont Ferrand
- Date d'inscription: 7 Oct 2007
- Messages: 505
Re: Requête SQL ArcGIS
Oui effectivement il y a ce cas là, mais j'ai également le cas avec des espaces (et même parfois avec des espaces et des tirets).
Là, en effectuant le remplacement, j'obtiens par exemple BOURG En Bresse (au lieu de Bourg en Bresse), bizarre, non ?
Par exemple, je vais avoir :
- PARIS : sans espace, ni tiret -> Paris
- BOURG-EN-BRESSE : que des tirets -> Bourg-En-Bresse (le mieux serait d'obtenir Bourg-en-Bresse, mais ça risque d'être trop complexe)
- SAINT-DIER D'AUVERGNE : à la fois des tirets et un espace -> Saint-Dier D'Auvergne
Trop compliqué à gérer tous ces cas ?
Merci
Hors ligne
#7 Thu 25 April 2013 17:15
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Razorbak a écrit :
Là, en effectuant le remplacement, j'obtiens par exemple BOURG En Bresse (au lieu de Bourg en Bresse), bizarre, non ?
Non, ce n'est pas bizarre, c'est parce mon code a été fait pour des chaînes de caractères en minuscules et commençant par une majuscule, du coup le 1er bloc de caractères est repris tel quel. D'ailleurs il était fait au départ pour sauter à la ligne au Xème caractère, il y a un reliquat inutile (strChaineTmp)
Voici une version corrective (non testée...) :
Code:
Function FindLabel ( [Nom] ) Dim tabChaine, strChaine, strNewChaine, i, lString, nbString strChaine = [Nom] strNewChaine="" If strChaine <> "" then tabChaine = Split(strChaine, " ") nbString = UBound(tabChaine) strNewChaine = UCase(Left(tabChaine(0),1)) & LCase(Right(tabChaine(0), Len(tabChaine(0)) -1)) If nbString > 1 then For i = 1 to UBound(tabChaine) strNewChaine = strNewChaine + " " + UCase(Left(tabChaine(i),1)) & LCase(Right(tabChaine(i), Len(tabChaine(i)) -1)) Next End If End If FindLabel = strNewChaine End Function
Razorbak a écrit :
Oui effectivement il y a ce cas là, mais j'ai également le cas avec des espaces (et même parfois avec des espaces et des tirets).
Trop compliqué à gérer tous ces cas ?
Non, c'est jouable. Le problème, c'est que ma licence ArcGIS vient d'expirer et que je ne pourrai pas tester quoique ce soit avant plusieurs jours...
J'essaierai demain de vous proposer une nouvelle formule, mais elle risque de planter
Kevin
Dernière modification par Kevin Jousseaume (Thu 25 April 2013 17:17)
Hors ligne
#8 Tue 30 April 2013 09:47
- Razorbak
- Participant assidu
- Lieu: Clermont Ferrand
- Date d'inscription: 7 Oct 2007
- Messages: 505
Re: Requête SQL ArcGIS
Bonjour Kévin,
Bon, ça avance mais je n'obtiens pas encore exactement ce que je cherche.
Cette fois, par exemple, pour SAINT-PRIEST, j'obtiens Saint-priest au lieu de Saint-Priest.
Idem pour un nom avec plus de 2 mots. Seul le premier a une majuscule (Saint-sauveur-en-rue par exemple).
Une idée ?
Merci beaucoup en tout cas
Dernière modification par Razorbak (Tue 30 April 2013 09:48)
Hors ligne
#9 Tue 30 April 2013 10:16
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Bonjour,
Oui, c'est normal, c'est toujours le même problème : ce code ne va fonctionner que pour SAINT PRIEST, pas SAINT-PRIEST.
Si vous voulez qu'il marche pour SAINT-PRIEST, il faut mettre
Code:
tabChaine = Split(strChaine, "-")
Pour ce qui est de le rendre applicable aux 2 à la fois, je n'ai pas eu le temps de regarder et je ne l'aurai pas avant plusieurs jours, désolé
Hors ligne
#10 Tue 30 April 2013 11:29
Re: Requête SQL ArcGIS
Je suppose que c'est dans l'objectif d’étiqueter votre couche.
Si c'est juste pour étiqueter et qu'on veut avoir des retours à la ligne en fonction des espaces ou des tirets, Maplex le fait tout seul (encore faut il avoir la version 10.1...)
EDIT : pour m'expliquer : en supprimant les tirets on supprime le problème
Dernière modification par Robin (Tue 30 April 2013 11:36)
Hors ligne
#11 Wed 01 May 2013 09:14
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Si c'est juste pour étiqueter et qu'on veut avoir des retours à la ligne en fonction des espaces ou des tirets, Maplex le fait tout seul (encore faut il avoir la version 10.1...)
Pas que : il faut aussi mettre en minuscule le texte, sauf la 1ère lettre de chaque partie du nom qui doit être en majuscule. Et dans l'idéal gérer les cas particulier des sous-chaines "au","des","du", etc.
en supprimant les tirets on supprime le problème
Oui et non : ce champ NOM peut être utilisé pour d'autres besoins qui eux nécessitent la présence des tirets et/ou des espaces. Il faudrait donc ajouter un champ spécifique dans lequel on supprimerait les tirets et utiliserait la formule d'Arnaud (unicode(!Nom de mon Champs!, 'utf8').title()) pour avoir le texte sous la forme voulue. Mais avoir plusieurs champs pour stocker la même info, ce n'est jamais très bon et il vaut mieux l'éviter tant que possible.
J'ai commencé à regarder, je devrais réussir à proposer quelque chose dans la journée. Je vous tiens au courant
Kevin
Hors ligne
#12 Wed 01 May 2013 13:16
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Voilà, je pense que ça devrait fonctionner, en tout cas j'ai fait quelques tests qui ont été concluants.
Function FindLabel ( [Nom] )
Dim tabSplitSpace, strName, strNewName, i, tabSplitDash, j
'Force la chaine de caractère à être en minuscule
strName = LCase([Nom])
strNewName = ""
If strName <> "" then
'Découpe la chaine suivant le caractère espace " "
tabSplitSpace = Split(strName, " ")
'Pour chaque sous-chaine de caractères, on découpe avec le caractère tiret "-"
For i = 0 to UBound(tabSplitSpace)
tabSplitDash = Split(tabSplitSpace(i), "-")
If UBound(tabSplitDash) = 0 then
'On met en majuscule la 1ère lettre de la chaine, sauf cas particulier
strSubString = tabSplitDash(0)
If strSubString <> "au" and strSubString <> "de" and strSubString <> "des" and strSubString <> "du" and strSubString <> "en" and strSubString <> "la" and strSubString <> "le" and strSubString <> "les" and strSubString <> "lès" and strSubString <> "sur" and strSubString <> "sous" then
strSubString = UCase(Left(strSubString,1)) & Right(strSubString, Len(strSubString) -1)
End If
'On concatène avec un espace
If strNewName = "" then
strNewName = strSubString
Else
strNewName = strNewName + " " + strSubString
End If
Else
'Il y a un tiret, on parcourt les différentes sous-chaines et on concatène avec un tiret
For j = 0 to UBound(tabSplitDash)
strSubString = tabSplitDash(j)
'On met en majuscule la 1ère lettre de chaque sous-chaine, sauf cas particulier
If strSubString <> "au" and strSubString <> "de" and strSubString <> "des" and strSubString <> "du" and strSubString <> "en" and strSubString <> "la" and strSubString <> "le" and strSubString <> "les" and strSubString <> "lès" and strSubString <> "sur" and strSubString <> "sous" then
strSubString = UCase(Left(strSubString,1)) & Right(strSubString, Len(strSubString) -1)
End If
'Concaténation des sous-chaines avec un tiret
If strNewName = "" then
strNewName = strSubString
Else
strNewName = strNewName + "-" + strSubString
End If
Next
End If
Next
End If
FindLabel = strNewName
End Function
Dites moi ce que cela donne sur vos jeux de données.
Kevin
Hors ligne
#13 Thu 02 May 2013 09:35
- Razorbak
- Participant assidu
- Lieu: Clermont Ferrand
- Date d'inscription: 7 Oct 2007
- Messages: 505
Re: Requête SQL ArcGIS
Bonjour,
Excellent...c'est franchement mieux...
Juste un petit cas à régler (a priori avec les apostrophes) : par exemple, pour L'ARBRESLE, j'obtiens L'arbresle ou =Le BOIS D'OINGT -> le Bois D'oingt (à noter la minuscule à "le").
Mais bon, c'est du détail. Merci beaucoup en tout cas.
Bonne journée
Hors ligne
#14 Thu 02 May 2013 10:15
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Bonjour,
J’espérais que vous ne le verriez pas pour les apostrophes... .
Il est possible d'améliorer ce code pour les prendre en compte, mais c'est un peu compliqué et j'ai accumulé tellement de retard sur d'autres sujets que je ne pourrais pas regarder ça avant plusieurs jours. Du reste, le principe étant similaire à la gestion des espaces et des tirets, si une âme charitable veut s'y coller, elle est la bienvenue .
Bonne fin de semaine,
Kevin
PS : juste une question. Dans le cas de "LE BOIS D'OINGT", vous voudriez "Le Bois d'Oingt" ou "le Bois d'Oingt" ? Idem pour "L'ARBRESLE" : "L'Arbresle" ou "l'Arbresle" ?
Dernière modification par Kevin Jousseaume (Thu 02 May 2013 10:18)
Hors ligne
#15 Thu 02 May 2013 11:25
- Razorbak
- Participant assidu
- Lieu: Clermont Ferrand
- Date d'inscription: 7 Oct 2007
- Messages: 505
Re: Requête SQL ArcGIS
Héhé...
Je comprends, et puis vous m'avez déjà bien aidé...je vais essayé d'avancer avec ça.
Pour LE BOIS D'OINGT, j'aurai aimé obtenir : Le Bois d'Oingt
Pour L'ARBRESLE -> L'Arbresle
Merci encore et bonne journée
Hors ligne
#16 Fri 03 May 2013 08:43
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Bonjour,
Il faut croire que mon subconscient déteste rester sur une tâche inachevée : en me réveillant ce matin, je savais exactement comment articuler les choses...
Cela ne m'a donc pris que quelques minutes pour améliorer (et tester) le code que voici :
Function FindLabel ( [Nom] )
Dim tabSplitSpace, strName, strNewName, i, tabSplitDash, j, tabSplitApostrophe, k
'Force la chaine de caractère à être en minuscule
strName = LCase([Nom])
strNewName = ""
If strName <> "" then
'Découpe la chaine suivant le caractère espace " "
tabSplitSpace = Split(strName, " ")
'Pour chaque sous-chaine de caractères, on découpe avec le caractère tiret "-"
For i = 0 to UBound(tabSplitSpace)
tabSplitDash = Split(tabSplitSpace(i), "-")
If UBound(tabSplitDash) = 0 then
'Gestion des apostrophes
tabSplitApostrophe = Split(tabSplitDash(0), "'")
strSubString = tabSplitApostrophe(0)
If strSubString = "l" or strSubString = "d" Then
If UBound(tabSplitApostrophe) > 0 then
For k = 1 to UBound(tabSplitApostrophe)
strSubString = strSubString + "'" + UCase(Left(tabSplitApostrophe(k),1)) & Right(tabSplitApostrophe(k), Len(tabSplitApostrophe(k)) -1)
Next
End If
Else
'On met en majuscule la 1ère lettre de la sous-chaine, sauf cas particulier
If strSubString <> "au" and strSubString <> "de" and strSubString <> "des" and strSubString <> "du" and strSubString <> "en" and strSubString <> "la" and strSubString <> "le" and strSubString <> "les" and strSubString <> "lès" and strSubString <> "sur" and strSubString <> "sous" then
strSubString = UCase(Left(strSubString,1)) & Right(strSubString, Len(strSubString) -1)
End If
End If
'Concaténation des sous-chaines avec un espace
If strNewName = "" then
'On met nécessairement une majuscule en début du mot
strNewName = UCase(Left(strSubString,1)) & Right(strSubString, Len(strSubString) -1)
Else
strNewName = strNewName + " " + strSubString
End If
Else
'Il y a un tiret, on parcourt les différentes sous-chaines et on concatène avec un tiret
For j = 0 to UBound(tabSplitDash)
'Gestion des apostrophes
tabSplitApostrophe = Split(tabSplitDash(j), "'")
strSubString = tabSplitApostrophe(0)
If strSubString = "l" or strSubString = "d" Then
If UBound(tabSplitApostrophe) > 0 then
For k = 1 to UBound(tabSplitApostrophe)
strSubString = strSubString + "'" + UCase(Left(tabSplitApostrophe(k),1)) & Right(tabSplitApostrophe(k), Len(tabSplitApostrophe(k)) -1)
Next
End If
Else
'On met en majuscule la 1ère lettre de chaque sous-chaine, sauf cas particulier
If strSubString <> "au" and strSubString <> "de" and strSubString <> "des" and strSubString <> "du" and strSubString <> "en" and strSubString <> "la" and strSubString <> "le" and strSubString <> "les" and strSubString <> "lès" and strSubString <> "sur" and strSubString <> "sous" then
strSubString = UCase(Left(strSubString,1)) & Right(strSubString, Len(strSubString) -1)
End If
End If
'Concaténation des sous-chaines avec un tiret
If strNewName = "" then
'On met nécessairement une majuscule en début du mot
strNewName = UCase(Left(strSubString,1)) & Right(strSubString, Len(strSubString) -1)
Else
strNewName = strNewName + "-" + strSubString
End If
Next
End If
Next
End If
FindLabel = strNewName
End Function
Malheureusement, mon subconscient ne m'a pas donné pour autant de réponses à mes interrogations sur mes autres projets (je ne parle même pas de celles métaphysiques...), je vais donc vous laisser et y consacrer mes prochaines heures/journées .
A bientôt,
Kevin
Dernière modification par Kevin Jousseaume (Fri 03 May 2013 11:18)
Hors ligne
#17 Fri 03 May 2013 09:33
- Razorbak
- Participant assidu
- Lieu: Clermont Ferrand
- Date d'inscription: 7 Oct 2007
- Messages: 505
Re: Requête SQL ArcGIS
Salut,
Waouh ! C'est super !
Merci beaucoup Kévin !! C'est du super boulot !
J'espère pouvoir un jour te rendre la pareille...
Bon courage pour tes autres projets.
A+ et bonne journée
Hors ligne
#18 Fri 03 May 2013 11:17
- Kevin Jousseaume
- Participant assidu
- Lieu: Nanterre, région parisienne
- Date d'inscription: 20 Mar 2006
- Messages: 217
Re: Requête SQL ArcGIS
Ne te sens pas redevable vis-à-vis de moi, cela me sera peut-être utile par le futur et puis j'espère que cela pourra aider ou donner des idées à d'autres.
Et si vraiment tu souhaites me faire plaisir, tu peux toujours faire un don à Georezo (http://www.mailforgood.com/don/associat … geomatique) : je te rassure, je ne suis pas membre du bureau .
A+,
Kevin
Hors ligne
#19 Thu 27 June 2013 15:18
- Rémi.Baranoff
- Participant occasionnel
- Lieu: Arles sur Tech
- Date d'inscription: 16 Jan 2008
- Messages: 23
Re: Requête SQL ArcGIS
Merci Kévin !!
Hors ligne