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 Wed 13 July 2011 10:59

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

fonction & chaine de caractère

Bonjour,

Je cherche à faire une sélection de type

Instr(1,VTT,"1"),

dans le but de sélectionner tous les tronçons d'un parcours VTT

Ou "1" est le numéro du circuit VTT. Or dans ce car il va me trouver les circuits 1, 10, 11 ..., 100, 101, ....

dans un champ de type caractère associé ) un tronçon pouvant contenir plusieurs circuits passant sur ce tronçon  ex: 1 ; 17 ; 23

Comment définir que ma sous-chaine de caractère "1" est une chaine complète et non partielle.


Merci d'avance pour vos réponses



Martini Lucas

Dernière modification par ML_CG04 (Wed 13 July 2011 11:08)

Hors ligne

 

#2 Wed 13 July 2011 11:20

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Salut,

Le SQL ne pourrait t'il pas répondre à ton besoin --> where ton_champ like "1"?
A+
Joël

Dernière modification par Spacejo (Wed 13 July 2011 11:21)

Hors ligne

 

#3 Wed 13 July 2011 11:24

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

Dans ce cas la il ne sélectionne que les champs contenant exclusivement le circuit 1

Dans le champ VTT les tronçons qui contiennent les circuits par exemple 1 ; 17 ; 23 ne sont pas sélectionnés


J'espère arriver à etre clair, mon problème est assez particulier je pense

Dernière modification par ML_CG04 (Wed 13 July 2011 11:26)

Hors ligne

 

#4 Wed 13 July 2011 11:29

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Dans ce cas la il ne sélectionne que les champs contenant exclusivement le circuit 1


Le SQL ne sélectionne pas de champs mais des lignes (éléments).

Dans le champ VTT les tronçons qui contiennent les circuits par exemple 1 ; 17 ; 23 ne sont pas sélectionnés


--> Si le 1 sera sélectionné mais pas les autres.Ce n'est pas ce que tu désires?
Par contre la fonction "Instr" ne te sélectionnera rien --> elle retourne une position de caractère dans une chaine.
Je ne comprends pas trop ton problème?

Dernière modification par Spacejo (Wed 13 July 2011 11:41)

Hors ligne

 

#5 Wed 13 July 2011 11:41

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

Oui je me suis mal exprimé je recommence,


Nous avons une table qui contient des champs dont l'un de ces champs se nomme VTT. C'est un champ de 20 caractères.

Pour chaque ligne de ce champ je renseigne le n° du circuit vtt auquel il correspond. Une ligne correspond à un troçon. Un circuit VTT est composé de plusieurs troncons et plusieurs circuits VTT peuvent passer par le meme troncon.

Donc une ligne du champ VTT peut etre renseigner soit avec un numéro unique dans le meilleur des cas. Mais dans la plupart des cas le troncon est commun a plusieurs parcours et je renseigne dans la ligne les numéro de circuit à la suite comme ceci:

1 ; 17 ; 23; Transubayenne

Mon but est de faire une sélection capable de sélectionner tous les troncons d'un circuit meme. Dans la selection que tu me propose il ne sélectionne que les troncon dont seul le circuit 1 passe dessus. Mais dans le cas ou le troncon est commun a plusieurs circuits alors il ne les sélectionne pas puisque la ligne correspondante au troncon est renseigné de la sorte 1 ; X ; XX


Est-ce plus clair?

Dernière modification par ML_CG04 (Wed 13 July 2011 11:46)

Hors ligne

 

#6 Wed 13 July 2011 11:51

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Ah là je comprends mieux wink

Instr(1,VTT,"1") --> Ceci va te donner la position qu'occupe le "1" dans ta chaine (champ) "VTT" (le premier "1", vu que tu ne peux avoir qu'un "1" dans ta chaine) --> je pense que tu pourrais utiliser  Instr(VTT,"1") --> Voir --> http://msdn.microsoft.com/fr-fr/library … 80%29.aspx
Mais cette fonction comme je te l'ai dis ci dessus ne te sélectionnera aucun enregistrement sad
Par contre j'aurais besoin d'une précision.
Ta chaine de caractères est en ordre croissant --> c'est à dire que ton "1" est toujours en première position?
Si c'est le cas --->

Code:

Select * from Ta_Table where Left$(VTT,1) like "1" into Resultat

devrait faire l'affaire

Dernière modification par Spacejo (Thu 01 September 2011 19:24)

Hors ligne

 

#7 Wed 13 July 2011 11:53

SPujol
Participant actif
Lieu: Villeneuve d'Ascq
Date d'inscription: 10 Jan 2008
Messages: 61

Re: fonction & chaine de caractère

Bonjour,

Essaye peu etre de tester, pour un chemin dont le numéro est 86:

Code:

select * from ma_table where VTT="86" or VTT like "%;86;%" or VTT like "86;%" or VTT like "%;86"

Sylvain PUJOL (Collecte Localisation Satellite - CLS)

Hors ligne

 

#8 Wed 13 July 2011 11:58

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

OK avec SPujol avec une petite correction

Code:

select * from ma_table where VTT="86" or VTT like "%;86 ;%" or VTT like "86 ;%" or VTT like "%;86"

Si tes circuits sont bien rentrés avec un espace aprés le ";" --> 1 ;17 ;23 ; Transubayenne

Dernière modification par Spacejo (Thu 14 July 2011 09:54)

Hors ligne

 

#9 Wed 13 July 2011 11:58

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

On va partir du principe que non elle n'est pas en ordre croissante. La raison c'est que je ne numérise pas forcément dans l'ordre du numéro des parcours. D'autant plus que l'on peut avoir des circuit qui n'on pas des numéros mais des noms.

J'ai parlé de Instr mais en réalité je prend la fonction qui va bien, du moment quelle me sélectionne le numéro du circuit. Elle doit etre capable de me prendre aussi bien les troncons qui ne passent que sur le circuits 1 mais aussi ceux qui passe sur le circuits 1 mais aussi sur commun à d'autre sans me prendre les troncons donc le 1 fait parti du nombre du numéro (comme 11; 121; .....).


Ouf.....

Merci deja de vous interresser a mon problème. Je comprend en fait que la fonction instr me prendra un troncon renseigné par exemple 10 ; 22 ou 32 ; 173 car il trouvera un 1 dans la chaine de carectère.

Je test vos propositions ... je vous tiens au courant

Dernière modification par ML_CG04 (Wed 13 July 2011 11:59)

Hors ligne

 

#10 Wed 13 July 2011 12:01

SPujol
Participant actif
Lieu: Villeneuve d'Ascq
Date d'inscription: 10 Jan 2008
Messages: 61

Re: fonction & chaine de caractère

Les espaces c'est mon péché mignon


Sylvain PUJOL (Collecte Localisation Satellite - CLS)

Hors ligne

 

#11 Wed 13 July 2011 12:03

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Moi aussi c'est pour ça que je n'ai plus de cheveux sur la tête wink

Hors ligne

 

#12 Wed 13 July 2011 12:17

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

Alors la dernière solution proposée par Spacejo est exactement ce qu'il me faut. Merci a vous deux pour cette proposition.

J'en profite encore un peu, si j'ai bien compris les "espaces" ca sert a rien....

Si je suis tres bourrin et que je me lance dans la modification de mes lignes et que pour chaque circuit je mes des () autour de mes n° de circuit (1) mes sélections seraient beaucoup plus simples au final, pensez vous que c'est une bonne solution?

Hors ligne

 

#13 Wed 13 July 2011 12:39

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Le tout est de rester rigoureux dans les entrées dans ta table.
C'est vraie qu'une () c'est plus visible qu'un espace smile

Hors ligne

 

#14 Wed 13 July 2011 13:46

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

oui mais du coup avec des ligne renseignées de cette facon:

(1) ; (17) ; (23) et la fonction insrt(1,mon_champ,"(1)") ca règle le problème de la sélection ... non?

Hors ligne

 

#15 Wed 13 July 2011 14:23

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Non car comme je l'ai dis ci dessus la fonction "Instr" te retourne une position dans la chaine de caractères.

Code:

InStr([start, ]string1, string2[, compare])

Retourne un entier spécifiant la position de début de la première occurrence d'une chaîne à l'intérieur d'une autre.
Start

    Facultatif. Expression numérique qui définit la position de départ de chaque recherche. Si cet argument est omis, la recherche commence à la position du premier caractère. L'index de début est de base 1.

String1

    Requis. Expression String recherchée.

String2

    Requis. Expression String recherchée.

Compare

    Facultatif. Spécifie le type de comparaison de chaînes. Si Compare est omis, le paramètre Option Compare détermine le type de comparaison.

Hors ligne

 

#16 Wed 13 July 2011 14:28

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Pour sélectionner tous les enregistrements passant par un tronçon (1)

Code:

Select * from Ta_Table where VTT like "(1)" into Resultat

Tu retrouveras dans ta sélection "Resultat" tes enregistrements.
Si tu veux maintenant ceux qui passent par (1) et (2)

Code:

Select * from Ta_Table where VTT like "(1)" and  VTT like "(2)" into Resultat2

Hors ligne

 

#17 Wed 13 July 2011 14:48

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

oui mais je travail à l'échelle d'un département et nous avons 3500km de circuits vtt numérisés.... pas mal mais du coup je ne peux pas simplement faire la sélection du (1) avec (2), en réalité je ne sais pas quel troncon supporte quel circuit.

Donc je veux sélectionner (1) qu'il soit seul sur le troncon ou qu'il partage le troncon avec d'autre circuits. Et le coup des parenthèses pour éviter qu'il sélectionne le circuit 1 mais aussi tous ceux qui dans leur numéro on un 1 (par espace VTT FFC on a entre 20 et 30 circuits pour un total d'environ 200 circuits sur le département).

Tu vois ce que je veux dire?

Enfin la je pinaille j'ai deja une bonne solution grâce à toi et Spujol.

C'est pour approfondir.

Dernière modification par ML_CG04 (Wed 13 July 2011 15:00)

Hors ligne

 

#18 Wed 13 July 2011 16:04

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

Re: fonction & chaine de caractère

Donc une ligne du champ VTT peut etre renseigner soit avec un numéro unique dans le meilleur des cas. Mais dans la plupart des cas le troncon est commun a plusieurs parcours et je renseigne dans la ligne les numéro de circuit à la suite comme ceci:

1 ; 17 ; 23; Transubayenne


Ouille, c'est vilain ça... (en terme de bases de données)
Tu ferais mieux d'avoir une table à part avec écrit : ID_TRONCON;ID_CIRCUIT

TRONCON_1;1
TRONCON_1;17
TRONCON_1;23
TRONCON_1;Transubayenne


Etc.

Avec à part ta table de troncon ayant comme attributs ID_TRONCON

Une fois cela fait, on est dans un schéma de sélection plus classique CIRCUIT n°X qui retourne Y troncons ou inversement la liste des circuits utilisés par 1 tronçon en particulier.

EDIT : pour ceux qui ont lu la première version de mon message, j'ai corrigé quelques erreurs d'interprétation.

Dernière modification par Robin (Wed 13 July 2011 16:08)

Hors ligne

 

#19 Wed 13 July 2011 16:07

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Donc je veux sélectionner (1) qu'il soit seul sur le troncon ou qu'il partage le troncon avec d'autre circuits. Et le coup des parenthèses pour éviter qu'il sélectionne le circuit 1 mais aussi tous ceux qui dans leur numéro on un 1


Là je ne comprends pas bien.
Si tu mets dans ta requête --> VTT like "(1)" --> celà sélectionnera tous les enregistrements ayant dans le champ VTT uniquement (1)
si VTT like "%(1)" alors --> sélection des enregistrements dont la chaine de caractères se termine par (1).
si VTT like "%(1)%" alors --> sélection des enregistrements dont la chaine de caractères comporte (1).
En aucun cas tu ne peux avoir une sélection de (10) par exemple.
Voir "expressions régulières"
Pour en savoir plus voici un post intéressant --> http://www.forumsig.org/showthread.php?t=31713
Voir le Post de "Gene"
ou ceci --> http://www.developpez.net/forums/d45904 … uetes-sql/
--> http://msdn.microsoft.com/fr-fr/library/ms174214.aspx

Dernière modification par Spacejo (Wed 13 July 2011 17:00)

Hors ligne

 

#20 Wed 13 July 2011 17:02

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

Pour répondre à robin, en effet, en terme de BD ce n'est pas beau mais malheureusement je suis stagiaires et les personnes travaillant avant moi puis après moi sur ce sujet ont pris ces habitudes et cela restera en l'état pour le moment, il est certain que cela ne me plait guère aussi.

Apres multiples essais je vais rester sur la manip' que vous m'avez montré au début car j'ai plus de 1000 lignes à modifier si je veux mettre des ().

En effet avec une requête de type VTT like "%(1)" or VTT like "%(1)%" or VTT like "(1)%" j'obiendrais le résultat voulu sans avoir de (10) dans le cas d'une ligne renseignée comme ceci (1)(17)(23).

Je vais me débrouiller comme cela mais avant tout profiter de ce week-end de 4 jours en vous remerciant bien et sans doute en revenant vers vous lundi prochain.

Merci de vos réponses.


Amicalement Lucas Martini

Hors ligne

 

#21 Wed 13 July 2011 17:10

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Si tu veux changer les ; par des () celà peut se faire en batch (par lots) en automatique.
Une solution pour incrémenter ton champ "VTT".
-Création d'un nouveau champ VTT1 celà évite d'écraser ton champ initial.

Code:

Select * from ma_table where VTT="86" or VTT like "%;86 ;%" or VTT like "86 ;%" or VTT like "%;86" into Resultat
Update Resultat Set VTT1=VTT1 & "(86)"

Procédé ainsi pour chaque circuit
Ceci peut aussi être automatisé avec ce logiciel que j'ai portabilisé:
La manip est la suivante:
-1 crée une liste des différents circuits
-2 copier ces requêtes dans le script initial
-3 Génération du script final
-4 Copier/coller le script final dans la FMB
Script Initial:

Code:

Select * from ma_table where VTT="XXXX" or VTT like "%;XXXX ;%" or VTT like "XXXX ;%" or VTT like "%;XXXX" into Resultat
Update Resultat Set VTT1=VTT1 & "(XXXX)"

Hors ligne

 

#22 Wed 13 July 2011 17:11

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Voilà le Log:


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#23 Mon 18 July 2011 11:53

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

Bonjour Spacejo,

Merci pour cette automatisation, en effet ca fonctionne et meme plutot bien avec le Scriptgen.

Voici une extrait du script généré:

Code:

Select * from PDIPR_04_stage_lucas where VTT="1" or VTT like "%;1 ;%" or VTT like "1 ;%" or VTT like "%;1" into Resultat
Update Resultat Set VTT1=VTT1 & "%(1)%"



Select * from PDIPR_04_stage_lucas where VTT="2" or VTT like "%;2 ;%" or VTT like "2 ;%" or VTT like "%;2" into Resultat
Update Resultat Set VTT1=VTT1 & "%(2)%"



Select * from PDIPR_04_stage_lucas where VTT="3" or VTT like "%;3 ;%" or VTT like "3 ;%" or VTT like "%;3" into Resultat
Update Resultat Set VTT1=VTT1 & "%(3)%"



Select * from PDIPR_04_stage_lucas where VTT="4" or VTT like "%;4 ;%" or VTT like "4 ;%" or VTT like "%;4" into Resultat
Update Resultat Set VTT1=VTT1 & "%(4)%"


Select * from PDIPR_04_stage_lucas where VTT="5" or VTT like "%;5 ;%" or VTT like "5 ;%" or VTT like "%;5" into Resultat
Update Resultat Set VTT1=VTT1 & "%(5)%"

Cependant dans cette configuration, lorsque je lance cela dans ma FMB, le résultat n'est pas parfait. Dans les lignes du Champ VTT1 correspondantes au lignes du Champ VTT dans lesquelles il y a plusieurs circuits, je me rend compte qu'avec ce script, seul le numéro du dernier circuit est updaté. Au lieu d'avoir, (1)(17)(23) je n'ai que (23).

Je dois faire une erreur quelque part ou oublier quelque chose. J'ai le meme problème si je le fait manuellement circuit par circuit.

Hors ligne

 

#24 Mon 18 July 2011 13:52

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Salut,

Dans mon script initial c'est --> "(XXXX)" donc "(5)" (si dans ta liste tu as 1 2 3 4 5 6 etc...) et non "%(5)%" les % sont en trop

Dernière modification par Spacejo (Mon 18 July 2011 13:58)

Hors ligne

 

#25 Mon 18 July 2011 14:08

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

En effet cela est deja une première erreur, que j'ai corrigé par la suite

Je ne maitrise pas le SQL, mais je suppose qu'avec ton VTT1=VTT1 & "(XXXX)" tu essais de créer une "boucle"?

Select * from PDIPR_04_stage_lucas where VTT="1" or VTT like "%;1 ;%" or VTT like "1 ;%" or VTT like "%;1" into Resultat
Update Resultat Set VTT1=VTT1 & "(1)"



Select * from PDIPR_04_stage_lucas where VTT="2" or VTT like "%;2 ;%" or VTT like "2 ;%" or VTT like "%;2" into Resultat
Update Resultat Set VTT1=VTT1 & "(2)"



Select * from PDIPR_04_stage_lucas where VTT="3" or VTT like "%;3 ;%" or VTT like "3 ;%" or VTT like "%;3" into Resultat
Update Resultat Set VTT1=VTT1 & "(3)"


Avec un script de ce type, j'en suis au problème que je t'ai cité au post d'avant, a savoir que dans une ligne contenant plusieurs circuits, seul le dernier est mis dans des ().

Hors ligne

 

#26 Mon 18 July 2011 22:51

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Peux tu nous poster un échantillon de ta table (si ce n'est pas indiscret), pour effectuer quelques essais?
A+
Joël

Hors ligne

 

#27 Tue 19 July 2011 09:20

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

Pas de soucis voici un extrait en cours de traitement sur la commune de Digne les Bains.

Il est bien fourni en circuit VTT.


Merci de prendre du temps pour m'aider dans cette histoire de sélection.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#28 Fri 22 July 2011 18:28

Spacejo
Membre
Lieu: Nancy
Date d'inscription: 17 Aug 2008
Messages: 2511

Re: fonction & chaine de caractère

Salut,

Je viens de regarder ta table et je me suis apperçu que tous les cas n'étaient pas représent2S wink
En effet --> par exemple --> ; 2 ; (l'espace avant le ; )
Donc voilà le script pour les 3 premiers circuits:

Code:

Select * from extrait_pdipr where VTT="1" or VTT like "%;1 ;%" or VTT like "1 ;%" or VTT like "%;1" or VTT like "%; 1" or VTT like "%; 1 ;%"into Resultat
Update Resultat Set VTT1=VTT1 & "(1)"
Select * from extrait_pdipr where VTT="2" or VTT like "%;2 ;%" or VTT like "2 ;%" or VTT like "%;2" or VTT like "%; 2" or VTT like "%; 2 ;%" into Resultat
Update Resultat Set VTT1=VTT1 & "(2)"
Select * from extrait_pdipr where VTT="3" or VTT like "%;3 ;%" or VTT like "3 ;%" or VTT like "%;3" or VTT like "%; 3" or VTT like "%; 3 ;%"into Resultat
Update Resultat Set VTT1=VTT1 & "(3)"

Qui fonctionne chez moi et sur ton extrait de table
A+
Joël

Dernière modification par Spacejo (Tue 02 August 2011 12:07)

Hors ligne

 

#29 Tue 02 August 2011 08:35

ML_CG04
Participant occasionnel
Lieu: Digne les Bains
Date d'inscription: 9 May 2011
Messages: 19
Site web

Re: fonction & chaine de caractère

Merci Joël Je vais faire mes essais avec ta dernière solution.

Pour ce qui est des possibilités non représentées je comptais en effet prévoir un nombre de cas plus important. Comme je reprends un travail en cours, il me faut etre assez large pour comptabiliser d'éventuelles fautes de frappes ou autres façons de saisir. Je pense que des espaces sont manquant par exemple.

Je viendrais faire le retour d'expérience.


Bonne journée


Lucas

Hors ligne

 

Pied de page des forums

Powered by FluxBB