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

Access Discussion :

boucle while trop lente


Sujet :

Access

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut boucle while trop lente
    Je veux modifier les données d'un champ dans tous les enregistrements d'une table Access.
    J'utilise une boucle while en VBA, mais ma table compte plus de 20000 enregistrements, c'est donc un peu lent.
    Existe-t-il un moyen plus rapide?

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Essai avec une instruction sql UPDATE
    Amicalement

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Ca ne sera pas mieux avec une instruction sql Update parce que le champ que je modifie est lié à un autre champ du même enregistrement.

    C'est à dire qu'il faut que je passe dans chaque enregistrements de la table pour modifier une données en rapport avec une autre.

    Le problème est que ma table compte plus de 25000 enregistrements et que c'est très lent, je voudrais trouver un moyen plus rapide.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ca peut peut-être se faire avec un UPDATE. Donne nous tous les détails (table et champs) nécessaires et on verra.

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Voice mon 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    'ouverture de la table Delais_comm
    Set Delais_comm = CurrentDb.OpenRecordset("Delais_comm", dbOpenTable)
    Delais_comm.MoveFirst
     
    'on récupère le n° de la semaine en cours
    numeroSem = DatePart("ww", DateDuJour, vbMonday, vbFirstFourDays)
    numeroSem = numeroSem + ((DatePart("yyyy", DateDuJour) - 2000) * 100)
     
    While Delais_comm.EOF = False
          Delais_comm.Edit
     
          'récupère l'année
          numeroAnnee = DatePart("yyyy", Delais_comm![Date delai])
          If numeroAnnee > 2000 Then
              numeroAnnée = (numeroAnnee - 2000) * 100
          End If
     
          'calcul du n° de semaine par rapport à la date
          If (DatePart("ww", Delais_comm![Date delai], vbMonday,
                                                           vbFirstFourDays)) >= 52 _
          And DatePart("yyyy", Delais_comm![Date delai]) = DatePart("yyyy",
                                                                           DateDuJour) Then
               SemDateDelai = numeroAnnée + (DatePart("ww", 
                                                                 Delais_comm![Date delai],
                                                      vbMonday, vbFirstFourDays)) - 100
          Else
               SemDateDelai = numeroAnnée + (DatePart("ww",
                                                                 Delais_comm![Date delai],
                                                               vbMonday, vbFirstFourDays))
          End If
     
          If SemDateDelai < numeroSem Then
               Delais_comm!Semaine = "<>"
          ElseIf SemDateDelai = numeroSem Then
               Delais_comm!Semaine = "S"
          Else
               Select Case SemDateDelai
                   Case (numeroSem + 1)
                        Delais_comm!Semaine = "S1"
                   Case (numeroSem + 2)
                        Delais_comm!Semaine = "S2"
                   Case (numeroSem + 3)
                        Delais_comm!Semaine = "S3"
                   Case (numeroSem + 4)
                        Delais_comm!Semaine = "S4"
                   Case (numeroSem + 5)
                        Delais_comm!Semaine = "S5"
                   Case Else ' Autres valeurs.
                        Delais_comm!Semaine = "S6"
               End Select
          End If
          Delais_comm.Update
          Delais_comm.MoveNext
    Wend
    Je récupère une date dans le champ "Date delai" de la table "Delais_comm". Si cette date correspond à la semaine en cours, je mets "S" dans le champ "semaine", s'il s'agit de la semaine suivante, je mets "S1"... Si la date est précédente à la semaine en cours je mets "<>" dans le champ "semaine".

    Comment je peux rendre ça plus rapide?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Delais_comm SET semaine = switch(Condition1, valeur1,Condition2, Valeur2,...)

  7. #7
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    J'ai beaucoup de mal à mettre un update avec un switch, ça me paraît très compliqué de mettre mes conditions grâce à ça, tu peux m'éclairer!

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    exemple Condition1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Date delai] = DatePart...
    exemple valeur1 : "S1"
    ...

  9. #9
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Voilà ce que j'ai fait, mais ça ne marche pas, et ça me paraît assez complexe!

    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
    DoCmd.RunSQL "UPDATE Delais_comm SET semaine = " & _
    "switch(" & ((DatePart("yyyy", Delais_comm![Date delai]) - 200) * 100 + _
              (DatePart("ww", Delais_comm![Date delai], vbMonday, vbFirstFourDays))) < numeroSem & _
              ", <>, " & _
              ((DatePart("yyyy", Delais_comm![Date delai]) - 200) * 100 + _
              (DatePart("ww", Delais_comm![Date delai], vbMonday, vbFirstFourDays))) = numeroSem & _
              ", S, " & _
              ((DatePart("yyyy", Delais_comm![Date delai]) - 200) * 100 + _
              (DatePart("ww", Delais_comm![Date delai], vbMonday, vbFirstFourDays))) = numeroSem + 1 & _
              ", S1, " & _
              ((DatePart("yyyy", Delais_comm![Date delai]) - 200) * 100 + _
              (DatePart("ww", Delais_comm![Date delai], vbMonday, vbFirstFourDays))) = numeroSem + 2 & _
              ", S2, " & _
              ((DatePart("yyyy", Delais_comm![Date delai]) - 200) * 100 + _
              (DatePart("ww", Delais_comm![Date delai], vbMonday, vbFirstFourDays))) = numeroSem + 3 & _
              ", S3, " & _
              ((DatePart("yyyy", Delais_comm![Date delai]) - 200) * 100 + _
              (DatePart("ww", Delais_comm![Date delai], vbMonday, vbFirstFourDays))) = numeroSem + 4 & _
              ", S4, " & _
              ((DatePart("yyyy", Delais_comm![Date delai]) - 200) * 100 + _
              (DatePart("ww", Delais_comm![Date delai], vbMonday, vbFirstFourDays))) = numeroSem + 5 & _
              ", S5, " & _
              ((DatePart("yyyy", Delais_comm![Date delai]) - 200) * 100 + _
              (DatePart("ww", Delais_comm![Date delai], vbMonday, vbFirstFourDays))) >= numeroSem + 6 & _
              ", S6 );"

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Voilà ce que j'ai fait, mais ça ne marche pas...
    Bon si je suis un peu méchant dans les lignes qui vont suivre essaie de ne pas m'en vouloir...

    ARRETEZ DE DIRE "GNE GNE GNE CA MARCHE PAS" !

    On sait même pas si c'est une erreur de syntaxe ou aucun enregistrement retourné...

    Vous prenez votre requête, vous la réduisez au cas le plus simple : pas de variable, pas de tests, ... > que des constantes.
    Ensuite une fois que ça marche tu prends tes datepart et tu les teste tout seuls pour voir si tes tests passent et renvoient les bonnes valeurs.

    Attention aux types chaine (il faut entourer de quotes), date (il faut entourer de #), aux mauvaises concaténations...

    Bref débrouillez vous pour donner des infos et pas attendre qu ça tombe du ciel, tout ce qui va tomber c'est des engueulades de ma part

  11. #11
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    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
    DoCmd.RunSQL "UPDATE Delais_comm SET semaine = " & _
    "switch(((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
     "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) < " & numeroSem & _
     ", '<>', " & _
     "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
     "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem & _
     ", 'S', " & _
     "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
     "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 1 & _
     ", 'S1', " & _
     "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
     "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 2 & _
     ", 'S2', " & _
     "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
     "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 3 & _
     ", 'S3', " & _
     "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
     "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 4 & _
     ", 'S4', " & _
     "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
     "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 5 & _
     ", 'S5', " & _
     "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
     "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) >= " & numeroSem + 6 & _
     ", 'S6' );"
    Ca marche à part que pour le 1er janvier 2005, qui fait parti de la semaine 53 de l'année 2004, je n'ai pas le résultat attendu. Au lieu de prendre "<>", il prend "S6".

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Moi je t'ai résolu ton problème de perf en changeant un parcours (recordset) en update.

    Après si ton algo n'est pas bon, ce n'est pas mon problème. De plus tu peux le résoudre tout seul haut la main

  13. #13
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci de m'avoir aidé à résoudre mon problème, et tant pis pour mon pb de date (1/01/2005), j'avais tenu compte de ce pb dans ma première version avec la boucle while et le recordset, je vais voir ce que je peux faire avec le update!

  14. #14
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    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
    'modification du champ "semaine" de la table "Delai_comm"
    DoCmd.RunSQL "UPDATE Delais_comm SET semaine = " & _
    "SWITCH(((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) < " & numeroSem & ", '<>', " & _
    "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) >= 52 " & _
    "AND DatePart('yyyy', Delais_comm.[Date delai]) = DatePart('yyyy', Date()), '<>', " & _
    "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem & ", 'S', " & _
    "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 1 & ", 'S1', " & _
    "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 2 & ", 'S2', " & _
    "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 3 & ", 'S3', " & _
    "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 4 & ", 'S4', " & _
    "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) = " & numeroSem + 5 & ", 'S5', " & _
    "((DatePart('yyyy', Delais_comm.[Date delai]) - 2000) * 100 + " & _
    "(DatePart('ww', Delais_comm.[Date delai], 2, 2))) >= " & numeroSem + 6 & ", 'S6' );"
    Ca y est, c'est résolu!!!

  15. #15
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Niveau perf au fait ça a donné quoi le changement de méthode ?

  16. #16
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par vmolines
    Niveau perf au fait ça a donné quoi le changement de méthode ?
    j'aimerais bien savoir moi aussi !
    Au faite chapeau vmolines Je n'aurais certaiement pas fais mieux
    Amicalement

  17. #17
    Futur Membre du Club
    Inscrit en
    Mai 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Niveau perf, c'est mieux mais c'est pas encore super rapide! Il faut surement pas trop en demander!!!

    Merci vmolines pour le coup de main, et désolé de t'avoir "énervé"!

  18. #18
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Pas de problème j'aime ça et en général quand je m'énerve c'est bon signe.

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

Discussions similaires

  1. [Débutant] [xlsread] Boucles for trop lentes
    Par abel413 dans le forum MATLAB
    Réponses: 11
    Dernier message: 25/06/2013, 15h06
  2. [XL-2007] Boucles for imbriquées, macro trop lente
    Par Jambonpurée dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/06/2011, 18h25
  3. [XL-2003] Macro boucle for next trop lente
    Par sixtm dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/06/2011, 17h08
  4. tour de boucle while en trop
    Par floawed dans le forum C
    Réponses: 4
    Dernier message: 29/11/2010, 22h26
  5. boucle while loop trop lente et pennible
    Par jm_force dans le forum Access
    Réponses: 3
    Dernier message: 10/08/2006, 17h36

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