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 :

annuler un enregistrement


Sujet :

Access

  1. #1
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut annuler un enregistrement
    bonjour,

    j'ai un formulaire, et un sous formulaire.
    dans le sous formulaire je peut saisir des nouveaux enregistrements, à la fin de chaque saisi j'ai un bouton qui permet de lancer un rafraichissement de données dans d'autres sous formulaires.

    mon probleme est que si l'utilisateur commence à saisir un truc dans un controle, et sort du sousformuaire, sans le savoir il crée un enregistrement.

    je voudrais eviter ça.
    je voulais annuler la sauvegarde de l'enregistrement mais je n'y parvient pas avec la fonction Undo.

    sinon il est possible aussi de passer par des controles independants et sur l'appui bouton sauvegarder les données dans la tables, mais je ne connais pas les commandes VBA pour ecrire dans une table.

    quelle est la meilleure solution, et comment la réaliser?

    merci d'avance pour votre aide et vos conseil.
    a+

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    sinon il est possible aussi de passer par des controles independants et sur l'appui bouton sauvegarder les données dans la tables, mais je ne connais pas les commandes VBA pour ecrire dans une table.
    dans le bouton "Enregistrer", tu mets une requete d'ajout.

  3. #3
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    merci,
    tu pense que c'est la meilleure solution?
    a+

  4. #4
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    petite question:

    dans la requete d'ajout je vois bien comment je fais le début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO table ( [champ1], [champ2], ... )
    mais je ne trouve pas comment lui attribuer le resultat de mes champs indépendant en fait.

    ça doit surement etre tous bête, mais aujourd'hui je fatigue un peu.

    pouvez-vous m'aider s'il vous plait?

    merci d'avance
    a+

  5. #5
    Membre Expert
    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
    Par défaut
    Bonjour,

    Citation Envoyé par moicats
    mon probleme est que si l'utilisateur commence à saisir un truc dans un controle, et sort du sousformuaire, sans le savoir il crée un enregistrement.

    je voudrais eviter ça.
    Dès que l'utilisateur sort du sous-formulaire, si celui-ci est modifié (ce que tu peux tester par la propriété NomSousFormulaire.Form.Dirty), l'évènement Form_BeforeUpdate est déclenché.

    Essaye déjà de mettre une simple demande de confirmation dans cet évènement. Dans le sous-formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        If MsgBox ("Est-ce que vous confirmez la saisie ?", vbYesNo+vbQuestion, "Titre application") = vbNo Then
            Cancel = True
        End If
    End Sub
    Ca te convient ?

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    moi c est ce que j ai fait, c est pas super complique et ca marche...

    mais la premiere solution est faisable aussi.
    tu mets un truc du style
    DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
    mais je ne sais pas ou

  7. #7
    Membre Expert
    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
    Par défaut
    Merci, tamerlan, mais c'est l'équivalent menu de la commande Undo dont parle moicats.
    Il est plus simple de mettre Me.Undo dans le code du formulaire, et c'est plus précis que la commande du menu (DoCmd... "défait" le formulaire actif, pas forcément celui que tu veux).
    Tu devrais pouvoir (à tester) mettre cette commande dans le même évènement (Form_BeforeUpdate), mais comment savoir si il faut enregistrer les modifications ou pas ?
    Attendons les réactions de moicats pour voir la suite...

  8. #8
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    merci à tout les deux,

    en fait je fait un mixe des deux derniere proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_BeforeUpdate(Cancel As Integer)
     If MsgBox("Voulez-vous terminer la saisie ?", vbYesNo + vbQuestion, "Titre application") = vbNo Then
       DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
     Else
       Cancel = True
     End If
    End Sub
    de cette façon si l'utilisation quitte le sous formulaire il doit repondre à la question si il dit "non" je n'enregistre pas les données, je passe à autre chose, s'il dit "oui" je l'oblige à rester dans le sous formulaire.

    il me reste un petit soucis, en fait quand je click sur mon bouton il déclanche également la Msgbox, et bloque le fonctionnement normal du bouton.

    sous quel autre evenement puis-je mettre le code.

    merci, a+

  9. #9
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    a moins qu'il y ai une posibilité d'identifier que j'ai clické sur le bouton pour eviter de lancer le msg.
    du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if click-bouton then
    exit sub
    else
    if msgbox...
     
    endif
    vous voyez où est mon problème?
    y a t il une solution?

    merci d'avance
    a+

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    tu déclare une variable de type boolen visible par tout ton formulaire
    dans la procedure click-bouton tu mets à vrai la variable et de cefait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     <div style="text-align: left;">if taVariable = true then
    exit sub
    else
    if msgbox...
     
    endif</div>
    c est un exemple

  11. #11
    Membre Expert
    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
    Par défaut
    2 choses :
    1- j'insiste lourdement : il vaut mieux mettre Me.Undo, plutôt que la commande Docmd... (voir plus haut)

    2- pour ton bouton :
    - si le bouton est en dehors du sous formulaire, l'évènement Form_BeforeUpdate se déclenche avant l'évènement bouton_click.
    D'ailleurs, si tu mets "Cancel = true" dans Form_BeforeUpdate, l'évènement click du bouton n'aura jamais lieu.
    Pour cela, il faut bien comprendre que l'évènement BeforeUpdate se produit dès que tu sors du sous-formulaire, quel que soit l'objet ou le contrôle sur lequel tu as cliqué.

    Je te conseille donc,
    - soit, ne mettre aucun bouton : dès que l'utilisateur clique dehors, ou passe à un autre enregistrement... la question sera posée,
    - soit de mettre ton bouton dans le sous-formulaire.

    Enfin, je viens de passer un an à mettre au point une appli sécurisée
    En bref, saisie par 3 boutons Ajouter/Modifier/Supprimer au dessus de chaque (sous)formulaire + 2 boutons Valider/Annuler, dans chaque (sous)formulaire.
    Cela pose de très nombreux problèmes complexes auxquels je ne m'attendais pas du tout, mais on en reparlera peut être dans un ou des articles.
    Donc, attention à ne pas aller trop loin : il m'a fallu plus de 3 mois à plein temps, rien que pour déboguer et "stabiliser" la saisie dans cette application !

  12. #12
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    bien,

    j'ai mis me.undo dans le code, ça fonctionne toujours pareil.

    mon bouton est dans mon sous formulaire mais j'ai l'impression que mes deux code se lance simultanement.

    est ce normal?

    pour mieux comprendre voila mon code bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub new_enr_Click()
    On Error GoTo Err_new_enr_Click
     
        DoCmd.GoToRecord , , acNewRec
    Forms![echanges fournisseursXX]![Fille26].Requery
    Forms![echanges fournisseursXX]![Fille27].Requery
     
    Exit_new_enr_Click:
        Exit Sub
    Err_new_enr_Click:
        MsgBox Err.Description
        Resume Exit_new_enr_Click
     
    End Sub
    voila peut etre y a t il quelque chose d'incompatible entre les deux code je sais pas, là je suis un peu perdu

    merci de votre aide
    a+

  13. #13
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    on fini toujours par y arrivé, mais on sais pas toujours comment.

    sans rire, merci beaucoup de votre aide, visiblement ça fonctionne.
    donc pour ceux qui peuvent etre dans le même genre de cas je résume

    un formulaire avec un sous formulaire saisi d'enregistrement, un bouton de validation. en cas de sortie du formulaire sans validation, une demande de confirmation et une annulation de la saisi.

    code du bouton:
    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
    Private Sub new_enr_Click()
    On Error GoTo Err_new_enr_Click
    'indique dans le ss formulaire l'appui bouton
    Me!test_bp.Value = 1
    'action du bouton
      'affichage nouvel enregistrement
        DoCmd.GoToRecord , , acNewRec
     
      'mise a jour d'autre sous formulaire
    Forms![echanges fournisseursXX]![Fille26].Requery
    Forms![echanges fournisseursXX]![Fille27].Requery
    'remise à 0 de l'indic d'action bouton
    Me!test_bp.Value = 0
    Exit_new_enr_Click:
        Exit Sub
    Err_new_enr_Click:
        MsgBox Err.Description
        Resume Exit_new_enr_Click
     
    End Sub
    code sur sortie sous-formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    'si action bouton on ne fait rien
     If Not (Me!test_bp.Value = 1) Then
     'affichage Msgbox test
       If MsgBox("Voulez-vous terminer la saisie ?" & Chr(13) + Chr(10) & "(si elle est terminée validez-la)"
    , vbYesNo + vbQuestion, "Titre application") = vbNo Then
        'si Non annule enregistrement
        Me.Undo
       Else
        'si oui bloque l'utilisateur dans ss formulaire
        Cancel = True
       End If
     End If
    End Sub
    voila pour l'instant ça marche, on va voir à l'usure.

    encore merci et a+

  14. #14
    Membre Expert
    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
    Par défaut

    Ceci dit, 2 remarques :
    1- plutôt que d'utiliser un contrôle (test_bp), ce qui est lourd pour Access, pourquoi ne pas mettre une variable au niveau du module
    - déclaration en tête du module : Dim mTests_bp as boolean (commençant par m, comme toutes variables de Module)
    - tu peux ensuite la mettre True, puis False dans new_enr_Click()
    - tu peux tester If mTests_bp Then... dans Form_BeforeUpdate()

    2-est-ce qu'il ne suffirait pas faire tes 2 .Requery avant le Docmd.GotoRecord pour éviter de déclencher un évènement BeforeUpdate ? (à tester)
    Si ça marche, tu n'as même plus besoin de la variable , et surtout ne pas oublier de mettre un commentaire en clair dans le code pour être sûr que tu ne vas pas réinverser les lignes de commande dans 6 mois !!

  15. #15
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    bonjour,

    merci Papy Turbo.

    j'ai esseyé de mettre le .Requery avant le Docmd.GotoRecord, mais ça ne marche pas mieux.

    quant à la premiére solution que tu me propose pour eviter le contrôle, ça ne fonctionne pas, ça me fait un défaut "erreur de compilation: variable non défini" dans le code Form_BeforeUpdate().
    y a peut etre une autre déclaration à faire, je n'ai jamais utilisé de variable entre deux codes. le fait que ce soit des codes private a t il une importance?

    encore merci,
    a+

  16. #16
    Membre Expert
    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
    Par défaut
    Pour le déclenchement, faudra chercher encore ?

    Par contre, pour la variable, c'est clair : VBA ne trouve pas la déclaration.
    Il faut (voir + haut) que tu la mettes en tête du module, pour qu'elle soit visible par toutes les procédures du module, c'est à dire au dessus de la première Sub ou Fonction.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Option Compare Database
    Option Explicit
     
    Dim mTests_bp as Boolean
     
    Private Sub new_enr_Click()


  17. #17
    Membre éclairé Avatar de moicats
    Inscrit en
    Mars 2006
    Messages
    299
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 299
    Par défaut
    bonjour,

    encore merci pour votre aide, ça fonctionne bien.
    et le système avec la variable VBA simplifie nettement mon formulaire et evite que quelqu'un efface le champs en pensant qu'il ne sert à rien.

    encore merci, a+

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

Discussions similaires

  1. Annuler l'enregistrement d'un classeur
    Par devdev dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 19/03/2009, 16h15
  2. "annuler" de "enregistrer sous"
    Par la belette dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 05/06/2008, 17h10
  3. Annulation d'enregistrements provenant de sous fonctions
    Par matmuth dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 08/08/2007, 08h52
  4. Comment annuler un enregistrement ?
    Par jeanbonbeurre dans le forum Access
    Réponses: 4
    Dernier message: 05/12/2006, 17h18
  5. annulation d'enregistrement
    Par Yves2507 dans le forum Access
    Réponses: 2
    Dernier message: 23/11/2005, 22h34

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