DAO : Function Replace() & Access 2000

Résolu
antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005 - 27 sept. 2005 à 17:42
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 28 sept. 2005 à 19:38
Bonjour,

Je dois faire une petite modification sur une vieille application qui a été développée avec DAO.

J'ai un problème de tri au niveau des apostrophes.
Tri actuel :
- D'AB
- DAC
- D'AD
- DAD
- D'EB
- DEC

Tri désiré:
- D'AB
- D'AD
- D'EB
- DAC
- DAD
- DEC

Ma requête de selection pour permettre cela (elle marche dans les requêtes Access 2000)
Select ... From ... Order by Replace(MonChamp, '''', ''' ');

Le tri est correct grâce à cette requête dans Access, mais impossible de la faire marcher dans VB avec DAO 3.6

C'est le Replace() qui ne marche pas err 3080 fonction non définie

Ligne de code :
vSQL= "Select ... From ... Order by Replace(MonChamp, '''', ''' ')"
set vRs=db.OpenRecordset(vSQL,dbOpenDynaset) >>>l'erreur est ici

Sachant que la même requête sans le replace marche tout à fait

Avez-vous une idée pour que cela fonctionne ? ou une autre façon de faire pour que le tri soit correct?

Merci d'avance.
Cordialement.

29 réponses

antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
28 sept. 2005 à 16:10
Ca y est j'ai trouvé !!!!!!

Si la solution vous interresse :
Faire une requête comme ci dessous :)

SELECT MonChamp
FROM MaTable
ORDER BY
IIf(InStr([MonChamp],Chr(39))>0,Mid([MonChamp],1,InStr([MonChamp],Chr(39))-1) & ' ' & Mid([MonChamp],InStr([MonChamp],Chr(39))+1),[MonChamp])
3
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
27 sept. 2005 à 17:50
salut,
MonChampModifie = Replace(MonChamp,"'","' ")
vSQL= "Select ... From ... Order by " & MonChampModifie
set vRs=db.OpenRecordset(vSQL,dbOpenDynaset) >>>l'erreur n'est plus là
PCPT
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
27 sept. 2005 à 17:51
sachant malgré tout que pour moi, on trie par colonne, et non par occurence ;)
0
antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
27 sept. 2005 à 17:54
MonChamp est le nom de la colonne et nom une variable de VB :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
27 sept. 2005 à 18:18
ok (tu m'as un peu fait peur)
alors çà s'écrit juste "......ORDER BY [|MaTable.MonChamp]"
PCPT
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
27 sept. 2005 à 18:19
sans le |
0
antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
27 sept. 2005 à 19:05
On dirait que tu n'as pas bien compris ma question en fait :)

Un tri classique par order by MaColonne ne trie pas comme je le souhaite les données le replace permet de changer l'ordre de de tri en stipulant de trier l'apostrophe comme apostrophe + espace
La requête marche tres bien dans un editeur SQL que ce soit avec SQL server ou avec Access 2000 SP3 mais impossible de faire executer cette requete par VB en DAO.
Je cherche donc une soluution pour qu'un tri correct (cad comme je le désire et non standat :p ) soit possible.
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
27 sept. 2005 à 19:18
re,
je crois comprendre (enfin)

seulement, je doute que l'on puisse "paramétrer" la manière de trier (à part ASC DESC).
dans le doute, essaie " .....ORDER BY ASC(" & Replace(MonChamp,"'","' ") & ")"
mais j'en doute fort!

une solution alternative?
peut-être faire ta requête sous access, l'enregistrer, et accéder à cette requête (fonctionnelle) à partir de VB
non?

PCPT
0
antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
27 sept. 2005 à 19:26
En fait j'ai déjà essayé de créer la requete directement dans access et de l'appeller dans VB.
Or la requête marche tres bien dans Access mais ne veut pas s'executer dans VB :(
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
27 sept. 2005 à 20:24
re,
je viens de tester :
ma requête s'appelle Req1


<HR>
sql = "SELECT * FROM Req1"
Set rs = db.OpenRecordset(sql, dbOpenDynaset)
For i = 1 To 4
MsgBox rs("USER")
rs.MoveNext
Next
Set rs = Nothing

<HR>

fonctionne nikel (requête simple)

PCPT
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
27 sept. 2005 à 21:50
Salut, à partir de VB6, je vois une solution qui ne va sans doute pas te plaire car ce sera trié comme ça :


- DAC
- DAD
- DEC
- D'AB
- D'AD
- D'EB


Enfin, la voilà quand même (le nombre de @, tu en mets autant que la taille du champ nom pour que ça marche, là j'en ai mis 4 car c'est dans tes exemples) :

"select * from table1 order by format(nom,'@@@@')"

En dehors de ça, j'ai essayé d'autres trucs, ADO comme DAO, avec ou sans requête stockée, même résultat : ignorance de l'apostrophe.
, j'ai essayé ta proposition (avec une base access97), ça ne trie pas comme demandé.
Même coller le résultat de la requête dans une listbox dont la propriété sorted = true, ça ne marche pas.

Quoique je n'ai jamais eu à me poser cette question, s'il y a une solution qui marche, comme demandé au début, avec tous types de bases access, je suis preneur aussi.

PS : replace n'est pas reconnu par le moteur Access (même sous Access).

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
27 sept. 2005 à 22:33
CanisLupus -> ok, merci d'avoir testé. j'ai bien dit que j'en doutais et n'ai pas essayé.
par contre, si la requête de AntidotestFr fonctionne sous access, alors ma dernière proposition est elle testée sous Access2000 (base) // DAO 3.6 VB6 et fonctionne ;)

bonne continuation à tous

PCPT
0
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
27 sept. 2005 à 22:56
Salut,

Tu peux utiliser Replace dans la clause order by.

L'idée, c'est de remplacer quote par zéro par exemple qui est classé avant toute lettre



Supposons une table aa dont la structure est la suivante



- id

- lib



pour afficher selon ton ordre




SELECT aa.*
FROM aa
order by replace( aa.lib,"'","0") asc;


se qui doit te donner



- D'AB
- D'AD
- D'EB
- DAC
- DAD
- DEC


++

Zlub
0
antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
28 sept. 2005 à 09:08
Merci pour toutes ses réponses
Je vais tester tout ça et je reviens vers vous après
0
antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
28 sept. 2005 à 09:29
@PCPT
J'ai donc testé de créer ma requete Req1 comme telle : "Select ... From ... Order by Replace(MonChamp, '''', ''' ');"
J'ai ensuite executer la requete "SELECT * FROM Req1" dans VB

Malheureusement j'ai toujours le message d'erreur

@Zlub
Lis ma question jusqu'au bout
Je fais déjà le replace dans mon Order by mais cela ne marche pas en DAO il ne reconnait pas le replace quelquesoit ce que je mets dans le replace.

@CanisLupus
Le replace marche bien dans Access mais à partir de Access 2000 SP3 (pas testé dans SP2 mais dans Access 2000 de base il marche pas)
J'ai testé ta solution, car ça ne me derangeait pas que les ' soit à la fin.
Mais le résultat ne va pas du tout en fait
J'ai maintenant un tri par nombre de caractère dans le mot en fait c'est à dire j'ai tous les Nom en deux lettre de A à Z puis tous les noms en trois lettre de A à Z ect ...
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
28 sept. 2005 à 10:02
bon, je viens de tester Replace dans access (sql), même problème que toi
(je sais pas si j'ai des SP)

3è alternative?
tu en fais quoi du résultat de la requête......
si tu la décomposes après de retour d'sql, et retries.....

PCPT
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
28 sept. 2005 à 10:03
.......**** j'ai le mesage d'erreur access directement.....
0
antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
28 sept. 2005 à 10:23
Malheureusement il m'est impossible de refaire le tri dans le code.
Comme je l'ai dit au début il s'agit d'un vieille application et la table en question (20000 lignes) est entièrement chargé au démarrage de l'application. Cela met + de 2 Minutes pour ouvrir l'application, je ne peux donc pas me permettre de ralonger encore ce temps d'ouverture

C'est un casse-tête chinois ce truc j'ai mal au crâne lol, j'ai épuré tout un tas de forum pour essayer de trouver une solution

Si tu as le message d'erreur dans Acces directement c'est que tu n'as pas de SP :p J'ai eu le même problème que toi au début j'ai passé le SP3 et Access execute parfaitement la requête now.
0
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 49
28 sept. 2005 à 10:45
euh.... et directement changer les champs? c'est pas envisageable?
0
antidotesfr Messages postés 12 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 septembre 2005
28 sept. 2005 à 11:15
C'est à directement changer les champs?
Pas compris
0