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 :

Pb d' AfterUpdate et de click [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2022
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2022
    Messages : 115
    Points : 60
    Points
    60
    Par défaut Pb d' AfterUpdate et de click
    Bonjour

    J'ai un petit problème :

    Je remplis un champ et je lance une action sur AfterUpdate
    J'ai un bouton à coté du champ qui lance la même action sur click

    Le pb est, bien sûr, que quand on clique sur le bouton, on quitte aussi le champ et donc se produit un évènement AfterUpdate

    L'action se déroule 2 fois

    Je voudrais que quand on clique sur le bouton, l'action AfterUpdate du champ ne se déclenche pas

    J'ai fait une tonne d'essais avec les différents évènements _UpDate, _Focus...
    Rien à faire : l' évènement _Update du champ passe toujours avant le _click du bouton !

    Quelqu'un aurait une idée ?

    Merci, cordialement

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Intéressant comme problème.

    Une solution serait de mettre une variable de module et de la tester au moment de l'exécution.

    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim m_IsDone as boolean
    quand tu entres dans le champ de saisie tu fais un truc du genre
    quand tu gères le afterupdate tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    call TonAction()
    m_IsDone=True
    dans TonAction() tu fais un test.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if not m_IsDone then
        'Ici le code qui fait quelque chose
    end if
    Le point délicat ça va être quand tu vas vouloir déclencher ton action SANS entrer dans le champ de saisie.
    Une idée serait de mettre m_IsDone=False dans l'événement OnCurrent qui se déclenche quand tu arrives sur un enregistrement.

    Il y a peut-être une possibilité de savoir quel était le contrôle actif précédemment mais cela ne te garantira pas que l'action a été éxécutée.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Une autre possibilité serait de savoir si l'action a déjà été exécuté en fonction des données présentes.

    Un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if MonChamp<>123 then
       'L'action n'a pas été éxécutée donc la faire
    end if
    Ça te blinderai contre toute exécution non souhaitée d'où que provienne la demande d'éxécution.
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2022
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2022
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Merci Marot_r

    Lire ta proposition m' a fait comprendre que je prenais le pb à l'envers !

    Si on ne peut (ou très difficilement) empêcher l' _AfterUpdate de se produire avant le _click, on va empêcher le _click de se produire si le _AfterUpdate s'est déjà produit !

    mon action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Function OuvFormGEN()
     
    DoCmd.OpenForm "FormGen", , , "affectation like [forms]![formconsultGEN]![Affectation2f]"
     
    If Forms!formgen.Recordset.RecordCount = 0 Then
     
        DoCmd.Close
        MsgBox "Aucune correspondance trouvée", vbOKOnly, "Echec!"    
     
     End If
     
    End Function
    Je crée un champ temporaire (et invisible) sur le formulaire : temp4
    J'y mets "clic" dans l' évènement _AfterUpdate !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Affectation2F_AfterUpdate()
     
        Me.Temp4 = "clic"    
        Call OuvFormGEN
     
    End Sub
    Si temp4="clic", c'est que l' _AfterUpdate du champ s'est déjà produit : cliquer sur le bouton ne fait ........rien !
    et je remets à "" temp4 pour la prochaine fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub BoutAffect_Click()
     
    If Me.Temp4 = "clic" Then
        Me.Temp4 = ""
        Exit Sub
    End If
     
    Call OuvFormGEN
     
    End Sub
    Y a surement plus élégant, mais ça va faire partie des "mais pourquoi n'y ai-je pas pensé avant" !

    Je ne sais pas si j'ai fait tous les essais nécessaires, mais ça a l'air de marcher

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2022
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2022
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Bon, ça ne fonctionne pas dans 100% des cas.... je re-cogite.....

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    C'est en gros la même idée que la mienne mais avec un champ.
    Comme je l'ai dit c'est probablement l'initialisation de ton champ qui doit poser un problème donc je mettrai

    Dans OnCurrentA+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 870
    Points : 3 449
    Points
    3 449
    Par défaut
    Bonjour nemog, marot_r,

    Je me pose une question de conception, l'événement "AfterUpdate" se produit inévitablement si on ajoute ou modifie des informations dans un champ. Quel est l'utilité d'un bouton de commande qui va déclencher le même code que le "AfterUpdate". L'existence de ce bouton me semble inutile.

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  8. #8
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2022
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2022
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Bonjour Robert,

    Le bouton est là pour offrir à l'utilisateur la possibilité d 'utiliser TAB, Entrée ou le bouton
    De plus, si on ouvre le formGen (résultat du code) et qu'on revient au formulaire de recherche, on peut re-cliquer sur le bouton pour rouvrir le formulaire de résultat,
    pas besoin de toucher à ce qui est déjà inscrit dans le champ pour declencher un _AfterUpdate

    Je reprends tout à 0 en me faisant un tableau des évènements
    A suivre...

  9. #9
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 870
    Points : 3 449
    Points
    3 449
    Par défaut
    Bonjour nemog

    Si le bouton est important, alors vous n'avez qu'a lancer la procédure du bouton après la mise à jour du champ un peu comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub btnImportant_Click()
    'Le code déjà existant
    End Sub
     
    Private Sub LeChampMaJ_AfterUpdate()
        btnImportant_Click
    End sub
    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  10. #10
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2022
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2022
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Merci Robert,

    Je viens d' essayer votre code, mais le problème reste entier
    Quand on clique sur le bouton, on quitte le champ et l' action se produit 2 fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Affectation2F_AfterUpdate()
     
    BoutAffect_Click
     
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub BoutAffect_Click()
     
     
    If IsNull(Me.Affectation2F) Then
        MsgBox "Le champ Affectation est vide.", vbOKOnly, "Erreur"
        Exit Sub
    End If
     
       Call OuvFormGEN
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Function OuvFormGEN()
     
    DoCmd.OpenForm "FormGen", , , "affectation like [forms]![formconsultGEN]![Affectation2f]"
     
    If Forms!formgen.Recordset.RecordCount = 0 Then
     
        DoCmd.Close
        MsgBox "Aucune correspondance trouvée", vbOKOnly, "Echec!"
     
    End If
     
    End Function

  11. #11
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Bonjour,

    Vu qu'il s'agit de l'ouverture d'un formulaire tu peux tester si il est déjà ouvert et ne pas le refaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CurrentProject.AllForms("nom du formulaire").IsLoaded then exit sub
    Cette méthode n'est applicable qu'à ce cas.

    Pour une méthode plus généraliste il ne faut pas la conditionner au résultat.
    Intervenir sur l'action en la conditionnant au contrôle actif précédent peut être une autre approche du problème.

    Exemple :
    Dans le code du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Screen.PreviousControl.name = "nom du controle" then exit sub
    A voir en condition d'utilisation.

    Cordialement,
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  12. #12
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2022
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2022
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Merci Loufab,

    J'ai adapté ta proposition à celle Robert (en espérant avoir tout compris) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Affectation2F_AfterUpdate()
     
    BoutAffect_Click
     
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub BoutAffect_Click()
     
    If IsNull(Me.Affectation2F) Then
        MsgBox "Le champ Affectation est vide.", vbOKOnly, "Erreur"
        Exit Sub
    End If
     
    If Screen.PreviousControl.Name = "Affectation2F" Then Exit Sub
     
       Call OuvFormGEN
     
    End Sub
    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 Function OuvFormGEN()
     
    If CurrentProject.AllForms("FormGen").IsLoaded Then Exit Function
     
    DoCmd.OpenForm "FormGen", , , "affectation like [forms]![formconsultGEN]![Affectation2f]"
     
    If Forms!formgen.Recordset.RecordCount = 0 Then
     
        DoCmd.Close
        MsgBox "Aucune correspondance trouvée", vbOKOnly, "Echec!"
     
    End If
     
    End Function
    On y est presque, mais le "screen.previous...." provoque une erreur 2467 "L'expression entrée fait référence à un objet fermé"
    quand on fait une recherche fructueuse par le bouton et une re-demande par le bouton.

    Autrement dit :
    - je saisis ma valeur dans le champ
    - je clique sur le bouton de recherche
    - Le formulaire de résultat s'ouvre
    - je ferme ce formulaire avec un bouton CloseForm
    - je rappuie sur le bouton de recherche
    - erreur 2467

    Ce qui est "normal", je pense, puisqu' à ce moment-là le "PreviousControl" est un élément du Form de résultat (champ qui avait le focus avant appui sur le bouton CloseForm ?)

  13. #13
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2022
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2022
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Bon, je pense avoir la solution en adaptant encore le code précédant

    Il y avait un autre problème :
    Après une recherche par le bouton, rappuyer sur le bouton ne faisait plus rien
    Si j'ai bien compris, appuyer sur le bouton ne rend pas celui-ci ActiveControl et donc pas PreviousControl quand on rappuie dessus
    Donc le PreviousControl est toujours le champ "Affectation2F" et le "Screen.Previous...." annule l'action à partir du 2e appui.

    J'ai ajouté l'évènement _Change sur le champ pour faire la différence entre
    - je suis ActiveControl parce que je l'étais déjà -> je change de champ pour ne plus devenir le PreviousControl qui annule l'action.
    - je suis ActiveControl parce que j'ai modifié le contenu du champ -> procédure normale.

    J'ai aussi ajouté un "On error goto.." pour pallier à l' erreur 2467 (bof)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Affectation2F_Change()
     
    Me.Temp4 = "1"  ' l'action va être provoquée par le _AfterUpdate
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Affectation2F_AfterUpdate()
     
    BoutAffect_Click
     
    End Sub

    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
    Private Sub BoutAffect_Click()
     
     
    If IsNull(Me.Affectation2F) Then
        MsgBox "Le champ Affectation est vide.", vbOKOnly, "Erreur"
        Exit Sub
    End If
     
    On Error GoTo suite
     
    If Screen.PreviousControl.Name = "Affectation2F" And Me.Temp4 = "1" Then
        Me.Temp4 = "0"
        Exit Sub
    End If
     
    If Screen.PreviousControl.Name = "Affectation2F" And Me.Temp4 = "0" Then
        Me.Libelle2F.SetFocus
        GoTo suite
    End If
     
     
    suite:
       Call OuvFormGEN
     
    End Sub
    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
    Private Function OuvFormGEN()
     
     
    If CurrentProject.AllForms("FormGen").IsLoaded Then Exit Function
     
    DoCmd.OpenForm "FormGen", , , "affectation like [forms]![formconsultGEN]![Affectation2f]"
     
    If Forms!formgen.Recordset.RecordCount = 0 Then
     
        DoCmd.Close
        MsgBox "Aucune correspondance trouvée", vbOKOnly, "Echec!"
     
    End If
     
     
    End Function

  14. #14
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2022
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2022
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Après avoir réalisé une bonne série de tests, c'est concluant ! ça me convient

    Merci à Marot_r,Robert et Loufab, vos propositions m'ont permis d' aller plus loin (et surtout efficacement) dans ma réflexion

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

Discussions similaires

  1. [C#] Simuler un Click souris
    Par helmout dans le forum Windows Forms
    Réponses: 13
    Dernier message: 13/12/2007, 01h59
  2. [C#] Gestion du click apres le Page_Load
    Par ludo0 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/05/2004, 17h01
  3. [AppMessage] Comment empêcher un click de la souris ?
    Par altahir007 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/10/2003, 14h28
  4. Modifier l'icone d'un TTreeNode sur click
    Par ramseb dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/08/2003, 13h55
  5. [Kylix] Simluler des click souris
    Par paci dans le forum EDI
    Réponses: 2
    Dernier message: 24/06/2003, 11h23

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