OVH Cloud OVH Cloud

Access 97

22 réponses
Avatar
Marc
Bonjour,

J'ai une série de champs contenant comme données les chaines de caractères
suivantes :

AAA-1-ABCD4
AAA-2-ABGT45
AAA-01-10
BBB-10-ARRRE20

Je voudrais faire une extraction qui me donnerais comme résultat 3 nouveaux
champs contenant :

AAA 1 A
AAA 2 A
AAA 01 A
BBB 10 A

Quelle fonction utiliser ?

Merci

Marc

10 réponses

1 2 3
Avatar
Jessy Sempere [MVP]
Bonjour

Regardes du côtés de :

Pour champ1 : Left([tonChamp],3)
Pour champ2 : Mid([tonChamp], 5, InStr(5, [tonChamp], "-") - 5)
Pour champ3 : Mid([tonChamp], InStr(5,[tonChamp], "-") + 1,1)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Marc" a écrit dans le message news:
#
Bonjour,

J'ai une série de champs contenant comme données les chaines de caractères
suivantes :

AAA-1-ABCD4
AAA-2-ABGT45
AAA-01-10
BBB-10-ARRRE20

Je voudrais faire une extraction qui me donnerais comme résultat 3
nouveaux

champs contenant :

AAA 1 A
AAA 2 A
AAA 01 A
BBB 10 A

Quelle fonction utiliser ?

Merci

Marc




Avatar
Eric
"Marc" écrivait
news:#:

Bonjour,

J'ai une série de champs contenant comme données les chaines de
caractères suivantes :

AAA-1-ABCD4
AAA-2-ABGT45
AAA-01-10
BBB-10-ARRRE20

Je voudrais faire une extraction qui me donnerais comme résultat 3
nouveaux champs contenant :

AAA 1 A
AAA 2 A
AAA 01 A
BBB 10 A

Quelle fonction utiliser ?

Merci

Marc




Bonjour Marc

Je ne sais pas si sous Access97, tu dispose de la fonction InstrRev. Si
c'est le cas, tu peux faire ca par une requête. Si absent, il
t'apparatiendra de rechercher la 2eme occurence de "-" en partant de la
position donnée par la 1ere
Par contre je n'ai pas compris pourquopi sur le 3eme exemple, le 3eme
champ a un A.

Je te donne la requête:
1er champ : Mot1: Gauche([chptexte];3)
2e : Mot2: ExtracChaîne([chptexte];DansChaîne(1;[chptexte];"-")+
1;instrrev([chptexte];"-")-DansChaîne(1;[chptexte];"-")-1)
3e:Mot3: Gauche(ExtracChaîne([chptexte];instrrev([chpTexte];"-")+1);1)

tu utilises pour se faire les fonctions Gauche() ou Left ou Left$, les
fonctions Instr() et InstrRev() et la fonction Mid ou Mid$

le sql equivalent est :
SELECT Left([chptexte],3) AS Mot1, Mid([chptexte],InStr(1,[chptexte],"-")
+1,instrrev([chptexte],"-")-InStr(1,[chptexte],"-")-1) AS Mot2, Left(Mid
([chptexte],instrrev([chpTexte],"-")+1),1) AS Mot3
FROM Table1;

Instr : Renvoie une valeur de type Variant (Long) indiquant la position
de la première occurrence d'une chaîne à l'intérieur d'une autre chaîne.

InstrREv : Renvoie la position d'une occurrence d'une chaîne dans une
autre, à partir de la fin de la chaîne.

A+
Eric

Avatar
Raymond [mvp]
Bonjour Eric.

ce n'est pas supporté sous 97, mais il existe une fonction de remplacement:
http://access.vba.free.fr/instrrev.htm

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Eric" a écrit dans le message de
news:
"Marc" écrivait
news:#:

Bonjour,

J'ai une série de champs contenant comme données les chaines de
caractères suivantes :

AAA-1-ABCD4
AAA-2-ABGT45
AAA-01-10
BBB-10-ARRRE20

Je voudrais faire une extraction qui me donnerais comme résultat 3
nouveaux champs contenant :

AAA 1 A
AAA 2 A
AAA 01 A
BBB 10 A

Quelle fonction utiliser ?

Merci

Marc




Bonjour Marc

Je ne sais pas si sous Access97, tu dispose de la fonction InstrRev. Si
c'est le cas, tu peux faire ca par une requête. Si absent, il
t'apparatiendra de rechercher la 2eme occurence de "-" en partant de la
position donnée par la 1ere
Par contre je n'ai pas compris pourquopi sur le 3eme exemple, le 3eme
champ a un A.

Je te donne la requête:
1er champ : Mot1: Gauche([chptexte];3)
2e : Mot2: ExtracChaîne([chptexte];DansChaîne(1;[chptexte];"-")+
1;instrrev([chptexte];"-")-DansChaîne(1;[chptexte];"-")-1)
3e:Mot3: Gauche(ExtracChaîne([chptexte];instrrev([chpTexte];"-")+1);1)

tu utilises pour se faire les fonctions Gauche() ou Left ou Left$, les
fonctions Instr() et InstrRev() et la fonction Mid ou Mid$

le sql equivalent est :
SELECT Left([chptexte],3) AS Mot1, Mid([chptexte],InStr(1,[chptexte],"-")
+1,instrrev([chptexte],"-")-InStr(1,[chptexte],"-")-1) AS Mot2, Left(Mid
([chptexte],instrrev([chpTexte],"-")+1),1) AS Mot3
FROM Table1;

Instr : Renvoie une valeur de type Variant (Long) indiquant la position
de la première occurrence d'une chaîne à l'intérieur d'une autre chaîne.

InstrREv : Renvoie la position d'une occurrence d'une chaîne dans une
autre, à partir de la fin de la chaîne.

A+
Eric






Avatar
Jessy Sempere [MVP]
Tiens je veux bien que tu m'envois ça pour voir... ;-))
vu que je suis fidèle à Access 97
@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Raymond [mvp]" a écrit dans le message news:
#U#Tl$
Bonjour Eric.

ce n'est pas supporté sous 97, mais il existe une fonction de
remplacement:

http://access.vba.free.fr/instrrev.htm

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Eric" a écrit dans le message de
news:
"Marc" écrivait
news:#:

Bonjour,

J'ai une série de champs contenant comme données les chaines de
caractères suivantes :

AAA-1-ABCD4
AAA-2-ABGT45
AAA-01-10
BBB-10-ARRRE20

Je voudrais faire une extraction qui me donnerais comme résultat 3
nouveaux champs contenant :

AAA 1 A
AAA 2 A
AAA 01 A
BBB 10 A

Quelle fonction utiliser ?

Merci

Marc




Bonjour Marc

Je ne sais pas si sous Access97, tu dispose de la fonction InstrRev. Si
c'est le cas, tu peux faire ca par une requête. Si absent, il
t'apparatiendra de rechercher la 2eme occurence de "-" en partant de la
position donnée par la 1ere
Par contre je n'ai pas compris pourquopi sur le 3eme exemple, le 3eme
champ a un A.

Je te donne la requête:
1er champ : Mot1: Gauche([chptexte];3)
2e : Mot2: ExtracChaîne([chptexte];DansChaîne(1;[chptexte];"-")+
1;instrrev([chptexte];"-")-DansChaîne(1;[chptexte];"-")-1)
3e:Mot3: Gauche(ExtracChaîne([chptexte];instrrev([chpTexte];"-")+1);1)

tu utilises pour se faire les fonctions Gauche() ou Left ou Left$, les
fonctions Instr() et InstrRev() et la fonction Mid ou Mid$

le sql equivalent est :
SELECT Left([chptexte],3) AS Mot1,
Mid([chptexte],InStr(1,[chptexte],"-")


+1,instrrev([chptexte],"-")-InStr(1,[chptexte],"-")-1) AS Mot2, Left(Mid
([chptexte],instrrev([chpTexte],"-")+1),1) AS Mot3
FROM Table1;

Instr : Renvoie une valeur de type Variant (Long) indiquant la position
de la première occurrence d'une chaîne à l'intérieur d'une autre chaîne.

InstrREv : Renvoie la position d'une occurrence d'une chaîne dans une
autre, à partir de la fin de la chaîne.

A+
Eric










Avatar
Eric
"Raymond [mvp]" écrivait
news:#U#Tl$:

Bonjour Eric.

ce n'est pas supporté sous 97, mais il existe une fonction de
remplacement: http://access.vba.free.fr/instrrev.htm



Bonjour Raymond

Je ne savais plus donc j'avais précisé de rechercher à partir de la 1ere
occurence dans ce cas mais c'est idiot en fait. Il suffit de faire la
recherche en partant de la fin, caractere après caractere. Vais aller voir
ta fonction.

A+
Eric

Avatar
Raymond [mvp]
Bonjour Jessy.

c'est pas la grosse artillerie pour faire une telle fonction.

J'ai lancé un appel à cotisation pour qu'on se groupe et que tu puisses
bénéficier d'un raccordement personnel à internet très rapidement.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jessy Sempere [MVP]" a écrit dans le message de
news:capmhj$4sl$
Tiens je veux bien que tu m'envois ça pour voir... ;-))
vu que je suis fidèle à Access 97


Avatar
Jessy Sempere [MVP]
Ah ben j'ai hate... ;-))

Bon j'ai vu ta fonction, effectivement rien de spécial si ce n'est un test
sur tous les caractères...

Perso j'aurais plutôt fait ça :

Public Function fInStrRev(strText As String, strSearch As String) As Long
Dim lngFind As Long
lngFind = InStr(1, strText, strSearch)
Do While lngFind > 0
fInStrRev = lngFind
lngFind = InStr(lngFind + Len(strSearch), strText, strSearch)
Loop
End Function

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"Raymond [mvp]" a écrit dans le message news:

Bonjour Jessy.

c'est pas la grosse artillerie pour faire une telle fonction.

J'ai lancé un appel à cotisation pour qu'on se groupe et que tu puisses
bénéficier d'un raccordement personnel à internet très rapidement.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jessy Sempere [MVP]" a écrit dans le message
de

news:capmhj$4sl$
Tiens je veux bien que tu m'envois ça pour voir... ;-))
vu que je suis fidèle à Access 97






Avatar
Raymond [mvp]
tu n'as pas pris ton chrono.
fais un essai en entourant ta fonction par for I = 1 to 100000 sur un string
de 1000 caractères
fInStrRev = lngFind ==> ça bouffe le temps
for va plus vite que do
mid par rapport au instr kif kif
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jessy Sempere [MVP]" a écrit dans le message de
news:capoah$5vo$
Ah ben j'ai hate... ;-))

Bon j'ai vu ta fonction, effectivement rien de spécial si ce n'est un test
sur tous les caractères...

Perso j'aurais plutôt fait ça :

Public Function fInStrRev(strText As String, strSearch As String) As Long
Dim lngFind As Long
lngFind = InStr(1, strText, strSearch)
Do While lngFind > 0
fInStrRev = lngFind
lngFind = InStr(lngFind + Len(strSearch), strText, strSearch)
Loop
End Function


Avatar
3stone
Salut Jessy,

"Jessy Sempere [MVP]"
Tiens je veux bien que tu m'envois ça pour voir... ;-))
vu que je suis fidèle à Access 97



Une existait ici : http://memoaccess.free.fr/strings.htm#fInStrRev

Et "moilneu" avait donné la sienne...



Public Function gfn_RechApresCar(sVal As String, sRech As String) As String
'//----o----o----o---Procedure header sample---o----o----o----o----o----o--
'// Procedure gfn_RechApresCar
'// Par : moilneu
'// Date : 21/07/2001 19:31:50
'//
'// Objet : Retourne la valeur contenu dans une chaine située
'// après un caractère déterminer.
'// Pour sVal = 'AA-BB-CC', Retourne 'CC' si sRech = '-'
'//
'// ENTRE <-
'// sVal : Chaine ou la recherche doit être faite.
'// sRech : Caractère à rechercher.
'//
'// SORT ->
'// Le resultat, ou une chaine vide si le caratère rechercher
'// n'as pas été trouver dans la chaine.
'//
'//----o----o----o----o----o----o----o----o----o----o----o----o----o----o--

Dim iPos As Integer '// Position en cours de la recherche.
Dim iMem As Integer '// Mémorisation de la position en cours.
Dim iLongVal As Integer '// Compteur pour la boucle.
Dim sRet As String '// Valeur renvoyer.

iPos = 1
For iLongVal = 1 To Len(sVal)
iPos = InStr(iPos, sVal, sRech)
If iPos = 0 Then
If (iMem <> 0) Then '// Extraire la chaine située après sRech.
sRet = Right(sVal, Len(sVal) - iMem)
End If
Exit For
Else
iMem = iPos '// Mémorise la position en cours.
iPos = iPos + 1
End If
Next iLongVal

gfn_RechApresCar = sRet '// Retourne le resultat.

End Function





Si après cela y a pas le choix ;-)))


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------

Avatar
Raymond [mvp]
J'ai fait des essais sur les différentes fonctions.
sur les strings importants de l'ordre de 1000 caractères, sur 10000 boucles
et 1 seule occurence, ta fonction est nettement plus efficace (gain de 2
secondes, avec mon processeur). Sur les petits strings c'est insignifiant
même sur 10000 boucles. Si le texte recherché est trouvé souvent sur la
partie gauche avec beaucoup d'occurences, l'efficacité diminue très
nettement. Si le texte recherché est un dans un chemin, ta fonction est
moins bonne. Si on fait une synthèse en prenant des valeurs moyennes ta
fonction est nettement plus efficace à mon avis (donc je la remplace).
Conclusion: il a fallu que j'en parle pour que tu te mettes au bouleau alors
tu aurais pu le faire depuis longtemps. c'est vrai qu'aujourd'hui tu n'avais
de courant ? il parait que la sncf a acheté des vélos pour tout le monde et
que vous allez descendre à la cave à tour de rôle pour alimenter les
générateurs ?

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum
1 2 3