Bonjour,
Je viens vers vous pour une optimisation de code sous VBA Access.
J'ai un petit bout de code, mélangeant traitement d'enregistrement avec des Recordset et du SQL, qui me permet de mettre à jour un champ (IdListeFichierPalier) à partir d'un autre champ (N°) en fonction de critères provenant d'autres champs (Nom), (Type) et (Taille).
La table compte un peu plus de 390 000 lignes et malheureusement le temps de traitement est trèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèès long, c'est pour cela que je vous demande de l'aide.
Je procède donc de la façon suivant pour le code, je ne sais pas si c'est la meilleure, je ne pense pas vu le temps de traitement :
- Je boucle sur tous les enregistrements de la table avec les recordsets
- Sur chaque enregistrement, j'identifie plusieurs critères :
-> ID que je dois mettre dans le champ (IdListeFichierPalier) si celui si répond à 3 critères
-> Critère 1 = (Nom)
-> Critère 2= (Type)
-> Critère 3= (Taille)
- Cette mise à jour de champ répondant au 3 critères se faire à partir d'une requête SQL
Donc ma question est, est-ce que l'on peut optimiser ce bout de code ou le long temps de traitement est dû au grand nombre d'enregistrement ?
Est-ce que le fait de mélanger traitement avec recordset et SQL n’alourdit pas le code ?
Le code :
Merci.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Set rstTblTmp1 = CurrentDb.OpenRecordset(TableTmp, dbOpenDynaset) rstTblTmp1.MoveFirst While (Not rstTblTmp1.EOF) If IsNull(rstTblTmp1.Fields(ColonneTmp)) And rstTblTmp1![Type] <> "Dossier de fichiers" Then ID = rstTblTmp1![N°] NomTmp = rstTblTmp1![Nom] TypeTmp = rstTblTmp1![Type] TailleTmp = rstTblTmp1![Taille] strSQL = "UPDATE [" & [TableTmp] & "] SET [" & [TableTmp] & "].[" & [ColonneTmp] & "] = " & ID & " Where ([" & [TableTmp] & "]![Nom] = '" & NomTmp & "' And [" & [TableTmp] & "]![Type] = '" & TypeTmp & "' And [" & [TableTmp] & "]![Taille] = " & Replace(CDec(TailleTmp), ",", ".") & " );" DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End If rstTblTmp1.MoveNext Wend rstTblTmp1.Close Set rstTblTmp1 = Nothing