Salut à tous,
j'ai 3 tables :
- La première (INSEE_Cities) contient un certain nombre de code insee des communes françaises (contenu variable)
- la seconde (_Navstreets) contient aussi les codes insee (toute la france), les noms des rues et provient d'une source
- la troisième (Table_Comparative) est identique à la seconde en structure, provient d'une autre source et contient toutes les rues pour tous les codes Insee de la première table
Je fais des requetes de comparaison de champ entre les noms de rue des 2° et troisième table. La fonction Phono() est une adaptation du Soundex() trouvé dans les codes sources locaux.
J'ai plusieurs requêtes en séquences :
1 - Update avec un "Score=1" si Nom1=Nom2 + mise à jour d'un champ Flag(1) pour ne pas réutiliser les enregistrements qui ont déjà servi
2 - Update avec un "Score=2" si Left(Phono(Nom1);n)=Left(Phono(Nom2);n) ET Right(Phono(Nom1);n')=Right(Phono(Nom2);n') + mise à jour du champ Flag(1)
3 - idem que 2 avec des valeurs variable pour n et n'
4 - idem... etc...
J'ai donc mis en place le bout de code ci-dessous qui fonctionne très bien sauf à certains moment où ça bloque (notamment sur les très grosses communes où il y a beaucoup de sorties dans chacune des 2 tables à comparer). C'est à dire que Access plante : pas de messages d'erreurs, mais juste le process n'avance plus.
Pour exemple, j'ai fait un test sur la région Aquitaine entière (5 départements : 24, 33, 40, 47, 64). Il y a donc près de 2000 codes insee à traiter dans la première table. Je lance, vais boire un café, 1h après les 557 communes du département 24 étaient traités et le 33 avait commencé à tourner. La routine arrive sur la commune de Bordeaux(2000 lignes d'un côté, 8000 de l'autre). Et là.... : 1° requête ok, 2° requête...1h après, 2h,3h,4h après... plus rien. J'ai stoppé Access en plein vol
Est-ce que ce code vous paraît valable (je l'ai monté en piochant tutoriaux, réponses à des forums...etc...) ? Y a-t-il un moyen de l'améliorer ?
(j'ai mis des debug.print pour essayer de savoir où et quand ça plante)
Merci de votre aide.
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 Function Matching() Dim db As DAO.Database Dim rst As DAO.Recordset Dim SQL01 As String, SQL02 As String, SQL03 As String Dim Compteur As Field Dim KelHeur DoCmd.SetWarnings False Set rst = CurrentDb.OpenRecordset("SELECT INSEE FROM INSEE_Cities", dbOpenDynaset, dbDenyRead + dbDenyWrite) DBEngine.SetOption dbMaxLocksPerFile, 200000 Do While Not rst.EOF For Each Compteur In rst.Fields KelHeur = Format(Now, "hh:mm:ss / d mmm.") SQL01 = "UPDATE Table_Comparative (...) WHERE _Navstreets.INSEE_CODE='" & Compteur & "';" SQL02 = "UPDATE Table_Comparative (...) WHERE _Navstreets.INSEE_CODE='" & Compteur & "';" SQL03 = "UPDATE Table_Comparative (...) WHERE _Navstreets.INSEE_CODE='" & Compteur & "';" Debug.Print "Insee = " & Compteur & " (" & KelHeur & ")" CurrentDb.Execute SQL01, dbDenyWrite CurrentDb.Close Debug.Print "étape 1 : ok" CurrentDb.Execute SQL02, dbDenyWrite CurrentDb.Close Debug.Print "étape 2 : ok" CurrentDb.Execute SQL03, dbDenyWrite CurrentDb.Close Debug.Print "étape 3 : ok" Next rst.MoveNext Loop rst.Close CurrentDb.Close MsgBox ("Terminé") DoCmd.SetWarnings True End Function
Partager