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?
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?
Essai avec une instruction sql UPDATE
Amicalement
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.
Ca peut peut-être se faire avec un UPDATE. Donne nous tous les détails (table et champs) nécessaires et on verra.
Voice mon code:
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".
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
Comment je peux rendre ça plus rapide?
Code : Sélectionner tout - Visualiser dans une fenêtre à part UPDATE Delais_comm SET semaine = switch(Condition1, valeur1,Condition2, Valeur2,...)
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!
exemple Condition1 :exemple valeur1 : "S1"
Code : Sélectionner tout - Visualiser dans une fenêtre à part [Date delai] = DatePart...
...
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 );"
Bon si je suis un peu méchant dans les lignes qui vont suivre essaie de ne pas m'en vouloir...Voilà ce que j'ai fait, mais ça ne marche pas...
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![]()
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".
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' );"
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![]()
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!
Ca y est, c'est résolu!!!
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' );"
Niveau perf au fait ça a donné quoi le changement de méthode ?
j'aimerais bien savoir moi aussi !Envoyé par vmolines
Au faite chapeau vmolinesJe n'aurais certaiement pas fais mieux
Amicalement
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é"!
Pas de problème j'aime ça et en général quand je m'énerve c'est bon signe.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager