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

VBA Access Discussion :

utilisation de la commande on error goto etiquette [AC-2013]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Points : 54
    Points
    54
    Par défaut utilisation de la commande on error goto etiquette
    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.

    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
    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.

    Que convient il de faire pour qu’une boucle de programme provoquant potentiellement une erreur soit effectué 5 fois ?

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonsoir,

    Il me semble que comme l'erreur est dans la sub elle n'est pas impactée par l'instruction "on error goto..."
    Je pense que c'est à la sub de dire si elle s'est terminée correctement ou non (avec un on error goto... à l'intérieur), ensuite la procédure principale exécutera la sub autant de fois que nécessaire
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Points : 54
    Points
    54
    Par défaut
    bonsoir et merci pour cette idée.

    En fait je suis déjà passé par cette idée: faire une gestion d'erreur dans le sub mais cela n'a rien donné.

    Tout semble se passer comme si la procédure où l'erreur s'est produite conservait la mémoire de l'incident. On peut d'ailleurs imaginer que microsoft a tout fait pour interdire le création de boucle sur une erreur qui pourrait ammener le programe à se mordre la queue..

    J'ai, du coup, tenté l'instruction err.clear... mais cela n'a rien donné.

    à suivre !

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    MS n'en fait pas tant

    J'ai fait le test suivant et "bug" s'exécute bien 5 fois sans succès :
    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
    Private Sub test_error_Click()
    Dim i As Integer, ok As Boolean
    i = 0: ok = False
    While i < 5 And Not ok
      ok = Not bug
      i = i + 1
    Wend
    MsgBox i
    End Sub
     
    Private Function bug() As Boolean
    On Error GoTo err:
    Dim x As Double
    bug = False
    x = 1 / 0 'à remplacer par l'import souhaité
    Exit Function
    err:
    bug = True
    End Function
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Points : 54
    Points
    54
    Par défaut
    Bonjour Nico84 et encore merci !

    J'observe qu'effectivement le test que tu as ecrit donne le résultat que je souhaite.
    la différence qu'il y a entre ton test et les essais que j'ai fait jusqu'à présent est que j'avais une instruction on error goto dans la fonction appelante et dans les les fonctions appelées.

    Comme il y a 2 sous niveaux d'imbrication, je vais essayer de mettre les on error au niveau le plus bas et je reviens vers le forum pour te dire le resultat.

    Cordialement

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Pour ce que j'en ai compris, on error est local à la procédure et ne s'exécute au plus qu'une fois

    Mon exemple marche aussi comme ça :
    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
    Private Sub test_error_Click()
    Dim i As Integer, ok As Boolean
    On Error GoTo err:
    i = 0: ok = False
    While i < 5 And Not ok
      ok = Not bug
      i = i + 1
    Wend
    err:
    MsgBox i
    End Sub
     
    Private Function bug() As Boolean
    On Error GoTo err:
    Dim x As Double
    bug = False
    x = 1 / 0
    Exit Function
    err:
    bug = True
    End Function
    test_error_click n'est pas en erreur et bug s'exécute bien 5 fois aussi

    Ton exemple ne fonctionnait pas car sub n'a pas de gestion d'erreur donc l'erreur est constatée en retour dans test_boucle_erreur
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2011
    Messages : 75
    Points : 54
    Points
    54
    Par défaut Merci, cela marche !
    Bonsoir Nico84,

    J'ai réecrit le programme en tenant compte de tes observations et effectivement cela marche maintenant.

    Un grand merci.

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

Discussions similaires

  1. on error goto <etiquette>
    Par fx007 dans le forum VBA Word
    Réponses: 1
    Dernier message: 16/05/2008, 20h15
  2. utilisation successive d'un "on error, goto"
    Par fisto dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/04/2008, 14h29
  3. Problème avec l'utilisation de la commande system awk
    Par vbcasimir dans le forum Linux
    Réponses: 3
    Dernier message: 05/10/2004, 16h18
  4. Récupérer un fichier suite à l'utilisation de la commande rm
    Par Kimael dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 02/10/2004, 18h34
  5. [TP][Graphique]Utilisation de la commande Setviewpost
    Par repairman dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 09/07/2003, 13h26

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