Le Contexte
Le contexte est constitué d’une base Access et d’un site hébergé chez un prestataire.
J’effectue chaque nuit la synchronisation de la bdd avec le site. Les infos descendent du site vers la bdd (rien dans l’autre sens).
Le Site produit chaque nuit à heure fixe un fichier .CSV avec une image de la table concernée.
Le fichier Csv est placé par le site sur un serveur ftp.
Le programme de synchronisation commence par recopier le fichier .csv du ftp vers notre serveur NAS interne. Il exploite ensuite le fichier recopié pour mise à jour de la bdd. Le déclenchement du travail est fait par une « tache planifiée » sur le pc.
Le programme fonctionne ainsi depuis 2 ans mais, périodiquement et de manière aléatoire, se produisent des erreurs fatales qui font avorter la sychro… et du coup, le lendemain matin, la bdd n’est pas à jour pour les collaborateurs.
Le plus étrange est qu’en relançant la synchro immédiatement après un avortement, avec exactement les mêmes éléments en jeu (la bdd et le fichier csv produit la nuit précédente) , le programme passe sans pb (il faut parfois 3 ou 4 tentatives mais il finit toujours par passer)
Cela fait 2 ans que je cherche en vain l’origine de ces plantages aléatoires et j’ai fini par jeter l’éponge. Faute de résoudre le pb, je cherche maintenant à le contourner pragmatiquement.
Je me propose de d’intégrer la synchronisation dans une boucle et, en cas d’erreur de synchro, de relancer celle-ci jusqu’à 5 fois (ce qui est le nombre maximum de tentatives qu’il me faut en général pour que le programme passe.)
J’ai donc écrit un code ayant la structure suivante.
Le résultat de ce code est que lors de la première boucle, le programme revient bien en er1 qui renvoie à l’étiquette reprise: pour la deuxième tentative…. Mais là l’instruction « on error goto er1 » est inopérante et le programme « plante lors de cette deuxième tentative.
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 Function test_boucle_erreur() As Integer Const max_attempt = 5 ' je veux faire 5 tentatives Dim nb_attempt As Integer 'id tentative en cours Dim dummy nb_attempt = 0 reprise: On Error GoTo er1 nb_attempt = nb_attempt + 1 Call sub1 ' une procédure qui produira une erreur Exit Function er1: If nb_attempt <= max_attempt Then GoTo reprise Else MsgBox ("erreur après 5 tentatives") Exit Function End If End Function Sub sub1() DoCmd.OpenForm ("toto") 'il n'y a pas de formulaite "toto"... je provoque délibérament une erreur pour montrer ce qui se passe End Sub
Que convient il de faire pour qu’une boucle de programme provoquant potentiellement une erreur soit effectué 5 fois ?
Partager