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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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 smile

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é hmm

Hors ligne

 

#10 Tue 30 April 2013 11:29

Robin
GeoRezo forever
Lieu: France
Date d'inscription: 31 Aug 2005
Messages: 13614
Site web

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 big_smile

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 smile

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... wink.
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 smile.

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... smile
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 wink.

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 wink.
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

 

Pied de page des forums

Powered by FluxBB