OVH Cloud OVH Cloud

Parcourir la table

30 réponses
Avatar
yannick
Bojour,
je voudrais savoir si sur access on pouvait rechercher un mot dans une table
entiere
(non pour un seul champs mais pour tous les champs de cette table)
exemple: table client avec les champs suivant
id nom adresse cp ville
01 toto rue fr 75000 paris
02 tata rue de 75000 paris
03 titi toto 75000 paris
04 tutu rue 75000 tokkkkk

j'aimerais obtenir toutes les enregistrement qui présentent le mot "to"

le résultat serait donc :
id nom adresse cp ville
01 toto rue fr 75000 paris
03 titi toto 75000 paris
04 tutu rue 75000 tokkkkk

J'espère que j'ai été assez explicite.

Merci pour toutes aides

Bon week end

Yannick

10 réponses

1 2 3
Avatar
Eric
.../...
parti trop vite !
Et la fonction comme cà :
Function Kumquat(strNomTable As String, strCle As String, _
lngRang As String) As String


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr
Avatar
yannick
j'ai essayer avec de l'apha cela fonctionne mais ce que je ne comprend pas
c'est que lorque j'utilse les fonctions le resultat s'execute en 12 seconde ,
je n'ai plus la main alorsque si je ne passe pas par celles-ci en 1 seconde
j'ai le résultat.
Surprenant. C'est bizzare. J'aurais bien voulu pourtant utilser les
fonctions pour les rappeler pour d'autres formulaires mais la je suis coincé.
vois tu pourquoi cette différence?

Cordialement

Yannick



..../...
parti trop vite !
Et la fonction comme cà :
Function Kumquat(strNomTable As String, strCle As String, _
lngRang As String) As String


--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr



Avatar
Salut

Pour les problèmes de performances d'une requete SQL, j'avais déjà
expérimenté ce problème.
La solution que j'avais trouvée et qui permettait d'obtenir un résultat
beaucoup plus rapidement consistait à bâtir ta requete comme ceci :

SELECT * FROM LaTable WHERE Nom= "*to*"
UNION
SELECT * FROM LaTable WHERE Adresse= "*to*"
UNION
SELECT * FROM LaTable WHERE Ville= "*to*";

Attention : cette requête n'est plus modifiable....mais je serais curieux de
savoir ce que vont devenir tes 12 secondes avec cette méthode.....

--
A+
Arnaud
-----------------------------------------------------
Tout ce qu'il faut savoir est sur http://www.mpfa.info
-----------------------------------------------------

"yannick" a écrit dans le message de
news:
j'ai essayer avec de l'apha cela fonctionne mais ce que je ne comprend pas
c'est que lorque j'utilse les fonctions le resultat s'execute en 12
seconde ,

je n'ai plus la main alorsque si je ne passe pas par celles-ci en 1
seconde

j'ai le résultat.
Surprenant. C'est bizzare. J'aurais bien voulu pourtant utilser les
fonctions pour les rappeler pour d'autres formulaires mais la je suis
coincé.

vois tu pourquoi cette différence?

Cordialement

Yannick



Avatar
yannick
Avec la solution que tu m'as donne (avec le Having) en concatenant ou le Or
de Eric c'est hyper rapide, mais Eric ma suggerer une autre methode au lieu
de saisir tout mes champs qui celle avec une fonction globale, elle
fonctionne mais elle met 12 seconde.
Pourtant je ne vois pas la difference, a mon avis ça doit etre la maniere de
lecture des enregistrements en memoire
12 secondes en faisant cela:
SELECT *
FROM client
WHERE (((Kumquat1("client","N°client",[N°client])) Like [test]));

Function Kumquat1(strNomTable As String, strCle As String, _
lngRang As String) As String

Dim rst As DAO.Recordset, f As DAO.Field, newf As String
Set rst = CurrentDb.OpenRecordset( _
"Select * from [" & strNomTable & "] Where [" _
& strCle & "]='" & lngRang & "'")

For Each f In rst.Fields
newf = newf & " " & f.Value
Next f
Kumquat1 = newf
rst.Close
Set rst = Nothing
End Function
Bizzare, bizzare
@+

Yannick





Salut

Pour les problèmes de performances d'une requete SQL, j'avais déjà
expérimenté ce problème.
La solution que j'avais trouvée et qui permettait d'obtenir un résultat
beaucoup plus rapidement consistait à bâtir ta requete comme ceci :

SELECT * FROM LaTable WHERE Nom= "*to*"
UNION
SELECT * FROM LaTable WHERE Adresse= "*to*"
UNION
SELECT * FROM LaTable WHERE Ville= "*to*";

Attention : cette requête n'est plus modifiable....mais je serais curieux de
savoir ce que vont devenir tes 12 secondes avec cette méthode.....

--
A+
Arnaud
-----------------------------------------------------
Tout ce qu'il faut savoir est sur http://www.mpfa.info
-----------------------------------------------------

"yannick" a écrit dans le message de
news:
j'ai essayer avec de l'apha cela fonctionne mais ce que je ne comprend pas
c'est que lorque j'utilse les fonctions le resultat s'execute en 12
seconde ,

je n'ai plus la main alorsque si je ne passe pas par celles-ci en 1
seconde

j'ai le résultat.
Surprenant. C'est bizzare. J'aurais bien voulu pourtant utilser les
fonctions pour les rappeler pour d'autres formulaires mais la je suis
coincé.

vois tu pourquoi cette différence?

Cordialement

Yannick








Avatar
yannick
j'ajoute j'ai essayé avec les requetes union, elles sont aussi rapides que
les autres sauf pour la méthode d'Eric avec les fonctions globales
Je suis donc obliger de le faire pour tous mes champs manuelement.

Donc la méthode avec les fonctions globales est à revoir

Bonne soirée et je remercie.

@+

Yannick



Salut

Pour les problèmes de performances d'une requete SQL, j'avais déjà
expérimenté ce problème.
La solution que j'avais trouvée et qui permettait d'obtenir un résultat
beaucoup plus rapidement consistait à bâtir ta requete comme ceci :

SELECT * FROM LaTable WHERE Nom= "*to*"
UNION
SELECT * FROM LaTable WHERE Adresse= "*to*"
UNION
SELECT * FROM LaTable WHERE Ville= "*to*";

Attention : cette requête n'est plus modifiable....mais je serais curieux de
savoir ce que vont devenir tes 12 secondes avec cette méthode.....

--
A+
Arnaud
-----------------------------------------------------
Tout ce qu'il faut savoir est sur http://www.mpfa.info
-----------------------------------------------------

"yannick" a écrit dans le message de
news:
j'ai essayer avec de l'apha cela fonctionne mais ce que je ne comprend pas
c'est que lorque j'utilse les fonctions le resultat s'execute en 12
seconde ,

je n'ai plus la main alorsque si je ne passe pas par celles-ci en 1
seconde

j'ai le résultat.
Surprenant. C'est bizzare. J'aurais bien voulu pourtant utilser les
fonctions pour les rappeler pour d'autres formulaires mais la je suis
coincé.

vois tu pourquoi cette différence?

Cordialement

Yannick








Avatar
Eric
Bonsoir,

Normal que ça soit plus long puisque pour chaque enregistrement du jeu
j'ouvre un recordset sur la même table pour concaténer les valeurs, le
referme et enfin passe la chaine à la fonction. Donc, si ton jeu
contient 21000 enregistrements, la fonction ouvre en plus 21000
recordset d'un enregistrement. Par contre, je ne pensais pas arriver à
un temps aussi pénalisant voire médiocre.
Mon idée initiale était de ne pas avoir à faire la concaténation à la
main dans le générateur de requête.
Ma fonction doit être mal faite ---> A la poubelle.
Arnaud t'a proposé 2 solutions qui font leurs preuves.


j'ajoute j'ai essayé avec les requetes union, elles sont aussi rapides que
les autres sauf pour la méthode d'Eric avec les fonctions globales
Je suis donc obliger de le faire pour tous mes champs manuelement.

Donc la méthode avec les fonctions globales est à revoir

Bonne soirée et je remercie.

@+

Yannick





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
yannick
Bonjour et Merci pour tous
j'utilise la methode du having de Arnaud sinon la tienne avec le Or tourne
aussi vite, sinon pour ta fonction c'etait bien pensé pourtant.

Bon dimanche

@+

Yannick



Bonsoir,

Normal que ça soit plus long puisque pour chaque enregistrement du jeu
j'ouvre un recordset sur la même table pour concaténer les valeurs, le
referme et enfin passe la chaine à la fonction. Donc, si ton jeu
contient 21000 enregistrements, la fonction ouvre en plus 21000
recordset d'un enregistrement. Par contre, je ne pensais pas arriver à
un temps aussi pénalisant voire médiocre.
Mon idée initiale était de ne pas avoir à faire la concaténation à la
main dans le générateur de requête.
Ma fonction doit être mal faite ---> A la poubelle.
Arnaud t'a proposé 2 solutions qui font leurs preuves.


j'ajoute j'ai essayé avec les requetes union, elles sont aussi rapides que
les autres sauf pour la méthode d'Eric avec les fonctions globales
Je suis donc obliger de le faire pour tous mes champs manuelement.

Donc la méthode avec les fonctions globales est à revoir

Bonne soirée et je remercie.

@+

Yannick





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr




Avatar
Salut Eric,

"Eric" a écrit dans le message de
news:
Mon idée initiale était de ne pas avoir à faire la concaténation à la
main dans le générateur de requête.
Ma fonction doit être mal faite ---> A la poubelle.
Arnaud t'a proposé 2 solutions qui font leurs preuves.


une 3ème solution idée comme ça qui permettrait de combiner les deux
méthodes.

Le code SQL serait de la forme :
"select * from latable where " & fConcatChamps(latable) & " like '*to*'"

L'idée serait de créer une fonction qui liste et concatène tous les champs
de latable
elle retournerait donc tout simplement champ1&champ2&champ3......&champ999

ensuite, on rajoute un paramètre pour le critère, on currentdb.exécute ça et
c'est automatique sans ouvrir de recordset à chaque fois ;-)))


--
A+
Arnaud
-----------------------------------------------------
Tout ce qu'il faut savoir est sur http://www.mpfa.info
-----------------------------------------------------

Avatar
Eric
Bonjour Arnaud,

Oui, j' y avais pensé mais je ne sais pas comment faire évaluer dans la
requête la chaine concaténée. Même avec Eval() je n'y suis pas arrivé
dans le générateur de requêtes.
Toutefois j'ai contourné le problème de la manière suivante:

Une fonction qui :
1 - concatène les champs de la table passée en paramètre et qui demande
les caracères à comparer.
2 - Création d'une requête temporaire qui est ouverte ( ;-) )
3 - Affichage des résultats
4 - Suppression de la query temporaire.

Cette fonction est appelée sur le clic d'un bouton de formulaire
(inconvénient éventuel mais on court-circuite le générateur). Ca donne
le code ci-dessous mais à parfaire évidemment.

Il faudrait que Yannick teste pour donner une évaluation des temps de
réponse par rapport aux autres méthodes.

Function fConcatChamps(UneTable As String)
Dim t As DAO.TableDef, f As DAO.Field
Dim qry As DAO.QueryDef, reponse As String
Dim strsql As String
For i = 0 To CurrentDb.TableDefs(UneTable).Fields.Count - 1
LesChamps = LesChamps & "[" & _
CurrentDb.TableDefs(UneTable).Fields(i).Name & "] & "
Next i
reponse = InputBox("Caractère(s) cherché(s)")
strsql = "select * from " & UneTable & _
" where " & Left(LesChamps, Len(LesChamps) - 3) & _
" like '*" & Trim(reponse) & "*'"
Set qry = CurrentDb.CreateQueryDef("tmp", strsql)
DoCmd.OpenQuery "tmp"
CurrentDb.QueryDefs.Delete "tmp"
Set qry = Nothing
End Function

Sur l'évènement clic d'un bouton de formulaire :
Private Sub Commande0_Click()
Dim reponse As String, msg As String
msg = "Nom de la table où" & _
vbCrLf & "s'effectue la recherche ?"
reponse = InputBox(msg)
If Len(reponse) = 0 Then
MsgBox " Action interrompue", vbInformation
Else
reponse = Trim(reponse)
fConcatChamps (reponse)
End If
End Sub


Salut Eric,

"Eric" a écrit dans le message de
news:

Mon idée initiale était de ne pas avoir à faire la concaténation à la
main dans le générateur de requête.
Ma fonction doit être mal faite ---> A la poubelle.
Arnaud t'a proposé 2 solutions qui font leurs preuves.



une 3ème solution idée comme ça qui permettrait de combiner les deux
méthodes.

Le code SQL serait de la forme :
"select * from latable where " & fConcatChamps(latable) & " like '*to*'"

L'idée serait de créer une fonction qui liste et concatène tous les champs
de latable
elle retournerait donc tout simplement champ1&champ2&champ3......&champ999

ensuite, on rajoute un paramètre pour le critère, on currentdb.exécute ça et
c'est automatique sans ouvrir de recordset à chaque fois ;-)))




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Avatar
Salut Eric

bien bien, et moi il faudra que je réinstalle office un de ces jours pour
tester tout ça aussi ;-)

--
A+
Arnaud
-----------------------------------------------------
Tout ce qu'il faut savoir est sur http://www.mpfa.info
-----------------------------------------------------


"Eric" a écrit dans le message de
news:%
Bonjour Arnaud,


Function fConcatChamps(UneTable As String)


1 2 3