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

Requêtes et SQL. Discussion :

Traitement lourd de données [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 96
    Points : 63
    Points
    63
    Par défaut Traitement lourd de données
    Bonjour à tous !

    J'ai un petit problème avec le temps de traitement de mon code. Pour vous expliquer simplement, je cherche à remplir telle quelle une feuille Excel via le code mon application Access. Je récupère les enregistrement selon une requête. Le nombre des enregistrements vont de 5 000 lignes à 30 000.

    • Méthode ADO
      J'ai essayer de le faire avec un recordset ADO. La méthode marche mais est relativement longue. Voici le code :
      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
       With rst
              .ActiveConnection = cnx
              .LockType = adLockPessimistic
              .CursorType = adOpenForwardOnly
              .Source = "SELECT Mesure.* " _
                      & "FROM Mesure " _
                      & "WHERE Mesure.Mesure_SecSoud Like '" & nomSecteur & "';"
              .Open
       
              While (Not .EOF And Not .BOF)
              DoEvents
       
                  'N° Secteur
                  wksheet.Cells(intLig, 1).Value = .Fields("Mesure_SecSoud")
       
                  'Position angulaire
                  wksheet.Cells(intLig, 2).Value = .Fields("Mesure_Position")
       
                  'Temps
                  wksheet.Cells(intLig, 3).Value = .Fields("Mesure_Temps")
       
                  'Période
                  wksheet.Cells(intLig, 4).Value = .Fields("Mesure_Période")
       
                  'Champs
                  wksheet.Cells(intLig, 5).Value = .Fields("Mesure_Champs")
       
                  'Consigne
                  wksheet.Cells(intLig, 6).Value = .Fields("Mesure_consigne")
       
                  'Réel
                  wksheet.Cells(intLig, 7).Value = .Fields("Mesure_Valeur")
       
                  .MoveNext
                  intLig = intLig + 1
              'Wend
              .Close
          End With
    • Etat
      Ensuite je suis passé par un Etat que j'exporte sur Excel, effectivement c'est beaucoup plus rapide, moins maniable car ça écrase le workbook en cours. Le problème c'est que passé 20 000, l'exportation plante littéralement. Voici le code :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Creer_Requete "Liste_Mesure", "SELECT Mesure.* FROM Mesure WHERE Mesure.Mesure_SecSoud LIKE '" & nomSecteur & "' ORDER BY Mesure.Mesure_Temps;"
      DoCmd.OutputTo acOutputQuery, "Liste_Mesure", acFormatXLS, RESUME_PATH & "\" & "tampon.xls", True
      Creer_requete est une fonction qui écrase la requete ayant le même nom si elle existe et la recrée.

    • Enregistrement dans un tableau tampon tous les enregistrement d'un recordset puis coller le tableau dans Excel
      J'ai pas tester cette méthode j'ai un peu de mal avec le code. Cela dit je pense pas qu'elle soit plus avantageuse que ce soit en mémoire ou en temps.


    Donc mes questions sont :
    • Quelle est la méthode qui correspond le plus à mon cas ?
    • Comment l'optimiser d'un point de vue du temps de traitement ?


    Merci de m'avoir lu et un second merci à ceux qui voudront bien répondre !

  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
    Essaye plutôt ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "nom_de_ta_requête", "C:\Export.xls", True
    où true indique que tu veux voir tes noms de champs apparaître.
    Tu peux même lui indiquer après le true, la feuille et le range.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Regardes aussi du coté de la méthode CopyFromRecordset de l'objet Range.

    Et ce tuto : http://cafeine.developpez.com/access/tutoriel/excel/

    Philippe

  4. #4
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 96
    Points : 63
    Points
    63
    Par défaut
    Merci à vous deux je vais tester vos réponses

    Cela dit Taoueret je ne pense pas que ça règle le problème pour l'etat qui au final ne gère pas les résultats de requête faisant plus de 20 000 lignes.

    Aussi pour information la méthode .GetRows du recordset ADO est rapide il met bien tout dans une variable tableau mais quand je le met dans excel... il me fait un tableau en largeur xD mais ça marche au moins enfin plutot moins que plus.

    Dans tous les cas merci je vous tiens au courant !

  5. #5
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 96
    Points : 63
    Points
    63
    Par défaut
    Merci Philippe JOCHMANS pour cette méthode CopyFromRecordset !

    Comme je travaille sur Access même dans l'aide je n'ai pas les méthode excel et je dois dire que celle là marche au poil !

    Merci beaucoup !

    Sur les 3 solutions que j'avais en tête, il y en a une bien plus simple, rapide et efficace que les autres c'est celle-ci.

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

Discussions similaires

  1. problème d'affichage dû à un traitement lourd
    Par lastrecrue dans le forum Débuter
    Réponses: 8
    Dernier message: 27/11/2008, 00h32
  2. [Thread] Traitement lourd a intervale régulier
    Par anthyme dans le forum Silverlight
    Réponses: 7
    Dernier message: 03/05/2008, 20h34
  3. [JAVA & XML] Fichiers + Traitements lourds, des conseils pour l'API ?
    Par Orus dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 30/10/2007, 17h38
  4. Exécuter un traitement lourd
    Par falcon dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 02/10/2007, 16h15
  5. [C++/VB.Net]Optimiser des traitements lourds
    Par NiamorH dans le forum Windows Forms
    Réponses: 8
    Dernier message: 28/05/2006, 11h03

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