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 :

[A-03] optimisation de requête par une bonne pratique du code ACCESS 2003


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Par défaut [A-03] optimisation de requête par une bonne pratique du code ACCESS 2003
    Bonjour,

    j'édite des états en vérifiant d'abord si leur requete liée contient des données. Apres l"édition je fais un update sur les enregistrements concernés.

    Pour faire ca dans mon code, j'appelle la requete , je vérifies la présence d'enregistrement, j'édite l'état et je passe la requete update comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Set rec = db.OpenRecordset("SELECT contrat.cdcontrat " & _
             " FROM contrat INNER JOIN annexe ON contrat.cdcontrat = annexe.cdcontrat " & _
             " WHERE (((contrat.dateenvoicontrat) Is Null) AND ((annexe.dateenvoiannexe) Is Null) " & _
             " AND ((contrat.typecontrat)='C-OP') AND ((annexe.versionannexe)=6)) " & _
             " GROUP BY contrat.cdcontrat;", dbOpenSnapshot)
        If Not rec.EOF And Not rec.BOF Then
            DoCmd.OpenReport "contrat+annexe OP v6", , , "dateenvoicontrat is null and dateenvoiannexe is null"
            DoCmd.RunSQL ("UPDATE contrat INNER JOIN annexe ON contrat.cdcontrat = annexe.cdcontrat " & _
                " SET dateenvoicontrat = date() , dateenvoiannexe = date()" & _
                " WHERE (((contrat.dateenvoicontrat) Is Null) AND ((annexe.dateenvoiannexe) Is Null) " & _
                " AND ((contrat.typecontrat)='C-OP') AND ((annexe.versionannexe)=6));")
        End If
        Set rec = Nothing
    Ce que je me dis, c'est que cette solution n'est pas optimale puisque je crée une sorte de vue sur des enregistrements (1requete) puis j'appelle un état (1 requete) puis je fais un update (1 requete) et a chaque fois en passant dans les requetes tous les parametres.

    N'y aurait il pas une meilleure solution en détachant l'update dans une fonction qui mettrait a jour les champs des enregistrements déja dans le recorset ? comme j'appelle une vingtaine d'états, ca fait 20 requetes update en moins a écrire en entier. Qu'en pensez vous ?

    nb : mon code marche mais je suis dans un souci d'optimisation...

    guillaume

  2. #2
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Bonjour,

    As-tu repéré l'évènement "Sur Aucune Donnée" qui te permettra d'éliminer ton recordset initial.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Par défaut
    oui effectivement je l'ai fait, mais en fait ce recordset permet de fluidifier le code car l'évenement no data sur l'état fonctionne moins rapidement je trouve.

    Citation Envoyé par mout1234 Voir le message
    Bonjour,

    As-tu repéré l'évènement "Sur Aucune Donnée" qui te permettra d'éliminer ton recordset initial.

  4. #4
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Citation Envoyé par gui-llaume Voir le message
    oui effectivement je l'ai fait, mais en fait ce recordset permet de fluidifier le code car l'évenement no data sur l'état fonctionne moins rapidement je trouve.


    Ok, tu as peut-être raison... jamais testé

    Dans ce cas, il serait peut être bon de fermer ton recordset avant l'ouverture de l'état..., voire de le remplacer par un DCount.

    L'update, dans la grande majorité des cas, restera plus efficace qu'un mise à jour ligne par ligne dans un recordset. Donc je ne pense pas que tu puisses améliorer les perfs en t'appuyant sur le recordset initial.


    EN passant, il me semble préférable d'utiliser la méthode .execute des objets database (par currentdb.Execute par exemple) plutôt que le RunSQL.


    Enfin, tu devrais gagner légèrement en perfs en enregistrant tes requêtes.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Par défaut
    thanks.
    je crois que je vais enregistrer des requetes paramétrées et les rappeler dans le code.

    merci pour la piste.
    j'y travaille maintenant ...

Discussions similaires

  1. [AC-2007] Filtrer une requête par une autre
    Par wushu29 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 21/06/2010, 16h07
  2. Optimisation de requête pour une messagerie
    Par okin66 dans le forum Requêtes
    Réponses: 0
    Dernier message: 31/05/2009, 15h39
  3. taille d'une requête par une autre requête
    Par tachaout dans le forum Développement
    Réponses: 4
    Dernier message: 17/03/2009, 14h37
  4. [MySQL] Gestion de requête par une fonction php
    Par nicerico dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 17/03/2008, 11h29
  5. Remplacer une sous-requête par une jointure
    Par MPQuatre dans le forum Requêtes
    Réponses: 6
    Dernier message: 05/12/2007, 17h28

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