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Ă© ?

#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: 13619
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

Copyright Association GeoRezo