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 :

Temps d'execution d'une requete sous VBA 4 minutes


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Points : 30
    Points
    30
    Par défaut Temps d'execution d'une requete sous VBA 4 minutes
    Bonsoir à tous,
    Je travaille sur un projet de tresorerie j'ai presque terminé mon problème n'est pas une erreur ( ça peut etre oui une fausse manipulation du code) mais c'est embetant d'attendre plus que 4 minute pour qu'un foumulaire s'ouvre
    En effet j'ai un formulaire ou je saisie l'année et le mois sur clic un code s'execute pour :
    1- calculer les montant pour plusieurs catégories et pour chaque jours du moois (fais par une requete)
    2- calculer le solde initial et final à partir des resultats de la requete
    3- ouvrir et affecté le resultat au formulaire
    Or quand j'ai mis les bouttons stop dans le code c'est la requete qui prends vachement de temps
    Avez-vous une solution qui me permettra de réduire le temps? peut etre une solution pour ne pas avoir a utiliser la requete... meme l'ouverture de la requete en mode creation prend du temps!!

    Voici le code suivi par la requete :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    Set db = CurrentDb
     
    DoCmd.Close acReport, "CA"
    db.Execute "Delete * from [SOLDE]"
     
     
     
    Set Qdf = db.QueryDefs("RCA2")
      ' Code qui utilise qdf
      ' Par exemple
    Qdf.Parameters("année") = Forms!Welcome.Form!cboannee   '<== si requête paramétrée
    Qdf.Parameters("mois") = Forms!Welcome.Form![mois]
    mydeb = Qdf.SQL                                 '<== si requête action
    mydeb = Replace(Replace(mydeb, "Année", Qdf.Parameters("[Année]")), "Mois", Qdf.Parameters("[Mois]"))
    mydeb = Replace(mydeb, ";", "")
    Set myrst = CurrentDb.OpenRecordset(mydeb, dbOpenDynaset)
     
    Set mytst = CurrentDb.OpenRecordset("SOLDE", dbOpenDynaset)
     
    soldeinit = DLookup("initial", "Solde_initial", "Month(DateCA)=" & Forms!Welcome.Form![mois] & " And Year(DateCA)=" & Forms!Welcome.Form!cboannee)
     
     
         ' tant qu'il n'est pas vide
         Do While Not myrst.EOF
         mytst.AddNew
         mytst!DateCA = mytst!DateCA
         mytst!initial = soldeinit
         'mytst.Update
         'mytst.Edit
         mytst!diff = myrst![Client] - myrst![fournisseur] - myrst![CNSS] - myrst![FraisBq] - myrst![Honorass] - myrst![Honorex] - myrst![Honorint] - myrst![loyer] - myrst![lydec] - myrst![NFb] - myrst![NFa] - myrst![Sem] - myrst![Tel] - myrst![voitures] - myrst![IR] - myrst![CIMR]
     
         soldefin = soldeinit + myrst![Client] - myrst![fournisseur] - myrst![CNSS] - myrst![FraisBq] - myrst![Honorass] - myrst![Honorex] - myrst![Honorint] - myrst![loyer] - myrst![lydec] - myrst![NFb] - myrst![NFa] - myrst![Sem] - myrst![Tel] - myrst![voitures] - myrst![IR] - myrst![CIMR]
     
     
         mytst!final = soldefin
         mytst.Update
         dateT = myrst!DateCA
         'MsgBox (dateT)
         soldeinit = soldefin
     
         myrst.MoveNext
     
        Loop
     
     
    dateTA = dateT + 1
     
    mySQL = "SELECT [solde_initial].* From [Solde_initial] where [solde_initial].dateCA = (#" & Format(dateTA, "mm-dd-yyyy") & "#)"
    Set mytst = CurrentDb.OpenRecordset(mySQL, dbOpenDynaset)
     
        If Not mytst.EOF Then
            mytst.Edit
            mytst!initial = soldefin
            mytst.Update
        Else
            db.Execute "INSERT INTO Solde_initial(DateCA,initial) VALUES(#" & Format(dateTA, "mm-dd-yyyy") & "#," & soldefin & ");"
        End If
     
     
    DoCmd.OpenForm "CA"
     
    'MsgBox (mydeb)
    Forms![CA].Form.RecordSource = "SELECT Mydeb.*, solde.initial, solde.final FROM (" & mydeb & ") AS Mydeb LEFT JOIN solde ON mydeb.DateCA = solde.DateCA;"
     
    myrst.Close
    Set myrst = Nothing
    mytst.Close
    Set mytst = Nothing
    db.Close
     
     ' Libération de la référence
    Set Qdf = Nothing
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT RJours.DateJour AS DateCA, (nz(Sum(facture_clients.reste),0)+nz(Sum([detail_paie_C.montant_reglé]),0)) AS Client, (nz(Sum(facture_fournisseurs.reste),0)+nz(Sum([detail_paie_F.montant_reglé]),0)) AS fournisseur, nz(Sum([CNSS.montant_TTC]),0) AS CNSS, nz(Sum([Frais_de_banque.montant_TTC]),0) AS FraisBq, nz(Sum([Honoraires_associés.montant_TTC]),0) AS Honorass, nz(Sum([Honoraires_extra_groupe.montant_TTC]),0) AS Honorex, nz(Sum([Honoraires_intra_groupe.montant_TTC]),0) AS Honorint, nz(Sum([Loyer.montant_TTC]),0) AS loyer, nz(Sum([lydec.montant_TTC]),0) AS lydec, nz(Sum([Notes_de_frais_autres.montant_TTC]),0) AS NFb, nz(Sum([notes_de_frais_carte_bleue.montant_TTC]),0) AS NFa, nz(Sum([Salaires_employés.montant_TTC]),0) AS Sem, nz(Sum([Téléphone.montant_TTC]),0) AS Tel, nz(Sum([Voitures.montant_TTC]),0) AS voitures, nz(Sum([IR.montant_TTC]),0) AS IR, nz(Sum([CIMR.montant_TTC]),0) AS CIMR
    FROM ((((((((((((((((((SELECT DateSerial(Année,Mois,Tjours.jour) AS DateJour FROM (SELECT top 1 1 AS jour  FROM Facture_clients union SELECT top 1 2 FROM Facture_clients union  SELECT top 1 3 FROM Facture_clients  union SELECT top 1 4 FROM Facture_clients union  SELECT top 1 5 FROM Facture_clients union SELECT top 1 6 FROM Facture_clients  union SELECT top 1 7 FROM Facture_clients union SELECT top 1 8 FROM Facture_clients union  SELECT top 1 9 FROM Facture_clients  union SELECT top 1 10 FROM Facture_clients union SELECT top 1 11 FROM Facture_clients union SELECT top 1 12 FROM Facture_clients  union  SELECT top 1 13 FROM Facture_clients union SELECT top 1 14 FROM Facture_clients union SELECT top 1 15 FROM Facture_clients  union  SELECT top 1 16 FROM Facture_clients union SELECT top 1 17 FROM Facture_clients union SELECT top 1 18 FROM Facture_clients  union SELECT top 1 19 FROM Facture_clients  union  SELECT top 1 20 FROM Facture_clients union SELECT top 1 21 FROM Facture_clients  union SELECT top 1 22 FROM Facture_clients union SELECT top 1 23 FROM Facture_clients union  SELECT top 1 24 FROM Facture_clients  union SELECT top 1 25 FROM Facture_clients union SELECT top 1 26 FROM Facture_clients union  SELECT top 1 27 FROM Facture_clients  union SELECT top 1 28 FROM Facture_clients union SELECT top 1 29 FROM Facture_clients union SELECT top 1 30 FROM Facture_clients union  SELECT top 1 31 FROM Facture_clients)  AS Tjours WHERE Month(DateSerial(Année,Mois,TJours.jour))=Mois)  AS RJours LEFT JOIN Facture_clients ON RJours.DateJour=Facture_clients.date_reglement) LEFT JOIN facture_fournisseurs ON RJours.DateJour=facture_fournisseurs.date_reglement) LEFT JOIN CNSS ON RJours.DateJour=CNSS.date_reglement) LEFT JOIN Frais_de_banque ON RJours.DateJour=Frais_de_banque.date_reglement) LEFT JOIN Honoraires_associés ON RJours.DateJour=Honoraires_associés.date_reglement) LEFT JOIN Honoraires_extra_groupe ON RJours.DateJour=Honoraires_extra_groupe.date_reglement) LEFT JOIN Honoraires_intra_groupe ON RJours.DateJour=Honoraires_intra_groupe.date_reglement) LEFT JOIN Loyer ON RJours.DateJour=Loyer.date_reglement) LEFT JOIN Lydec ON RJours.DateJour=Lydec.date_reglement) LEFT JOIN Notes_de_frais_autres ON RJours.DateJour=Notes_de_frais_autres.date_reglement) LEFT JOIN Notes_de_frais_carte_bleue ON RJours.DateJour=Notes_de_frais_carte_bleue.date_reglement) LEFT JOIN Téléphone ON RJours.DateJour=Téléphone.date_reglement) LEFT JOIN Salaires_employés ON RJours.DateJour=Salaires_employés.date_reglement) LEFT JOIN Voitures ON RJours.DateJour=Voitures.date_reglement) LEFT JOIN detail_paie_C ON RJours.DateJour=detail_paie_C.Date_reglement) LEFT JOIN detail_paie_F ON RJours.DateJour=detail_paie_F.Date_reglement) LEFT JOIN CIMR ON RJours.DateJour=CIMR.date_reglement) LEFT JOIN IR ON RJours.DateJour=IR.date_reglement
    GROUP BY RJours.DateJour
    ORDER BY RJours.DateJour;

  2. #2
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    tout d'abord DLookUp est une fonction lente, tu peut gagner du temps de traitement en la remplaçant par une fonction qui ouvre un recordset sur ta table ou ta requête et la parcourt pour retourner la bonne valeur.
    Par exemple :
    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
    ' fonction qui remplace DLookUp qui est trop lent
    Public Function SelRec(Param As String, Table As String, Optional ClauseW As String) As Variant
     Dim SQL As String
     Dim RecParam As Recordset
        If ClauseW = "" Then
            SQL = "SELECT " & Param & " FROM " & Table & ";"
        Else
            SQL = "SELECT " & Param & " FROM " & Table & " WHERE " & ClauseW & ";"
        End If
        Set RecParam = CurrentDb.OpenRecordset(SQL)
        If Not RecParam.EOF Then
            SelRec = RecParam.Fields(0)
        Else
            SelRec = Empty
        End If
        RecParam.Close
        Set RecParam = Nothing
    End Function

    Ensuite je me suis aperçu que le requêteur Access a du mal avec les gros volume de données. Il est toujours plus rapide de faire une requête de pré-selection qui vas retourner un petit volume, puis de faire les traitements SQL (les autres requêtes) sur cette requête là. Tu peux aussi remplir une table temporaire avec les résultats intermédiaires, ça peut te faire gagner beaucoup de temps.

    Si tu pouvais poster un exemple de requête SQL cela aiderais aussi.

    Bon courage.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Bonjour
    Merci djim pour la réponse en fait dlookup ne prend pas du temps c'est exactement cette partie du code qui prend bc de temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set Qdf = db.QueryDefs("RCA2")
      ' Code qui utilise qdf
      ' Par exemple
    Qdf.Parameters("année") = Forms!Welcome.Form!cboannee   '<== si requête paramétrée
    Qdf.Parameters("mois") = Forms!Welcome.Form![mois]
    mydeb = Qdf.SQL                                 '<== si requête action
    mydeb = Replace(Replace(mydeb, "Année", Qdf.Parameters("[Année]")), "Mois", Qdf.Parameters("[Mois]"))
    mydeb = Replace(mydeb, ";", "")
    Set myrst = CurrentDb.OpenRecordset(mydeb, dbOpenDynaset)
    ps : pour la requete RCA2 je l'ai deja posté

  4. #4
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour,
    sauf erreur de ma part, je ne crois pas qu'on ai eu la requête RCA2 en SQL.

    Or, c'est sans doute dans cette chaîne SQL qu'on peut progresser.

    Pierre

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Bonjour pierre
    oui effectivement j'ai bien dis que c'été à ce niveau que ça beug or je ne vois pas pour le moment comment faire pour réduire le temps
    Des idées?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Rebonjour
    Voila j'ai enlevé la requete et j'ai modifier le code l'execution est devenu bc plu rapide or les données entrées sont le mois et l'année pour générer tous les jours du mois
    j'ai créer une table Tjours qui contient les chiffre de 1 à 31 et j'ai mis ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SelDate = "select Dateserial(" & Forms!Welcome.Form!cboannee & "," & Forms!Welcome.Form![mois] & ",Jour) AS Jours FROM Tjours WHERE " & Month(Jours) & "  = " & Forms!Welcome.Form![mois] & ""
    Set myrst = db.OpenRecordset(SelDate, dbOpenDynaset)
    Mon problème est au niveau du where humm pq je mes le where parce que si on a que 30jours dans le mois (novembre par exemple ) 31/11/2012 sera alors 01/12/2012 et moi je veux que le mois 11
    le problème est le suivant : si je laisse le month() sans les & & j'ai le msg d'erreur trop peu de paramètre attendu 1 si je mes le && j'ai le msg attendu expression
    qlq un a une idée svp?
    Mercii

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 786
    Points : 14 841
    Points
    14 841
    Par défaut
    Bonsoir,
    ton bout de code ne fonctionne pas en l'état, de plus il te renvoie des résultats faux. Donc, le mieux, c'est de faire autrement : je te propose d'ajouter 2 variables pour borner les dates et ainsi sélectionner les bons jours du mois :
    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
    Dim seldate As String
    Dim myrst As Recordset
    Dim DB As Database
    Dim Mindate As Date
    Dim Maxdate As Date
     
    Set DB = CurrentDb
    ' Calcul des dates inférieures et supérieures
    Mindate = DateSerial(Forms!Welcome.Form!cboannee, Forms!Welcome.Form![Mois], 1)
    Maxdate = DateAdd("m", 1, DateSerial(Forms!Welcome.Form!cboannee, Forms!Welcome.Form![Mois], 1)) - 1
     
    seldate = "select Dateserial(" & Forms!Welcome.Form!cboannee & "," & Forms!Welcome.Form![Mois] & ",Jour) AS Jours FROM Tjours WHERE Jour between " & Day(Mindate) & " and " & Day(Maxdate) & ";"
    Set myrst = DB.OpenRecordset(seldate, dbOpenDynaset)
    ...
    ...
     
    myrst.Close
    Set myrst = Nothing

Discussions similaires

  1. Execution d'une requete sous excel-debutant en excel
    Par Kalvin_20 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 16/05/2008, 11h50
  2. Temps d'execution d'une requete
    Par toto2233 dans le forum Requêtes
    Réponses: 8
    Dernier message: 19/07/2007, 08h55
  3. Réf : Mesurer le temps d 'execution d 'une requete
    Par akrabmehdi dans le forum SQL
    Réponses: 1
    Dernier message: 10/07/2007, 20h48
  4. temp d'execution d'une requete sql
    Par mitoubra dans le forum JDBC
    Réponses: 4
    Dernier message: 15/06/2007, 22h34
  5. [Stratégie] Mesurer le temps d'exécution d'une requête
    Par nice dans le forum Général Java
    Réponses: 5
    Dernier message: 29/01/2006, 17h53

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