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 :

Optimiser les performances en remplaçant la fonction Dlookup


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 38
    Points : 31
    Points
    31
    Par défaut Optimiser les performances en remplaçant la fonction Dlookup
    Bonjour,

    Je viens de développer une base destinée à tourner en réseau. Tout fonctionnait bien en version 1 fichier, depuis mon poste ou depuis d'autres postes réseau, mais de façon un tout petit peu plus lente depuis le réseau.

    J'ai éclaté la base en deux fichiers (données et programme). Les performances se sont ecroulées depuis un poste réseau.

    A l'analyse du problème, il s'agit de recours très fréquents à la fonction Dlookup, que je ne savais pas aussi gourmande en temps de traitement (accès disque ?)

    J'ai revu mon code et j'ai supprimé la totalité des Dlookup dans les traitements internes aux formulaires en utilisant des recordset. Le résultat est excellent.

    Il me reste à améliorer le temps de chargement des formulaires.

    Au chargement, le formulaire va lire de nombreuses valeurs dans différentes tables pour se configurer en fonction de l'utilisateur et de l'environnement.
    J'aurais surement du programmer différement (ce que j'aurais fait si j'avais été un pro).

    J'en arrive à ma question :

    j'ai mis le code suivant dans un module

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Function LireTable(nomtable, ValeurClé, NomChamp)
        Quoi = "[" & NomChamp & "]"
        où = nomtable & "s"
        quand = "[" & nomtable & "]='" & ValeurClé & "'"
        LireTable = DLookup(Quoi, où, quand)
    End Function
    Les tables que j'interroge de cette façon ne sont pas nombreuses et pas très grosses.

    Je pense qu'il doit être possible de remplacer mon code par:
    - l'ouverture d'un recordset par table importante dès l'ouverture de l'application, ces recordset resteraient actifs pendant toute la cession
    - une fonction par recordset faisant la même chose que le code précédent.

    Mais je tourne en rond dans toutes les erreurs possibles depuis plusieurs heures.

    Merci de vos lumières

    Jean

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Tu dis pourtant que tu as déjà remplacé tes appel à DLookup par des recordset donc où est le problème ?

    Il te suffit de faire
    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
     
    Function LireTable(nomtable, ValeurClé, NomChamp)
        Dim rs as dao.recordset
     
        'ouverture du recordset
        set rs = currentdb.openrecordset ("SELECT [" &NomChamp &"] FROM " &nomtable &"s WHERE [" & nomtable & "]='" & ValeurClé & "'")
     
        'vérifier qu'il y a bien une valeur correspondante
        if not rs.Eof then
            LireTable = rs.fields(0)
        else
            LireTable = ""
        end if
        'fermeture propre du recordset
        rs.close
        set rs = nothing
    End Function

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 38
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    Ta réponse convient mais à chaque appel elle lance une requete sur un fichier qui est sur le serveur, avec des temps de traitement bien plus long que si elle cherchait une valeur chargée préalablement en mémoire.

    J'ai trouvé une solution qui semble fonctionner, mais j'ai encore un petit bug.

    Dès que je l'aurai trouvé, je la mettrai en réponse.

    Merci

  4. #4
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Bonjour

    Au chargement de l'appli, rappatrie les informations utilisateurs en locale dans une table de paramètre

    Base ensuite tes accès "personnalisés" sur cette table

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 38
    Points : 31
    Points
    31
    Par défaut
    J'ai résolu mon pb en créant une fonction

    dans la partie déclaration d'un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ' variables de recordset
    Public Db As DAO.Database
    Public rstParams As DAO.Recordset
    Public rstCommunes As DAO.Recordset
    ..... autant que j'ai de tables
    une procédure que je lance au départ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ChargeRecordset()
    ' ouvre les recordset contenant les fichiers Tables
     
        Req = "select [T-Params].* from [T-Params];"
        Set rstParams = CurrentDb.OpenRecordset(Req, dbOpenSnapshot)
     
        Req = "select [T-Communes].* from [T-Communes];"
        Set rstCommunes = CurrentDb.OpenRecordset(Req, dbOpenSnapshot)
    ..... autant que j'ai de tables
    END SUB
    une fonction rLookup qui remplace la fonction dlookup que j'utilisais trop

    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
     
    Function rLookup(NomChamp, NomTable, Quand)
    Select Case NomTable
     
        Case "T-Utilisateur"
            rstUtilisateurs.MoveFirst
            rstUtilisateurs.FindFirst Quand
            rLookup = rstUtilisateurs.Fields(NomChamp)
     
         Case "T-Commune"
            rstCommunes.MoveFirst
            rstCommunes.FindFirst Quand
            rLookup = rstCommunes.Fields(NomChamp)
     
       ....... 
     
     
        Case Else
        rLookup = DLookup(NomChamp, NomTable, Quand)
    End Select
     
    End Function
    Les temps de chargement et de traitement ont été divisés par huit !

    Quels avantages m'apporterait la solution consistant à rapatrier les données dans des tables locales ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimiser les performances try/catch ?
    Par KiLVaiDeN dans le forum Langage
    Réponses: 4
    Dernier message: 14/01/2014, 14h47
  2. Optimiser les performances sur un Update.
    Par Delphi-ne dans le forum DB2
    Réponses: 3
    Dernier message: 10/01/2011, 12h22
  3. Réponses: 0
    Dernier message: 02/04/2010, 10h09
  4. Comment optimiser les performances de mon PC ?
    Par Celebrate dans le forum Windows XP
    Réponses: 6
    Dernier message: 16/07/2008, 23h08
  5. Réponses: 16
    Dernier message: 04/07/2008, 09h54

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