IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Validité d'un code VBA+SQL pour gestion de mémoire


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 43
    Points : 29
    Points
    29
    Par défaut Validité d'un code VBA+SQL pour gestion de mémoire
    Salut à tous,

    j'ai 3 tables :
    - La première (INSEE_Cities) contient un certain nombre de code insee des communes françaises (contenu variable)
    - la seconde (_Navstreets) contient aussi les codes insee (toute la france), les noms des rues et provient d'une source
    - la troisième (Table_Comparative) est identique à la seconde en structure, provient d'une autre source et contient toutes les rues pour tous les codes Insee de la première table

    Je fais des requetes de comparaison de champ entre les noms de rue des 2° et troisième table. La fonction Phono() est une adaptation du Soundex() trouvé dans les codes sources locaux.
    J'ai plusieurs requêtes en séquences :

    1 - Update avec un "Score=1" si Nom1=Nom2 + mise à jour d'un champ Flag(1) pour ne pas réutiliser les enregistrements qui ont déjà servi
    2 - Update avec un "Score=2" si Left(Phono(Nom1);n)=Left(Phono(Nom2);n) ET Right(Phono(Nom1);n')=Right(Phono(Nom2);n') + mise à jour du champ Flag(1)
    3 - idem que 2 avec des valeurs variable pour n et n'
    4 - idem... etc...

    J'ai donc mis en place le bout de code ci-dessous qui fonctionne très bien sauf à certains moment où ça bloque (notamment sur les très grosses communes où il y a beaucoup de sorties dans chacune des 2 tables à comparer). C'est à dire que Access plante : pas de messages d'erreurs, mais juste le process n'avance plus.
    Pour exemple, j'ai fait un test sur la région Aquitaine entière (5 départements : 24, 33, 40, 47, 64). Il y a donc près de 2000 codes insee à traiter dans la première table. Je lance, vais boire un café, 1h après les 557 communes du département 24 étaient traités et le 33 avait commencé à tourner. La routine arrive sur la commune de Bordeaux(2000 lignes d'un côté, 8000 de l'autre). Et là.... : 1° requête ok, 2° requête...1h après, 2h,3h,4h après... plus rien. J'ai stoppé Access en plein vol

    Est-ce que ce code vous paraît valable (je l'ai monté en piochant tutoriaux, réponses à des forums...etc...) ? Y a-t-il un moyen de l'améliorer ?
    (j'ai mis des debug.print pour essayer de savoir où et quand ça plante)

    Merci de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    Function Matching()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim SQL01 As String, SQL02 As String, SQL03 As String
    Dim Compteur As Field
    Dim KelHeur
     
    DoCmd.SetWarnings False
     
    Set rst = CurrentDb.OpenRecordset("SELECT INSEE FROM INSEE_Cities", dbOpenDynaset, dbDenyRead + dbDenyWrite)
    DBEngine.SetOption dbMaxLocksPerFile, 200000
     
    Do While Not rst.EOF
            For Each Compteur In rst.Fields
                KelHeur = Format(Now, "hh:mm:ss / d mmm.")
     
                SQL01 = "UPDATE Table_Comparative (...) WHERE _Navstreets.INSEE_CODE='" & Compteur & "';"
                SQL02 = "UPDATE Table_Comparative (...) WHERE _Navstreets.INSEE_CODE='" & Compteur & "';"
                SQL03 = "UPDATE Table_Comparative (...) WHERE _Navstreets.INSEE_CODE='" & Compteur & "';"
     
                Debug.Print "Insee = " & Compteur & " (" & KelHeur & ")"
                CurrentDb.Execute SQL01, dbDenyWrite
                CurrentDb.Close
                Debug.Print "étape 1 : ok"
                CurrentDb.Execute SQL02, dbDenyWrite
                CurrentDb.Close
                Debug.Print "étape 2 : ok"
                CurrentDb.Execute SQL03, dbDenyWrite
                CurrentDb.Close
                Debug.Print "étape 3 : ok"
            Next
        rst.MoveNext
    Loop
     
    rst.Close
    CurrentDb.Close
    MsgBox ("Terminé")
    DoCmd.SetWarnings True
    End Function

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    retire le debug.print pour commencer

    dans options

    mode exclusif

    decocher ouvrir avec enregistrements verrouilles

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 43
    Points : 29
    Points
    29
    Par défaut
    Salut,

    dans les options j'ai déjà décoché le mode exclusif.
    Ensuite je veux bien retirer les debug.print, mais :

    1 - comment je peux savoir où en est mon processus sans passer par ça ? (je début vraiment en VBA)
    2 - Si je laisse le debug.print mais que je ne fais tourner mon process que sur un seul Code Insee (donc ça génère genre 3 lignes dans la fenêtre exécution) comment expliques-tu que ça coince quand même toujours sur les communes où j'ai beaucoup de lignes à comparer et par sur les autres ?

Discussions similaires

  1. [AC-2010] Help : dde correction formulaire avec code Vba/Sql
    Par anopaname dans le forum Access
    Réponses: 0
    Dernier message: 24/03/2014, 14h14
  2. [AC-2003] supprimer enregistrements avec code vba sql
    Par maclolo2 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/07/2012, 09h05
  3. Code VBA Excel pour un bouton
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/10/2008, 08h47
  4. Contribution codes VBA Excel : Pour vos UserForm
    Par Zandar dans le forum Contribuez
    Réponses: 0
    Dernier message: 01/03/2008, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo