Simplification de code pour effectuer une recherche dans une table [Résolu]

Signaler
Messages postés
7
Date d'inscription
mercredi 26 novembre 2008
Statut
Membre
Dernière intervention
11 décembre 2008
-
Messages postés
7
Date d'inscription
mercredi 26 novembre 2008
Statut
Membre
Dernière intervention
11 décembre 2008
-
Bonjour,

Débutant en VB et en access, j'ai créé une table et un code VBA.
Dans mon code je fais une recherche dans une table qui contient pas moins de 46000 enregistrements.
Actuellement, j'ai le code suivant qui tourne:

                ISIN_in_base = False
                Entreprises.MoveFirst
                While Not Entreprises.EOF
                    With Entreprises
                        EntreprisesISIN = !ISIN
                        EntreprisesNum = !numero_euronext
                        tmp_ISIN = aRes(i, 1) 'valeur1 que je recherche dans la base
                        'controle tout les enregistrements si le code ISIN associé Euronext_Numero est deja present                        If ((EntreprisesNum Euronext_Numero) And (EntreprisesISIN tmp_ISIN)) Then
                            ISIN_in_base = True
                            'Debug.Print "le code ISIN " & tmp_ISIN & " avec le numero " & Euronext_Numero; " est deja present dans la base"
                            Entreprises.MoveLast
                        End If
                    End With
                    Entreprises.MoveNext
                Wend

Ce code marche très bien et me dit bien si le code ISIN associé à Euronext_Numero est pésent dans ma base, seulement il contrôle les 46000 Enregistrements, afin de comparer avec les valeurs que je veux inséré dans la base.

Vous imaginez donc bien que ca prend énormément de temp a rechercher dans ma base....

Je cherche donc à optimiser mon code... qq'un peut m'aider?

merci beaucoup

6 réponses

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
25
Salut

Il faut que tu passes par une requete SQL

avec le where basé sur la condition de ton if

apres tu lis seulement
le premier enregistrement et le tour est joué.

Pas besoin de lire toute la table access c'est le faire
et pour aller plus loin place des index sur les bons champs et tu auras
des performances encore meilleures;

access est fait pour faire du SQL alors pourquoi ne pas utiliser ce langage ???

Bon dev.
Messages postés
7
Date d'inscription
mercredi 26 novembre 2008
Statut
Membre
Dernière intervention
11 décembre 2008

Merci pour ta réponse

euh....parce que je connais pas du tout SQL..... j'ai déjà du mal avec VBA.....

Saurais-tu m'aider pour coder ce morceau? j'ai besoin de faire une recherche en fonction de 2 champ d'une table et de comparer en fonction de 2 variables....

comment implémenter une requete SQL dans mon code VBA?
Messages postés
7
Date d'inscription
mercredi 26 novembre 2008
Statut
Membre
Dernière intervention
11 décembre 2008

j'ai creer une requete qui me permet de faire une recherche en fonction de mes critères,  seulement je ne sais pas l'implémenter en VBA

la requete est :

SELECT Entreprises.Numero_Euronext, Entreprises.ISIN
FROM Entreprises
WHERE (((Entreprises.Numero_Euronext)=14) AND ((Entreprises.ISIN)="FR0010377127"));

ou 14 devrait être une variable1
et "FR0010377127" une variable2

j'aurais besoin que si la requete trouve un résultat, elle me mette une variable3 a true, sinon false....

vous pouvez m'aider?
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
25
Voila normalement tu auras une bonne parti de tes reponses.

http://access.developpez.com/faq/?page=SQL
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
65
Salut
Quantum59 a raison, il ne faut charger dans le RecordSet que les enregistrements qu'il te faut, sinon la mémoire et le temps de traitement vont être énormes.
Pour ce qui est de l'insertion de variable dans une chaine :
  SQL = "SELECT Numero_Euronext, ISIN " & _
        "  FROM Entreprises " & _
        " WHERE Numero_Euronext = " & Variable1 & _
        "   AND ISIN = '" & Variable2 & "'"
Ici, Variable1 est une variable dimensionnée comme chiffre (Integer, Long, ...)
Si, dans ta DB , le champ Numero_Euronext est déclaré comme un texte, il faudra mettre des ' devant et derrière la variable, comme pour Variable2.
Variable2 est une variable chaine (String)

Rappel en SQL :
- Les textes doivent être encadrés par des apostrophes '
- Les dates, encadrées par des #
- Les chiffres n'ont pas besoin d'encadrement
Il n'est pas nécessaire de rappeler le nom de la table devant tous les champs s'il s'agit d'une requète sur une seule table (mais ce n'est pas gènant de les mettre)
Eviter de surcharger avec les parenthèses inutiles.

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
7
Date d'inscription
mercredi 26 novembre 2008
Statut
Membre
Dernière intervention
11 décembre 2008

Merci à Tous pour vos réponse, ma fonction fonctionne comme je l'entend.
Si ça peux aider qq'un, je laisse mon code ci dessous:

Function Recherche_Entreprise(NomdelaTable As String, Enext_Num As Long, IsiniCSV As String) As Boolean ' fonction qui teste si l'entreprise existe deja pour le meme code euronext
    On Error GoTo Proc_Exit
    Recherche_Entreprise = False
    Dim db As DAO.Recordset
    Dim SQL As String
    'Mise en forme de la requete SQL
    SQL = "SELECT Numero_Euronext, ISIN " & _
          "FROM " & NomdelaTable & _
          " WHERE Numero_Euronext = " & Enext_Num & _
          " AND ISIN = '" & IsiniCSV & "'"
    ' Ouverture du recordset
    Set db = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly, dbReadOnly)    If db.RecordCount >1 Then Recherche_Entreprise True
    ' Fermeture du Recordset
    db.Close
Proc_Exit:
    On Error Resume Next
    Set db = Nothing
End Function