Simplification de code pour effectuer une recherche dans une table

Résolu
quantum59 Messages postés 7 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 11 décembre 2008 - 7 déc. 2008 à 19:07
quantum59 Messages postés 7 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 11 décembre 2008 - 8 déc. 2008 à 19:14
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

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
7 déc. 2008 à 22:16
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.
3
quantum59 Messages postés 7 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 11 décembre 2008
7 déc. 2008 à 22:26
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?
0
quantum59 Messages postés 7 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 11 décembre 2008
7 déc. 2008 à 22:38
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?
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
7 déc. 2008 à 22:52
Voila normalement tu auras une bonne parti de tes reponses.

http://access.developpez.com/faq/?page=SQL
0

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

Posez votre question
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 déc. 2008 à 01:27
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)
0
quantum59 Messages postés 7 Date d'inscription mercredi 26 novembre 2008 Statut Membre Dernière intervention 11 décembre 2008
8 déc. 2008 à 19:14
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
0
Rejoignez-nous