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

Access Discussion :

VBA Access - Temps d'exécution


Sujet :

Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut VBA Access - Temps d'exécution
    Bonjour à tous,

    J'ai créé une procédure qui transfert un fichier texte .dat dans la base de donnée Access. Mais le TEMPS d'exécution est ECCESSIVEMENT LONG!!

    Voici la partie de code qui cause le problème de longueur

    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
    41
    42
    43
    44
    45
    46
    47
    Function insererStatistique(ByVal typeDonnee As String, _
                                ByVal province As String, ByVal pays As String, _
                                ByVal SH As String, ByVal uniteMesure As String, ByVal etat As String) As String
    Dim insertion As String
    Dim numeroTypeDonnee As String
    Dim selection As String
    Dim statistique As DAO.Recordset
    Dim numeroSeqSH As String
     
    insererSH SH, ""
    If (etat <> "") Then
        insererEtat etat
    End If
     
    numeroSeqSH = getNumeroSH(SH) 'Méthode fait un select, et renvoi la cré primaire
    numeroTypeDonnee = getNumeroTypeDonnee(typeDonnee) 'meme chose
     
    selection = "SELECT * FROM STATISTIQUE WHERE numeroTYPEDONNEE    = " & numeroTypeDonnee & " AND " & _
                    "numeroPROVINCE = '" & province & "' AND numeroPAYS = '"          & pays & "' AND " & _
                    " numeroSH = " & numeroSeqSH & " AND uniteDeMesureSTATISTIQUE = '" & uniteMesure & "'"
     
    If (etat <> "") Then
        selection = selection & " AND diminutifETAT = '" & validerChaine(etat) & "';"
    Else
        selection = selection & ";"
    End If
     
    Set statistique = CurrentDb.OpenRecordset(selection, dbOpenForwardOnly, dbReadOnly)
     
    If (statistique.EOF) Then
        If (etat <> "") Then
            insertion = "INSERT INTO STATISTIQUE (numeroTYPEDONNEE, numeroPROVINCE, numeroPAYS " & _
                            ",numeroSH,uniteDeMesureSTATISTIQUE, diminutifETAT) VALUES (" & _
                        numeroTypeDonnee & ",'" & province & "','" & pays & "'," & numeroSeqSH & _
                        ",'" & uniteMesure & "','" & etat & "');"
        Else
            insertion = "INSERT INTO STATISTIQUE (numeroTYPEDONNEE, numeroPROVINCE, numeroPAYS " & _
                            ",numeroSH,uniteDeMesureSTATISTIQUE) VALUES (" & _
                        numeroTypeDonnee & ",'" & province & "','" & pays & "'," & numeroSeqSH & _
                        ",'" & uniteMesure & "');"
        End If
        CurrentDb.Execute insertion
        Set statistique = CurrentDb.OpenRecordset(selection, dbOpenForwardOnly, dbReadOnly)
    End If
    insererStatistique = statistique("numeroSTATISTIQUE")
     
    End Function
    Désolé, le code s'est copié un peu croche.

    Merci
    Maryse

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 180
    Par défaut
    Et si tu exécute juste ton select dircetment dans une query c'est long ou pas?

  3. #3
    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
    Par défaut
    si j'ai bien compris tu traites tes données une par une
    en recherchant l'ident et en renvoyant les autres infos

    si tu déversais ton fichier texte dans une table temporaire avec un flag
    état complet et numéro d'identifant vide tu pourrais ensuite procéder par lot ce serait peut être plus rapide
    surtout si tu indexais avec ruse ta table temporaire

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 186
    Par défaut
    Est-ce que c'est le "select" ou les "insert" qui sont longs ?
    Si c'est le "select", il faut peut-être mettre un index où ça va bien.
    [Access] Les bases du débogage => ici

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Je crois que mes index sont placés là où il le faut.

    Je vais essayer de faire des QueryDef au lieu d'écrire la requete directement dans VBA.

    Je vais voir si c'est moins long, j'ai pas pu encore tester puisque c'est long changer toutes mes requetes

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Le fait de changer toutes mes requetes en queryDef (Lien vers ma base Access) a un peu empiré les choses.

    C'est maintenant un peu plus lent qu'avant, quand le but était de diminuer le temps de transfert.

    7 minutes en tout pour transferrer un fichier, qui oui contient beaucoup de ligne mais quand même.


  7. #7
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 186
    Par défaut
    Il y a combien de lignes dans le fichier ? 100 000 ? 200 000 ? Plus ?
    Si j'ai bien compris, tu appelles cette fonction avec les données d'une ligne du fichier, tu testes l'existence et si ça n'existe pas, tu insères ?

    Pourquoi ne pas faire une jointure externe entre ton fichier (lié) et ta table. Et ne traiter que les lignes qui ne se retrouvent pas dans la table pour les insérer ?
    [Access] Les bases du débogage => ici

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Il y a 21154 lignes.
    Le problèmes est que je reconstruie une base de donnée qui était deja fait mais tout croche.

    Il y a au moins une 100 aine de table dans la base de donnée, quand on en a besoin que de 8.

    Genre : Table Exportation91, Exportations92, Exportations93...

    Aucun liens dans les relations... etc..

    Mais la fichier se transfert en un clin d'oeil .... Transfert de 21154 lignes en le temps de la dire. Mais le transfert s'effectue surement que dans une seule table... Je ne peux pas me fier au code de la base actuel parce que c'est tellement mal fait que je ne m'y retourne pas

    Genre : For i = i_ana to i_ina ??????????????????
    Au tas de variables avec des nom non significatifs c'est du bourrage de crane exessif!!!

    Enfin, j'essais bien de comprendre ce que vous me dite..

    Créer une table temporaire mais pourquoi????
    Une jointure externe?? c'est du sql ca je comprend pas ce que tu veux dire par faire une jointure externe.

    Je fais une requete pour savoir si la donnée est déjà existante dans la base de donnée, sinon je l'insère, parce que a vrai dire j,ai besoin de toutes les lignes du fichier texte, et ouI! les 21154.


    Maryse

  9. #9
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 186
    Par défaut
    21000 lignes, c'est peanuts, ça devrait dépoter un max.

    Donc, la fichier est importé dans une table temporaire (très rapide).
    Ensuite, les lignes de ce fichier sont traitées une par une ? C'est ça?

    Si entre ta table temp et ta table cible, tu fais une jointure externe (crée une requête, ajoute les 2 tables, fait les jointures qui vont bien et clic droit sur les jointures, choisis de prendre toutes les lignes de ta table temp et uniquement ... de la table cible).
    Ajoute un WHERE isnull(TableCible.ChampX ) et tu auras alors tous les champs à insérer.
    1/ ça réduit le volume de lignes à traiter
    2/ tu peux sucrer ton test d'existence de ta fonction.
    [Access] Les bases du débogage => ici

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Comment je crée ma table temporaire?

  11. #11
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 186
    Par défaut
    J'ai un peu de mal à comprendre ...

    Tu as un fichier. (jusqu'à là, je dois avoir bon)
    Tu lis les lignes une à une dans le fichier et insères les lignes dans une table si elle n'existent pas déjà ?
    [Access] Les bases du débogage => ici

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Je lis les lignes de mon fichier une par une.

    J'insère les données dans plusieurs table, à leur endroit respectif.

    Je ne crée aucune table. Mon modèle relationnel de donnée MCD, ma base de donnée finalement ne bouge pas.

    Toutes mes tables sont créé d'avance et j'insère les données au bon endriot.

  13. #13
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 186
    Par défaut
    Ok. Nul part dans le code affiché n'apparaît le fait que tu inséres dans différentes tables.

    Tu inséres les données de chaque ligne dans plusieurs tables ou bien, selon le cas, tu inséres la ligne dans une table ou une autre ?
    [Access] Les bases du débogage => ici

  14. #14
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    insertion = "INSERT INTO STATISTIQUE (numeroTYPEDONNEE, numeroPROVINCE, numeroPAYS " & _ 
                            ",numeroSH,uniteDeMesureSTATISTIQUE, diminutifETAT) VALUES (" & _ 
                        numeroTypeDonnee & ",'" & province & "','" & pays & "'," & numeroSeqSH & _ 
                        ",'" & uniteMesure & "','" & etat & "');" 
        Else 
            insertion = "INSERT INTO STATISTIQUE (numeroTYPEDONNEE, numeroPROVINCE, numeroPAYS " & _ 
                            ",numeroSH,uniteDeMesureSTATISTIQUE) VALUES (" & _ 
                        numeroTypeDonnee & ",'" & province & "','" & pays & "'," & numeroSeqSH & _ 
                        ",'" & uniteMesure & "');" 
        End If 
        CurrentDb.Execute insertion
    Ici, j'insère dans la table statistique

    J'ai pas afficher tout mon code. j'ai aussi une autre fonction appellé insererAnneeStatistique qui insere dans la table annee_statistique bien entendu

    insererSH SH, "" <--- ici cela fait appel a la méthode qui insere le code SH dans la table SH.

    ...

    Effectivement j'insère dans plusieurs tables.

    Table Statistique
    Table annee_statistique
    Table typeDonnee
    Table SH2...Sh4...Sh6 et Sh
    ...

  15. #15
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    Finalement, ce que je m'ai suis rendu compte, c'est que j'insère dans toutes les tables, ayant un lien avec la table principale.

    Table région par exempl
    Table état
    Table SH

    Ces données sont sûrement toujours présente, mais je fais cela pour éviter les erreurs.

    J'aimerais pouvoir faire un insert dans la bd. Et savoir quand il y a une erreur et pouvoir la géré.

    Par exemple le code SH est inexistant dans la table SH.
    J'essai d'insérer dans table Statistique qui possède un lien vers la table SH.

    Et puisque le code SH n'existe pas dans la table SH, la statistique ne s'insèrera pas.

    Alors j'aimerais pouvoir gérer cette erreur et pouvoir afficher "Le code sh : 02 n'est pas présent dans la base de donnée, veuillez insérer le fichier SH comprenant ce code avant de faire la mise à jour des données" ou quelque chose du genre...

  16. #16
    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
    Par défaut
    ca c'est l'ennui du modèle relationnel avec intégrité référentielle

    pour eviter cela on peut "squeezer" l'intégrité référentielle et entrer les données par lot
    à la fin de l'entrée on vérifie les entrés manquantes (que l'on peut marquer)

  17. #17
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Par défaut
    On peut faire quoi????

  18. #18
    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
    Par défaut
    ben on scinde le problème

    on part d'une masse de données dans une table temporaire que l'on se garde de soumettre à l'intégrité référentielle

    on a des données qui satisfont à l'intégrité référentielle on les aiguille vers leurs destinations et on les supprime de la table temporaire

    restent les données qui nécessitent une approche particulière (complément de codification, recherche d'informations) pour lesquelles il faut prévoir un compte rendu et des traitements spécifiques

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2008, 18h42
  2. [VBA - ACCESS] Temps exécution exportation
    Par binouzzz19 dans le forum VBA Access
    Réponses: 4
    Dernier message: 16/10/2007, 11h11
  3. Réponses: 1
    Dernier message: 30/05/2007, 10h41
  4. [VBA-E] Tracer le temps d'exécution d'une fonction
    Par Currahee dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/04/2007, 14h06
  5. Réponses: 7
    Dernier message: 11/03/2007, 09h35

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