Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > VBA Access

VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.

Réponse
 
Outils de la discussion
Vieux 07/10/2008, 12h44   #1 (permalink)
Membre Confirmé
 
Date d'inscription: octobre 2007
Localisation: paris
Âge: 29
Messages: 204
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 :
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
gui-llaume est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 13h34   #2 (permalink)
Modérateur
 
Avatar de mout1234
 
Date d'inscription: novembre 2006
Localisation: Paris
Âge: 39
Messages: 1 705
Par défaut

Bonjour,

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

Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.


Les FAQs les tutos Les Sources Access Profitez de ces mines d'or...

Postez dans le bon sous forum et mentionnez la version
mout1234 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 13h59   #3 (permalink)
Membre Confirmé
 
Date d'inscription: octobre 2007
Localisation: paris
Âge: 29
Messages: 204
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.
gui-llaume est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 14h14   #4 (permalink)
Modérateur
 
Avatar de mout1234
 
Date d'inscription: novembre 2006
Localisation: Paris
Âge: 39
Messages: 1 705
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.
__________________
............................................................................................

Dans l'intérêt de tous, ne posez pas de questions techniques par messages privés.


Les FAQs les tutos Les Sources Access Profitez de ces mines d'or...

Postez dans le bon sous forum et mentionnez la version
mout1234 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 14h16   #5 (permalink)
Membre Confirmé
 
Date d'inscription: octobre 2007
Localisation: paris
Âge: 29
Messages: 204
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 ...
gui-llaume est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > VBA Access

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide