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 :

message d'erreur fermeture du formulaire


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 34
    Points : 31
    Points
    31
    Par défaut message d'erreur fermeture du formulaire
    Bonjour !

    mon problème : j'ai un formulaire où l'utilisateur saisit diverses infos. Ces infos sont vérifiées lors de l'événement beforeupdate, si une erreur est rencontrée alors BeforeUpdate est annulé. Jusque là tout va bien !

    Donc si l'utilisateur essaye de fermer le formulaire après sa saisie : une msgbox lui demande s'il veut sauvegarder sa saisie -> s'il dit "oui" les champs sont vérifiés -> si une erreur est rencontrée la fermeture du formulaire est annulée ce qui est parfait sauf qu'apparait le message d'avertissement "Impossible d'enregistrer cet objet pour l'instant... patati patata ... voulez vous toujours fermer l'objet base de données"

    Ce message est du à ma procédure BeforeUpdate, je voudrais qu'il n'apparaisse pas... Pouvez vous m'aider ? Merci...
    (je précise que setwarnings false ne marche pas)

    Charlotte

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    Essaie de mettre ton code sur l'évènement unload de ton formulaire. Tu pourras ainsi l'empecher de se fermer (et donc d'avoir le message d'erreur) si des champs ne sont pas correct

    http://http://access.developpez.com/faq/?page=Forms#EmpFermForm

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 34
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par Taoueret Voir le message
    Essaie de mettre ton code sur l'évènement unload de ton formulaire. Tu pourras ainsi l'empecher de se fermer (et donc d'avoir le message d'erreur) si des champs ne sont pas correct

    http://http://access.developpez.com/...ms#EmpFermForm
    Merci pour ta réponse,

    mais je veux que la procédure se déclenche aussi si l'utilisateur clique sur un bouton permettant de passer à un autre enregistrement (par exemple)... et le but c'est que la table ne soit pas mise à jour en cas d'erreur (ou si l'utilisateur ne souhaite pas sauvegarder sa saisie), donc il faut bien que ma procédure se lance avant que l'enregistrement ne soit mis à jour

  4. #4
    Membre actif
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 222
    Points
    222
    Par défaut
    Bonjour,
    tu executes la méthode undo sur le formulaire où se situe l'anomalie ==> après la fermeture, le formulaire ne "ralera" plus ==>les annomalies auront été retirées avant la fermeture ==> l'enregistrement courant n'essaiera plus de d'exécuter la méthode Update sur cet enregistrement comportant des anomalies sur la fermeture du formulaire

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 34
    Points : 31
    Points
    31
    Par défaut
    A moins que je n'ai pas bien compris ta suggestion, je ne souhaite pas faire un Undo car en cas d'erreur je veux que l'utilisateur (qui a choisi de sauvegarder sa saisie) retourne sur le formulaire pour corriger ce qui ne va pas... S'il doit tout ressaisir il va pas être content content ...

    Personne ne connait un moyen de supprimer les avertissements d'access ???

  6. #6
    Membre actif
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 222
    Points
    222
    Par défaut
    Dans ce cas, dans le Unload de ton formulaire du fait tes teste et s'il y a une anomalie de force la propriété Cancel à true dans cette évènement==> la fermeture de ton formulaires est arrétés ==> un setfocus sur le control en erreur permet à l'utilisateur de corriger son anomalie, sans message système, autre que tes avertissements de l'anomalie à ton utilisateur

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 34
    Points : 31
    Points
    31
    Par défaut
    Oui mais je veux que les tests ne soient faits qu'une fois...
    Je suis obligée de tester lors de l'événement BeforeUpdate (raisons expliquées plus haut)
    Et si je re-teste sur Unload, les tests vont être faits 2 fois... agaçant pour l'utilisateur...

    Pourtant ça doit être un cas assez classique d'empêcher la mise à jour d'un enregistrement en cas de saisie non conforme ???

    Peut être une piste, quelqu'un peut il m'expliquer la différence entre :
    placé dans une procédure BeforeUpdate
    et l'instruction
    car au final, ce qui serait bien serait de pouvoir annuler l'événement fermeture à partir de ma procédure beforeUpdate, mais je sais pas si c'est possible...

    Merci...

  8. #8
    Membre actif
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 222
    Points
    222
    Par défaut
    Premiere solution : Interdit dans le before, le bouton annuler et la boutons système (croix) si une anomalie est détectés , rens les actives si pas d'anomalie ==W aucune action n'est à faire dans le Unload puisque ton utilisateur ne pourra sortir qu'apès correction ou annulation des mauvaises saisies.

    Si tu ne veux pas gérer les problèmes de (X) systeme , enlève le pour tout le formulaire , seul un bouton annuler permettra la sortie de ton formulaire.

    autre solution, Si tu force undo dans le Unload . plus d'anomalie systeme ==> perte d'informations si la correction dans Before n'a pas été faites par l'utilisateur ==> tant pis pour lui

    autre solution, tu peux déclarer une variable de niveau formulaire, forcée à true avec l'instruction "docmd.close" dans le cas d'une anomalie ==> le marquage à true de cette variable dans le Unload te permettras de forcer "Cancel" à True , bloquant la sortie du formulaire et proposant la correction à l'utilsateur pour etre autorisé à sortir, sans deux messages d'erreurs


  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 34
    Points : 31
    Points
    31
    Par défaut
    Merci pour toutes ces suggestions. Je me suis presque résolue à utiliser une astuce de ce genre, mais pas tout à fait encore...

    J'ai trouvé ça : mettre la procédure suivante dans l'évènement "sur erreur" du formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Form_Error (DataErr As Integer, Response As Integer)
    Response = DATA_ERRCONTINUE
    End Sub
    (pour info : je l'ai trouvé )

    bon alors là je n'ai plus le message d'erreur, par contre le formulaire se ferme alors que je souhaiterais empêcher sa fermeture et retourner sur le champ qui pose problème... d'autres idées ??? Merci...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 34
    Points : 31
    Points
    31
    Par défaut
    J'y suis presque :

    j'ai donc pris l'option de la variable niveau formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim ValeurAnnul as Integer
    au chargement du formulaire cette variable se voit affecter la valeur 0, et dans ma Sub BeforeUpdate, si l'utilisateur demande l'enregistrement de sa saisie ET qu'une erreur est rencontrée, elle prend la valeur 1.

    J'ai ajouté la procédure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Form_Unload(Cancel As Integer)
    Cancel = ValeurAnnul
    ValeurAnnul = 0 'sinon on ne peut plus le fermer !
    End Sub
    Il faut quand même mettre le code de mon message précédent (Procédure Form_Error) sinon le message d'erreur s'affiche encore

    Toutes ces conditions réunies, j'obtiens ça : pas de message d'erreur, pas de fermeture du formulaire, mais par contre le formulaire est vide !!! Pourquoi ????

  11. #11
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Bonjour,

    je rebondis sur ce sujet de 2008 parce que les recherches fructueuses d'atom41 m'ont permis de résoudre une vieille épine dans le pied !
    Je n'ai jamais pu faire disparaître complètement ces messages, donc, merci, atom (J'espère que tu as résolu le coup de l'écran vide ?)

    Mon problème était légèrement + complexe. Du fait de l'utilisation de plusieurs sous-formulaires imbriqués, l'évènement Form_Error ne signalait rien (que l'erreur de données) et Form_Unload ne se déclenchait apparemment pas !...

    Ce que je retiens de la solution finale : il faut d'abord clairement séparer
    - le formulaire dans lequel se produit l'erreur de donnés, soit dans Control_BeforeUpdate (Cancel), soit form_BeforeUpdate, soit Form_Error (c'était mon cas, avec un contrôle vide - Null non accepté. Voir exemple ci-dessous)
    - le formulaire qui sera fermé si l'utilisateur clique sur la case de fermeture.

    Au final, le code suivant apparaît dans chacun des 2 formulaires :
    - dans le (sous)formulaire qui contient des données (tu pourrais aussi bien avoir un Xxx_BeforeUpdate() avec Cancel = True, mais voici mon cas) :
    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
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
        Select Case DataErr
        Case 3162, 3314  '3162 Vous avez essayé d'affecter la valeur nulle à une variable qui n'est pas de type variant
            '3314 Le champ 'xxx' ne peut pas contenir une valeur nulle car la propiété 'required' pour ce champ est True.  Saisissez une valeur.
            With Me.ActiveControl
                Select Case .Name
                Case "lstN2Action", "lstLibelléAction"
                    MsgBox "Vous devez indiquer une Action.", vbCritical, flapp.Title
                Case "txtDateInsc"
                    MsgBox "Vous devez indiquer la Date de la demande.", vbCritical, flapp.Title
                Case "lstCléStatut3"
                    MsgBox "Vous devez indiquer un Statut, ou (Aucun) s'il n'est pas connu.", vbCritical, flapp.Title
                Case "lstCléService"
                    MsgBox "Vous devez indiquer un Etablissement, ou (Aucun) s'il n'est pas connu.", vbCritical, flapp.Title
                End Select
                If .ControlType = acComboBox Then
                    .Dropdown
                End If
            End With
            Response = acDataErrContinue
        'Case xxxx autres erreurs
        End Select
    End Sub
    - dans le conteneur (l'Access Form) qui sera fermé :
    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
    Option Compare Database
    Option Explicit
    'Set by m_Form_Error 2169, if this form or any of its subforms has a data err
    '    or Control/Form_BeforeUpdate has Cancelled the SaveRecord.
    'Used by Form_Unload to cancel unloading.
    Private m_CancelUnload As Boolean
     
     
    Private Sub m_Form_Error(DataErr As Integer, Response As Integer)
        Select Case DataErr 
        Case 2169
            '2169 "Impossible d'enregistrer cet objet pour 'instant...
            '      Voulez-vous toujours fermer ?" Oui/Non
            'Masquer le message
            Response = acDataErrContinue
            'annuler la fermeture du formulaire
            m_CancelUnload = True
            'TODO: there is an unwanted Subform.Form.Undo (Subform: Form.dirty = False)
            '   - immediately after this Form_Error is exited,
            '   - before Subform_Exit!?!
        End Select
    End Sub
     
    Private Sub m_Form_Unload(Cancel As Integer)
        'see Form_Error 2169 which sets m_CancelUnload
        Cancel = m_CancelUnload
        m_CancelUnload = False
    End Sub
    J'ai noté un mini-bug, à corriger + tard, mais je ne pense pas que d'autres l'aurons aussi : après Form_Error, Access fait un Undo sur le sous-formulaire actif et l'utilisateur perd la valeur de sa dernière saisie, ce qui est quand même gênant. Ça m'intéresse de savoir si d'autres ont vu le même problème (access 2000) ?

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2013
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    J'ai noté un mini-bug, à corriger + tard, mais je ne pense pas que d'autres l'aurons aussi : après Form_Error, Access fait un Undo sur le sous-formulaire actif et l'utilisateur perd la valeur de sa dernière saisie, ce qui est quand même gênant. Ça m'intéresse de savoir si d'autres ont vu le même problème (access 2000) ?
    Bonjour,

    Pour continuer cette discussion ancienne mais récurrente, j'avais le même problème et je l'ai résolu en mettant un sendkeys dans l'événement Form_Error. Le sendkeys simule un clic sur "non" à la question "voulez-vous toujours fermer l'objet base de données", ce qui permet de conserver les données saisies par l'utilisateur.

    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
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
     
    'gérer l'erreur "le moteur ne peut pas trouver d'enregistrement correspondant à la clé"
    'en cas de code APE vide quand tentative fermeture par croix rouge ou par clic droit
    If DataErr = 3101 Then
    Response = acDataErrContinue
     
    Else
    'gérer l'erreur "impossible d'enregistrer... voulez-vous toujours fermer l'objet base de données"
    'en cas de code APE vide quand tentative fermeture par croix rouge ou par clic droit
    'le sendkeys sert à répondre non à la question, sinon access fait de lui-même un undo...
    If DataErr = 2169 Then
    SendKeys "{ENTER}", False
     
    Else
    'autres erreurs : conserver le message d'access
    Response = acDataErrDisplay
     
    End If
    End If
     
    End Sub
    Espérant que cela sera utile,
    Une très bonne année au forum !

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/02/2008, 14h12
  2. Message d'erreur sur un formulaire de recherche
    Par FCL31 dans le forum Modélisation
    Réponses: 1
    Dernier message: 17/08/2007, 15h02
  3. Réponses: 4
    Dernier message: 24/08/2006, 10h19
  4. message d'erreur dans sous formulaire
    Par tojiji dans le forum Access
    Réponses: 6
    Dernier message: 28/07/2006, 12h09
  5. message lors de fermeture de formulaire
    Par Sebastien_INR59 dans le forum IHM
    Réponses: 1
    Dernier message: 09/06/2006, 08h58

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