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 :

Gestion des erreurs - Rapport d'erreurs sous access


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Par défaut Gestion des erreurs - Rapport d'erreurs sous access
    Bonjour

    Pour gérer les erreurs de ma base de données, j'ai appliqué les intructions décrites dans le tutoriel de Christphe Warin dans ce lien (http://warin.developpez.com/access/erreur/tutoriel1/)

    Lors de mon premier test, j'ai bien eu un fichier log mais vide (0 octet). J'ai reessayé plusieurs fois sans succès.
    J'ai supprimé le premier fichier log pour qu'un autre soit créé, et là c'est pire car je n'ai plus de fichier log du tout pendant les tests.

    Quelqu'un pourrait-il m'aider à trouver là où je me suis planté ?

    Voici le code qui devrait générer une erreur
    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
    '
    Sub R000C000AGECLIEN()
    '
    On Error GoTo Erreur:
    '
        DoCmd.OpenQuery "R000C000AGECLIEN00vM", acViewNormal, acEdit ' l'erreur est à ce niveau car l'objet R000C000AGECLIEN00vM n'existe pas
        DoCmd.OpenQuery "R000C000AGECLIEN01M", acViewNormal, acEdit
        If Message < 1 Then MsgBox "Fin du traitement", vbInformation, "Message d'exécution"
        Exit Sub
    '
    Erreur:
        If Message > 0 Then
            oGestErreur.EnregistrerErreur Err.Number, Err.Description, "R000C000AGECLIEN()"
        Else
            ErreurProgramme
        End If
        Exit Sub
    '
    End Sub
    Normalement ce code devrait insérer dans le rapport une erreur de n° 7874.

    Merci d'avance de vos contributions.

  2. #2
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    If Message < 1 Then MsgBox "Fin du traitement", vbInformation, "Message d'exécution"
    Message est utilisé nulle part. Il est donc toujours égal à 0

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Par défaut
    Message est utilisé nulle part. Il est donc toujours égal à 0
    Bonjour Tofalu

    Merci de ta remarque. Je t'en donne l'explication ci-après.

    En fait la variable Message est une variable public
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Message As Integer
    qui figure dans un autre module standard, et que j'utilise pour générer ou non l'affichage d'un message de fin de traitement.
    Dans chaque sub il y a un message de fin de traitement comme dans le code précédemment donné, et chacun des sub peut être lancé soit individuellement, soit à partir d'un autre plus générique.

    Exemple :
    Dans ma base je veux déterminer les soucriptions à un ou plusieurs produits X, Y et Z de la gamme ALPHA. Pour chaque produit il y a un sub et il y a un sub de la gamme ALPHA.
    Si je veux mettre à jour les données d'un produit pris individuellement, je lance les traitements pour chacun d'eux et à chaque produit j'ai un msgbox de fin de traitement (car ils peuvent être longs). Ceci correspond à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Message < 1 Then MsgBox "Fin du traitement", vbInformation, "Message d'exécution"
    car à ce stage Message = 0 pour chaque produit.

    Par contre si je veux mettre à jour toute la gamme pour gagner du temps, je lance les traitements via le sub ALPHA qui se présente comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub ALPHA()
    '
    Message = Message + 1
    '
        X
        Y
        Z
    If Message < 2 Then MsgBox "Fin du traitement", vbInformation, "Message d'exécution"
    '
    Message = Message - 1
    '
    End Sub
    Ici Message est mis automatiquement à 1 (0+1) pour empêcher d'avoir un msgbox de fin de traitement à chaque produit de la gamme traitée mais seulement à la fin du sub de la gamme.

    En ce qui concerne le rapport d'erreur, tout mon intérêt est qu'en lançant le sub de la gamme je souhaite avoir la liste des produits sur lesquels il y a eu erreur afin de les corriger individuellement sans avoir à interrompre le traitement de la gamme. C'est ce qui justifie le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Erreur:
        If Message > 0 Then
            oGestErreur.EnregistrerErreur Err.Number, Err.Description, "R000C000AGECLIEN()"
        Else
            ErreurProgramme
        End If
        Exit Sub
    '
    End Sub
    car à ce niveau Message est forcément au moins égal à 1.

    Merci.

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 133
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    car à ce niveau Message est forcément au moins égal à 1.
    Ca c'est moins sûr...
    Le mieux est l'enemi du bien et les variables publiques, les enemies des procédures
    Met un espion conditionnel sur ta variable message et tu verra si effectivement il est au moins égal à 1...

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Par défaut
    Bonjour,
    Met un espion conditionnel sur ta variable message et tu verra si effectivement il est au moins égal à 1...
    Merci Argy pour le coup de l'espion conditionnel. Je suis débutant en VBA et je ne savais pas ce que c'était. J'ai ajouté l'espion et visiblement tout se passe comme je l'ai prévu dans le code. J'ai aussi remarqué que l'espion disparait dès que je ferme la base de données.

    Seulement j'ai toujours mon problème de rapport qui ne fonctionne pas. En faisant un test de large envergure dans ma base de données access, certaines requêtes m'ont effectivement généré des erreurs. Mais j'ai à chaque fois le message impossible d'écrire dans le fichier du gestionnaire d'erreur.
    J'ai tout de même passé en revue débogage le code de Christophe Warin (Tofalu) http://warin.developpez.com/access/erreur/tutoriel1/ pour voir comment il agissait dans la base. Voici les résultats :
    - le code Autoexec fonctionne bien visiblement, la valeur strLogFileName = "R:\base.log"
    - Visiblement l'instanciation se passe bien car j'ai pas de message d'erreur (même si la valeur oFichierLog passe de vide à rien à la fin du code et que la variable oFso n'est pas définie ? )
    - L'enregistrement de l'erreur ne se passe pas comme il faut. Les paramètres intErrNumber, strErrMessage et strNomProc contiennent les bonnes valeurs (respectivement 7874, "Impossible de trouver l'objet 'R000C000AGECLIEN00vM'.", "R000C000AGECLIEN") mais la variable oFichierLog est vide ce qui génère le message d'écriture impossible.

    A mon avis c'est à ce niveau que se situe le problème. La variable oFichierLog perd sa valeur (ou n'a pas de valeur) pendant l'enregistrement de l'erreur. J'ai tout de même remarqué (peut être à tort) que c'est le seul paramètre qui n'est pas déclaré dans la solution de Tofalu (tous les autres étant soit des paramètres dans les procédures, soit nommément précédé de Dim). En tant que novice, j'ai essayé de déclarer oFichierLog comme variable public dans le module de classe GestionnaireErreur, mais cela empêche l'instanciation du gestionnaire d'erreurs.

    Je fais appel aux professionnels sur le forum pour me guider vers une solution. J'avoue que là je me suis trop avancé par rapport à mon niveau de débutant.

    Merci de vos contributions.

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 133
    Billets dans le blog
    5
    Par défaut
    Si tu ne peux pas écrire dans le LOG, c'est que le fichier est resté ouvert (soit par ta faute soit par une erreur levée) et une erreur 70 est levée...

    Pour éviter les problèmes de déclarations, pas celle du fisc, j'entends bien, met un Option Explicit dans l'en-tête de chaque module...
    Compile ton projet et vois là où ça coince.

    Ton erreur est visiblement minime mais suffisamment importante pour t'embêter.

    Je serais dans ta position, j'écrirais sur un bout de papier ce que doit faire mon code et ensuite, je transposerais... Tu verras certainement le pourquoi de ta question initiale.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0

Discussions similaires

  1. [WD17] Gestion des langues (message d'erreur et interface)
    Par cladoo dans le forum WinDev
    Réponses: 0
    Dernier message: 12/10/2012, 10h51
  2. [ASE 21.5.4] mappage des tables sybase 12.5 sous access 2003 via odbc
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 5
    Dernier message: 27/02/2008, 15h50
  3. Comment afficher le rang des résultats d'une requête sous Access 2002
    Par painpepper dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/08/2007, 01h19
  4. Gestion des fichiers XML et ASC3 sous Flex:
    Par silverfab34 dans le forum Flex
    Réponses: 2
    Dernier message: 18/07/2007, 17h34
  5. Réponses: 4
    Dernier message: 25/11/2005, 18h15

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