OVH Cloud OVH Cloud

DlookUp sur index

7 réponses
Avatar
martial
Salut à toutes et tous,

existe-il une fonction style Dlookup avec laquelle je peux faire une
recherche sur un index ou PrimaryKey

du style :

Dlookup(MonChamp,MaTable,"PrimaryKey =" & MaValeur)

Merci d'avance ???

Martial

7 réponses

Avatar
Raymond
Bonjour.

voir methodes Seek , findfirst, findlast ....... sur un recordset DAO.

--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"martial" a écrit dans le message de
news:%
Salut à toutes et tous,

existe-il une fonction style Dlookup avec laquelle je peux faire une
recherche sur un index ou PrimaryKey

du style :

Dlookup(MonChamp,MaTable,"PrimaryKey =" & MaValeur)

Merci d'avance ???

Martial




Avatar
martial
Oui merci, mais ça je connaissais.
Le problème c'est que sur une très grosse application (pleine de fonctions)
faite sous access 2.0 et transformée en access2000, j'essaie d'optimiser un
peu pour gagner en performance.
A l'époque de access2.0, le Dlookup n'existait pas et j'ai un tas de
fonctions qui utilisent les openrecordset et des set
acnbase=currentdb().....

Alors je me suis dis que ce serait rudement bien s'il existait un genre
Dlookup sur index.
Mais bon, si ce n'est pas le cas ce n'est pas grave, j'optimiserais autre
chose !!!!

Merci tout de même pour ta réponse
Martial
Avatar
Raymond
Le dlookup peut se faire sur n'importe quel champ, mais ne ramène qu'une
seule valeur, alors que les seek ramènent l'enregistrement. findfirst est
plus rapide que seek ( parait-il)

--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"martial" a écrit dans le message de
news:
Oui merci, mais ça je connaissais.
Le problème c'est que sur une très grosse application (pleine de
fonctions)

faite sous access 2.0 et transformée en access2000, j'essaie d'optimiser
un

peu pour gagner en performance.
A l'époque de access2.0, le Dlookup n'existait pas et j'ai un tas de
fonctions qui utilisent les openrecordset et des set
acnbase=currentdb().....

Alors je me suis dis que ce serait rudement bien s'il existait un genre
Dlookup sur index.
Mais bon, si ce n'est pas le cas ce n'est pas grave, j'optimiserais autre
chose !!!!

Merci tout de même pour ta réponse
Martial




Avatar
martial
Bien, je vais faire avec alors...
Encore merci pour ton aide

Martial
Avatar
Crevecoeur Jérôme
Humm...
Tu es sur raymond?

Pourtant Seek utilise explicitemet l'index alors que findfirst est un peu
plus brouillon, il est possible d'y mettre un peu n'importe quoi.
Faudrait que je fasse un benchmark un de ces 4...

--
----------------------------------------------------------------------------
--------------------
Crévecoeur Jérôme

ACS INFORMATIQUE
122,rue du Château d'orgemont
49000 ANGERS
Tel: 02 41 68 42 36 Fax: 02 41 68 42 48
----------------------------------------------------------------------------
---------------------
"Raymond" a écrit dans le message de
news:
Le dlookup peut se faire sur n'importe quel champ, mais ne ramène qu'une
seule valeur, alors que les seek ramènent l'enregistrement. findfirst est
plus rapide que seek ( parait-il)

--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"martial" a écrit dans le message de
news:
Oui merci, mais ça je connaissais.
Le problème c'est que sur une très grosse application (pleine de
fonctions)

faite sous access 2.0 et transformée en access2000, j'essaie d'optimiser
un

peu pour gagner en performance.
A l'époque de access2.0, le Dlookup n'existait pas et j'ai un tas de
fonctions qui utilisent les openrecordset et des set
acnbase=currentdb().....

Alors je me suis dis que ce serait rudement bien s'il existait un genre
Dlookup sur index.
Mais bon, si ce n'est pas le cas ce n'est pas grave, j'optimiserais
autre


chose !!!!

Merci tout de même pour ta réponse
Martial







Avatar
Crevecoeur Jérôme
Bon ça me titillait trop.

J'ai donc réalisé un benchmark dont je vous fournis les résultats + le code
(pour vérifier la méthode).
Benchmark réalisé aprés reboot de la machine pour ne pas éviter les erreurs
de cache etc...
Je pense que les résultats seraient encore plus flagrant avec une clé de
type text

--------Recherche sous access------------
---Methode Seek---
Trouveu6
Non TrouveD
186 millisecondes
---fin methode Seek---

---Methode FindFirst---
Trouveu6
Non TrouveD
1565 millisecondes
---fin methode Findfirst---


---Methode Dlookup---
Trouveu6
Non TrouveD
47509 millisecondes
---fin methode Dlookup---



---------Module---------

Option Compare Database
Option Explicit

Declare Function GetTickCount Lib "kernel32" () As Long

Sub BenchmarkSearch()

Dim mabd As Database
Dim rs As Recordset
Dim ret As Long
Dim nbtrouve As Long
Dim nbnontrouve As Long
Dim i As Long

'Ouverture de la base
Set mabd = OpenDatabase("C:EcolesTablesXP.mdb")
Set rs = mabd.OpenRecordset("Eleves", dbOpenTable)
'Parcours des lignes
ret = GetTickCount
rs.Index = "PrimaryKey"
nbtrouve = 0
nbnontrouve = 0
For i = 1 To 800
rs.Seek "=", i
If rs.NoMatch Then
nbnontrouve = nbnontrouve + 1
Else
nbtrouve = nbtrouve + 1
End If
Next i

rs.Close
Set rs = Nothing

mabd.Close
Set mabd = Nothing
Debug.Print "---Methode Seek---"
Debug.Print "Trouve=" & nbtrouve
Debug.Print "Non Trouve=" & nbnontrouve
Debug.Print (GetTickCount - ret) & " millisecondes"
Debug.Print "---fin methode Seek---"


'Ouverture de la base
Set mabd = OpenDatabase("C:EcolesTablesXP.mdb")
Set rs = mabd.OpenRecordset("Eleves", dbOpenSnapshot)
'Parcours des lignes
ret = GetTickCount
nbtrouve = 0
nbnontrouve = 0
For i = 1 To 800
rs.FindFirst "ele_code=" & i
If rs.NoMatch Then
nbnontrouve = nbnontrouve + 1
Else
nbtrouve = nbtrouve + 1
End If
Next i

rs.Close
Set rs = Nothing

mabd.Close
Set mabd = Nothing
Debug.Print
Debug.Print "---Methode FindFirst---"
Debug.Print "Trouve=" & nbtrouve
Debug.Print "Non Trouve=" & nbnontrouve
Debug.Print (GetTickCount - ret) & " millisecondes"
Debug.Print "---fin methode Findfirst---"

Debug.Print
ret = GetTickCount
nbtrouve = 0
nbnontrouve = 0
For i = 1 To 800
If DCount("ele_code", "ELEVES", "ele_code=" & i) = 0 Then
nbnontrouve = nbnontrouve + 1
Else
nbtrouve = nbtrouve + 1
End If
Next i
Debug.Print
Debug.Print "---Methode Dlookup---"
Debug.Print "Trouve=" & nbtrouve
Debug.Print "Non Trouve=" & nbnontrouve
Debug.Print (GetTickCount - ret) & " millisecondes"
Debug.Print "---fin methode Dlookup---"

End Sub



--
----------------------------------------------------------------------------
--------------------
Crévecoeur Jérôme

ACS INFORMATIQUE
122,rue du Château d'orgemont
49000 ANGERS
Tel: 02 41 68 42 36 Fax: 02 41 68 42 48
----------------------------------------------------------------------------
---------------------
"Crevecoeur Jérôme" a écrit dans le message de
news:%
Humm...
Tu es sur raymond?

Pourtant Seek utilise explicitemet l'index alors que findfirst est un peu
plus brouillon, il est possible d'y mettre un peu n'importe quoi.
Faudrait que je fasse un benchmark un de ces 4...

--
--------------------------------------------------------------------------
--

--------------------
Crévecoeur Jérôme

ACS INFORMATIQUE
122,rue du Château d'orgemont
49000 ANGERS
Tel: 02 41 68 42 36 Fax: 02 41 68 42 48
--------------------------------------------------------------------------
--

---------------------
"Raymond" a écrit dans le message de
news:
Le dlookup peut se faire sur n'importe quel champ, mais ne ramène qu'une
seule valeur, alors que les seek ramènent l'enregistrement. findfirst
est


plus rapide que seek ( parait-il)

--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"martial" a écrit dans le message de
news:
Oui merci, mais ça je connaissais.
Le problème c'est que sur une très grosse application (pleine de
fonctions)

faite sous access 2.0 et transformée en access2000, j'essaie
d'optimiser



un
peu pour gagner en performance.
A l'époque de access2.0, le Dlookup n'existait pas et j'ai un tas de
fonctions qui utilisent les openrecordset et des set
acnbase=currentdb().....

Alors je me suis dis que ce serait rudement bien s'il existait un
genre



Dlookup sur index.
Mais bon, si ce n'est pas le cas ce n'est pas grave, j'optimiserais
autre


chose !!!!

Merci tout de même pour ta réponse
Martial











Avatar
Raymond
Sans commentaires.

c'est noté dans ma petite tête.

Ce qui serait interessant c'est de connaitre le temps du premier passage de
chaque mais c'est une autre histoire qui ne mérite sûrement pas notre temps
passé.

le dlookup n'est pas fait pour de la production intensive, mais pour du
ponctuel et il est tellement pratique !

--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"Crevecoeur Jérôme" a écrit dans le message de
news:
Bon ça me titillait trop.

J'ai donc réalisé un benchmark dont je vous fournis les résultats + le
code

(pour vérifier la méthode).
Benchmark réalisé aprés reboot de la machine pour ne pas éviter les
erreurs

de cache etc...
Je pense que les résultats seraient encore plus flagrant avec une clé de
type text

--------Recherche sous access------------
---Methode Seek---
Trouveu6
Non TrouveD
186 millisecondes
---fin methode Seek---

---Methode FindFirst---
Trouveu6
Non TrouveD
1565 millisecondes
---fin methode Findfirst---


---Methode Dlookup---
Trouveu6
Non TrouveD
47509 millisecondes
---fin methode Dlookup---



---------Module---------

Option Compare Database
Option Explicit

Declare Function GetTickCount Lib "kernel32" () As Long

Sub BenchmarkSearch()

Dim mabd As Database
Dim rs As Recordset
Dim ret As Long
Dim nbtrouve As Long
Dim nbnontrouve As Long
Dim i As Long

'Ouverture de la base
Set mabd = OpenDatabase("C:EcolesTablesXP.mdb")
Set rs = mabd.OpenRecordset("Eleves", dbOpenTable)
'Parcours des lignes
ret = GetTickCount
rs.Index = "PrimaryKey"
nbtrouve = 0
nbnontrouve = 0
For i = 1 To 800
rs.Seek "=", i
If rs.NoMatch Then
nbnontrouve = nbnontrouve + 1
Else
nbtrouve = nbtrouve + 1
End If
Next i

rs.Close
Set rs = Nothing

mabd.Close
Set mabd = Nothing
Debug.Print "---Methode Seek---"
Debug.Print "Trouve=" & nbtrouve
Debug.Print "Non Trouve=" & nbnontrouve
Debug.Print (GetTickCount - ret) & " millisecondes"
Debug.Print "---fin methode Seek---"


'Ouverture de la base
Set mabd = OpenDatabase("C:EcolesTablesXP.mdb")
Set rs = mabd.OpenRecordset("Eleves", dbOpenSnapshot)
'Parcours des lignes
ret = GetTickCount
nbtrouve = 0
nbnontrouve = 0
For i = 1 To 800
rs.FindFirst "ele_code=" & i
If rs.NoMatch Then
nbnontrouve = nbnontrouve + 1
Else
nbtrouve = nbtrouve + 1
End If
Next i

rs.Close
Set rs = Nothing

mabd.Close
Set mabd = Nothing
Debug.Print
Debug.Print "---Methode FindFirst---"
Debug.Print "Trouve=" & nbtrouve
Debug.Print "Non Trouve=" & nbnontrouve
Debug.Print (GetTickCount - ret) & " millisecondes"
Debug.Print "---fin methode Findfirst---"

Debug.Print
ret = GetTickCount
nbtrouve = 0
nbnontrouve = 0
For i = 1 To 800
If DCount("ele_code", "ELEVES", "ele_code=" & i) = 0 Then
nbnontrouve = nbnontrouve + 1
Else
nbtrouve = nbtrouve + 1
End If
Next i
Debug.Print
Debug.Print "---Methode Dlookup---"
Debug.Print "Trouve=" & nbtrouve
Debug.Print "Non Trouve=" & nbnontrouve
Debug.Print (GetTickCount - ret) & " millisecondes"
Debug.Print "---fin methode Dlookup---"

End Sub



--
--------------------------------------------------------------------------
--

--------------------
Crévecoeur Jérôme

ACS INFORMATIQUE
122,rue du Château d'orgemont
49000 ANGERS
Tel: 02 41 68 42 36 Fax: 02 41 68 42 48
--------------------------------------------------------------------------
--

---------------------
"Crevecoeur Jérôme" a écrit dans le message
de

news:%
Humm...
Tu es sur raymond?

Pourtant Seek utilise explicitemet l'index alors que findfirst est un
peu


plus brouillon, il est possible d'y mettre un peu n'importe quoi.
Faudrait que je fasse un benchmark un de ces 4...

--


--------------------------------------------------------------------------
--
--------------------
Crévecoeur Jérôme

ACS INFORMATIQUE
122,rue du Château d'orgemont
49000 ANGERS
Tel: 02 41 68 42 36 Fax: 02 41 68 42 48


--------------------------------------------------------------------------
--
---------------------
"Raymond" a écrit dans le message de
news:
Le dlookup peut se faire sur n'importe quel champ, mais ne ramène
qu'une



seule valeur, alors que les seek ramènent l'enregistrement. findfirst
est


plus rapide que seek ( parait-il)

--
@+
Raymond Access MVP.
http://access.seneque.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/charte.htm pour une meilleure
efficacité de tes interventions sur MPFA.


"martial" a écrit dans le message de
news:
Oui merci, mais ça je connaissais.
Le problème c'est que sur une très grosse application (pleine de
fonctions)

faite sous access 2.0 et transformée en access2000, j'essaie
d'optimiser



un
peu pour gagner en performance.
A l'époque de access2.0, le Dlookup n'existait pas et j'ai un tas de
fonctions qui utilisent les openrecordset et des set
acnbase=currentdb().....

Alors je me suis dis que ce serait rudement bien s'il existait un
genre



Dlookup sur index.
Mais bon, si ce n'est pas le cas ce n'est pas grave, j'optimiserais
autre


chose !!!!

Merci tout de même pour ta réponse
Martial