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

Access Discussion :

Fermer un formulaire sans sauvegarder les modifications


Sujet :

Access

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 41
    Par défaut Fermer un formulaire sans sauvegarder les modifications
    Bonjour,

    J'ai creer un formulaire d'insertion de données. Lorsque j'ai completé le formulaire et que je clique en bas de celui-ci sur le petit bouton avec la fleche et l'étoile, mes données sont corectement insérées. Jusqu'ici tout vas bien. Mais si je ne veux finnalement pas entrer de données et que je ferme le formulaire (avec la croix) il essaye quand même d'inserer des données. Comment désactiver ceci ?

    Merci à tous

  2. #2
    Membre Expert
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Par défaut
    La FAQ explique comment fermer un formulaire sans enregistrer l'enregistrement en cours, j'espere que ca t'aidera.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 41
    Par défaut
    J'ai trouvé ceci dans la fac :

    'variable stockant la réponse donnée dans la boite de dialogue
    Dim intReponse As Integer
    'si il y a eu des modifications on demande la confirmation
    If Me.Dirty Then
    'message pour l'utilisateur
    intReponse = MsgBox("Voulez-vous enregistrer ?", vbYesNoCancel, "Confirmation")
    Select Case intReponse
    Case vbYes
    ' oui est choisit, on ne fait rien puisque le
    ' comportement par defaut de Access est d'enregistrer.
    Case vbNo
    ' non est choisit donc on annule les modification
    Me.Undo
    Case vbCancel
    ' Annuler est choisit donc on annule la manipulation
    Cancel = True
    End Select
    End If


    Le problème c'est que j'ai un sous formulaire dans mon sous formualire, et donc si je mets ce code dans "Avant MAJ" dès que je quiite le SF la procédure s'applique. N'y a t-il pas un autre moyen ? Y a pas ca dans une des nombreuses options ?

  4. #4
    Membre éclairé Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Par défaut
    Bonjour ...

    Voici comment j'ai fait :

    1) Création d'un bouton pour quitter le formulaire (bouton fermer de base)

    2) Création d'une fonction qui demande à l'utilisateur : Voulez-vous enregistrez ? Les 3 réponses possibles sont : OUI / NON / ANNULER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str_ReponseEnregistrement = MsgBox("Voulez-vous enregistrer ?", vbYesNoCancel)
    Pour le cas de NON donc 7 voici ce que j'ai mis comme code ...
    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
    If str_ReponseEnregistrement = 7 Then
        
        If ((str_NomForm = "FRM_controle_des_poids_entree_matiere_AJOUT") Or _
        (str_NomForm = "FRM_controle_des_poids_sortie_matiere_AJOUT") Or _
        (str_NomForm = "FRM_controle_des_poids_transfert_matiere_AJOUT")) Then
        
            str_RetourFonction = "7"
                 
            fn_demandeEnregistrement = str_RetourFonction
           
        Else
           
            str_RetourFonction = "7"
             
            Forms(str_NomForm).Undo
            
            fn_demandeEnregistrement = str_RetourFonction
    
        End If
        
    End If
    3) Ensuite je revoie la réponse de ma fonction dans ma procédure sub btn_CLICK()

    4) Ensuite dans ma fonction principal sub, je teste les réponse que j'ai eu ... dans le cas de NON, voici le code que j'ai mit :

    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
    'REPONSE = NON
        If (str_ReponseFonctionEnregistrement = "7") Then
        'Si on ne doit pas enregistrer, il faut supprimer le mouvement c'est à dire qu'il faut le
        'supprimer dans la table TB_MOUVEMENTS, puis TB_DETAILS, puis TB_DESTINATIONS.
     
        'Fermeture du formulaire
            DoCmd.Close
     
        'Appel de la fonction qui permet la suppression du mouvement dans sa totalité
            fn_SuppressionEnCascade var_Provenance, var_PkMouvement, str_NomFormulaire, str_NomSousFormulaire
     
        'Suppression de la description si une nouvelle description a été ajoutée
            fn_suppression_description
     
        End If

    et pour finir, dans la fonction fn_SuppressionEnCascade je supprime à l'aide de recordset dans ma table l'enregistrement qui est dans mon formulaire principal à l'aide d'envoie de paramètre pour ne pas supprimer le mauvais ...

    J'espère que j'ai pu t'aider ... et si ce n'est pas très très clair, n'hésite pas à me demander des précisions ...

    Bonne journée ...

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    Bonjour,

    Le problème avec Access est que l'on ne peut pas différencier les 2 raisons principales du déclenchement de l'évènement before_update :
    1. l'utilisateur ferme le formulaire => entraine la raison n°2
    2. l'enregistrement en cours de modification ou le nouvel enregistrement perd le focus (par passage à un autre enr. par exemple).
    Alors soit on gère le before_update (cf FAC) soit on ne le gère pas.

    Si on ne gère pas before_update et on a défini dans la table en cours qu'un champ ne doit pas être null ou vide par exemple :

    Ceci entraine une erreur dans le formulaire. Pour passer outre cette erreur, il faut laisser "couler" l'erreur jusqu'au formulaire principal dans les sub <form_error>

    Par exemple, dans le sous-formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
       If DataErr = 3314 Then 'Le champs ne peut contenir de valeur null
          Response = acDataErrContinue
       elseIf DataErr = 3315 Then 'Le champs ne peut contenir de chaine vide
          Response = acDataErrContinue
       endif
    End Sub
    Et dans le formulaire principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
       If DataErr = 2169 Then 'Impossible d'enregistrer pour l'instant
          Response = acDataErrContinue
       endif
    End Sub
    En faisant ça, on perd les dernières modifications ou saisies de l'utilisateur...

    Comment Savoir si le before_update est déclenché par la fermeture du formulaire.

    1. Créer son propre bouton de fermeture et désactiver celui d'access
    2. Ou Intercepter l'évènement de fermeture :
    Il faut donc intercepter le message WM_CLOSE (ou WM_NCLBUTTONDOWN et wparam = 20 ?)

    On ne peut pas le faire sous Access, il faut donc créer un Dll qui intercepte le message et nous le renvoi sous access.

    Une bonne base de départ pour intercepter des évènements est http://arkham46.developpez.com/artic...ss/mousewheel/

    On sait ainsi si l'utilisateur a cliqué sur close avant le déclenchement de before_update.

    Inconvénient : Dll à lier, ralentissement de la gestion des messages, risques de problèmes supplémentaires, utilisation de fonctions bas niveau...

    J'attend vos réactions...

    Philippe

  6. #6
    Membre éclairé Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Par défaut
    philben à dit :

    J'attend vos réactions...
    Perso je n'ai qu'une chose à dire : BRAVO ... et moi je et je peux (sortir) ...


    Sur ceci :
    Comment Savoir si le before_update est déclenché par la fermeture du formulaire.
    1. Créer son propre bouton de fermeture et désactiver celui d'access
    2. Ou Intercepter l'évènement de fermeture :
    Il faut donc intercepter le message WM_CLOSE (ou WM_NCLBUTTONDOWN et wparam = 20 ?)

    On ne peut pas le faire sous Access, il faut donc créer un Dll qui intercepte le message et nous le renvoi sous access.

    Une bonne base de départ pour intercepter des évènements est http://arkham46.developpez.com/artic...ss/mousewheel/

    On sait ainsi si l'utilisateur a cliqué sur close avant le déclenchement de before_update.
    je n'ai rien à dire ta définition est parfaite ... et je ne savais pas que l'on pouvait faire cela ... ... j'ai bien fait de me connecter ce matin j'ai appris quelque chose de fort intéressant ...

    Merci philben ... ....

    A tout bientôt ...

    et : +10000000000

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    Bonjour,

    Merci Snoopy69 pour tes commentaires.

    Les premiers tests réalisés d'interception du message de fermeture sont Ok.

    Après validation, je partagerai le code source.

    Amicalement,

    Philippe

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/07/2010, 09h45
  2. Fermer un workbook sans enregistrer les modifications via jScript
    Par titouille dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/01/2009, 16h47
  3. ouvrir et fermer un fichier excel en sauvegardant les modifications.
    Par decoalaa dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 17/10/2008, 16h37
  4. Réponses: 2
    Dernier message: 11/10/2008, 19h05
  5. Réponses: 3
    Dernier message: 15/12/2005, 10h44

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