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 :

Mise à jour sous-formulaire sur onglet


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut Mise à jour sous-formulaire sur onglet
    Bonjour,

    Je me casse les dents sur ce qui suit:
    Un formulaire principal "FrmGénéralMission" contient un onglet "Factures" sur lequel est intégré un sous-formulaire "FrmFacturesListe" (qui liste chacune des factures de la mission concernée).
    J'ai aussi intégré un bouton qui me permet d'ouvrir un autre formulaire "FrmFacture" pour ajouter une facture qui apparaît, après rédaction, sur "FrmFacturesListe".
    Sur double click d'une ligne (représentant une facture) de "FrmFacturesListe", j'ouvre la facture concernée (préalablement établie).
    Si je modifie cette facture et que je la ferme, le sous-formulaire "FrmFacturesListe" ne se met pas à jour. Refresh et Requery ne fonctionne pas.

    Ce type de question a déjà été posé mais je ne vois pas la solution. Existe-t-il une méthode particulière pour mettre à jour un sous-formulaire placé sur un onglet d'un formulaire principal?

    Merci de votre attention et de votre expérience.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me!TON_SOUSFORMULAIRE.Form.RecordSource = TA_REQUETE
    après mise à jour de la facture

    TON_SOUSFORMULAIRE étant le nom de ton sous-formulaire
    et TA_REQUETE étant la source de données de ton formulaire

  3. #3
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 550
    Points
    24 550
    Par défaut
    Bonjour,

    Si le requery ne fonctionne pas c'est bien souvent qu'il est fait avant que la modification soit effective. (ou qu'il n'est pas fait sur le bon controle).

    Quand fais-tu le requery ?

    En principe il faut attendre que le formulaire de saisie/modif soit fermé pour le faire.

    J'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Do
           DoEvents
        Loop While forms.NomForm.Visible
        ' ici on met le requery
    ou NomForm est le formulaire de saisie.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Bonjour,
    Tenant compte de vos remarques, voici le code que j'ai inséré dans le sous-formulaire "FrmFacturesListe"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Form_Activate()
    Do
        DoEvents
        Loop While Forms.FrmFacture.Visible
        Forms!FrmGénéralMission!FrmFacturesListe.Requery
    End Sub
    J'ai aussi tenté de placer le code "sur perte focus" du formulaire de saisie "FrmFacture". Aucun résultat!
    Je ne suis sans doute pas sur le bon chemin...

  5. #5
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 550
    Points
    24 550
    Par défaut
    Ce code doit être placé sur le l'événement qui ouvre le formulaire de saisie.

    Exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Docmd.openform "frmFacture"
    ' ici il attend la fermeture pour continuer
    Do
        DoEvents
    Loop While Forms.FrmFacture.Visible
    ' la fermeture à eu lieu on continu
    'Forms!FrmGénéralMission!FrmFacturesListe.Requery  (cette ligne ne veut rien dire, ce n'est pas la bonne syntaxe !)
    Pour faire un requery d'abord il faut savoir d'ou on fait l'appel. Si c'est du Sousform on utilise :

    Si c'est du formulaire principal on fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.frmFacturesListe.Form.requery
    Merci de regarder le tuto sur les appels formulaires. Nous créons ces tutos pour les devnautes, consultez-les !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Grand merci loufab. Ca fonctionne sans le "Loop While" qui provoquait une erreur.
    Dans le même ordre d'idée et bien que je passe des heures sur les tutos, je coince encore sur ce qui suit:
    Le sous-formulaire "FrmFacturesListe" est mis à jour dès que je quitte "FrmFacture". Je me suis dit que l'autre sous-formulaire "SfrmFacturesValidesTotal" présent sur le même onglet et qui fait la somme des montants des factures valides (case à cocher pour dire si une facture est valide) pouvait être mis à jour également en ajoutant après La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.SfrmFacturesValidesTotal.Form.Requery
    Pas de bol. Ca n'est pas correct. J'ai vraiment du mal avec les appels aux formulaires...
    J'ai aussi essayé en débutant par mais c'est toujous faux...
    Peux-tu encore me venir en aide?

  7. #7
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 550
    Points
    24 550
    Par défaut
    Désolé je me suis axé sur le problème de mise à jour et j'ai oublié la totalité du code. Il faut mettre cette ligne juste avant.

    Pour ton deuxième problème :

    Tu ne dois pas utiliser la bonne syntaxe par rapport à l'endroit ou tu te trouve.

    As-tu téléchargé le tableau PDF des appels ? Il aide à la compréhension de "lieu" par rapport à la syntaxe.

    En règle générale : (xxxx étant la méthode, propriété ou controle)
    Si tu fais l'appel pour une action dans le formulaire courant (form ou sous form quelque soit le niveau d'imbrication).

    Si tu fais l'appel d'un autre form dans l'entité courante :
    Action dans le sousform 1er niveau, appel dans le form principal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.nom_du_sous_form.Form.xxxx
    Action dans le form, appel depuis le sousform1 (1er niveau)

    représent TOUJOURS el formulaire courant, que celui-ci soit le principal ou de Xème niveau.

    Si tu ne sais pas ou tu es, exécute cette ligne dans la procédure.

    De plus :

    Me. remplace le tandem Forms.Nom_du_form. ou encore Form_nom_du_form.

    Note que dans la troisième syntaxe est un préfixe à ajouter au nom du formulaire.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Je joins une copie d'écran pour être plus clair.

    J'ai été voir ton tableau pour les appels des formulaires mais je ne trouve pas la solution.
    Formulaire principal = FrmGénéralMission
    1er sous-formulaire = FrmFacturesListe
    2ème sous-formulaire = FrmFacturesValidesTotal

    Un dbl click sur NumFacture ouvre la facture (FrmFacture). Lorsque je modifie FrmFacture, FrmFacturesListe est bien mis à jour grâce à ton aide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub NumFacture_DblClick(Cancel As Integer)
     
    On Error Resume Next
        Dim StrFiltreOpération As Integer
        StrFiltreOpération = IdOpération
         DoCmd.OpenForm "frmFacture", acNormal, , "[IdOpération]=" & StrFiltreOpération, , acDialog
        Do
          DoEvents
          Loop While Forms.FrmFacture.Visible
          Me.Requery
     
    End Sub
    Pour mettre à jour FrmFacturesValidesTotal, j'ai tenté de faire un requery sur les événements "Sur changement" et "Après MAJ" du formulaire FrmFacturesListe. Sans résultat.
    Question1 : sur quel événement mettre le code pour mettre à jour FrmFacturesValidesTotal
    Question2 : Quel code faut-il mettre?
    Je n'ai pas trouvé le code pour mettre à jour le sous-formulaire2 lorsque l'appel est fait à partir du sous-formulaire1.

    Merci.

  9. #9
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 550
    Points
    24 550
    Par défaut
    On met a jour normalement quand on connait les modifications, donc en même temps que la première mise à jour.
    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
    Private Sub NumFacture_DblClick(Cancel As Integer)
     
    On Error Resume Next
        Dim StrFiltreOpération As Integer
        StrFiltreOpération = IdOpération
         DoCmd.OpenForm "frmFacture", acNormal, , "[IdOpération]=" & StrFiltreOpération, , acDialog
        Do
          DoEvents
          Loop While Forms.FrmFacture.Visible
          ' normalement on fait la mise à jour comme ceci
          Me.FrmFacturesListe.Form.Requery
          ' pour le 2ème
          Me.FrmFacturesValidesTotal.Form.Requery
     
    End Sub
    En effet un me.requery recalcule l'ensemble du formulaire, cela peut devenir très long surtout avec de l'onglet (mmmiam l'onglet de boeuf grillé aux sarments)

    Par contre je ne comprends pas pourquoi tu as besoin d'un sous-form supplémentaire pour afficher des sommes du sousform1. Pourquoi ne pas simplifier en mettant tout cela dans le pied de formulaire de ton sousform Liste facture ?

    Cordialement,

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Le code que tu proposes est exactement celui que j'ai essayé. Et plutôt qu'un bel onglet tout frais, je garde la vieille semelle bien dure... Buuurrrkkk. FrmFacturesValidesTotal ne se met pas à jour.
    A ta question
    pourquoi tu as besoin d'un sous-form supplémentaire pour afficher des sommes du sousform1
    C'est parce que FrmFacturesListe peut contenir des factures "non valides". Celles-ci doivent être affichées dans FrmFacturesListe, mais le calcul du montant total ne doit pas tenir compte des factures non valides. D'ou une requête spécifique pour le total en excluant les non valides.
    Peut-être existe-t-il un autre moyen?
    Merci en tous cas de ton investissement pour me guider dans mes recherches.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Petit complément d'info:
    Ceci ne fonctionne pas (Compile error : Method or data member not found)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub NumFacture_DblClick(Cancel As Integer)
     
    On Error Resume Next
        Dim StrFiltreOpération As Integer
        StrFiltreOpération = IdOpération
         DoCmd.OpenForm "frmFacture", acNormal, , "[IdOpération]=" & StrFiltreOpération, , acDialog
        Do
          DoEvents
          Loop While Forms.FrmFacture.Visible
          ' normalement on fait la mise à jour comme ceci
          Me.FrmFacturesListe.Form.Requery
    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub NumFacture_DblClick(Cancel As Integer)
     
    On Error Resume Next
        Dim StrFiltreOpération As Integer
        StrFiltreOpération = IdOpération
         DoCmd.OpenForm "frmFacture", acNormal, , "[IdOpération]=" & StrFiltreOpération, , acDialog
        Do
          DoEvents
          Loop While Forms.FrmFacture.Visible
          ' normalement on fait la mise à jour comme ceci
          Me.Requery
    C'est peut-être une piste...

  12. #12
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 550
    Points
    24 550
    Par défaut
    Je n'arrive pas à m'expliquer ce problème :

    Suivant ta copie d'écran : Nous avons bien 2 controles sous form, et un bouton qui est contenu dans le form (à onglet).

    Normalement lorsqu'on fait un requery c'est sur la source de ces Sousform. C'est une propriété du sousform et non de son contener (clic sur le contener ne contient pas de Rowsource).

    Si tu veux/peux m'envoyer le fichier (zipé en fichier attaché à ton prochain post) je suis curieux. Je n'ai besoin que du formulaire.

    Concernant le deuxième tu peux toujours travailler avec des fonctions de domaine (Dsum() à voir dans le nouveau tuto de Monsieur Starec) ou encore une formule comme celle-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =somme(vraifaux(NomduChampValide;montant;0)
    Les 2 me semblent convenir.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Voici le document demandé (complet). J'espère que tu as le coeur solide, car tu vas sans doute trouver que c'est très "bricolé"

  14. #14
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 550
    Points
    24 550
    Par défaut
    Trop occupé fixé sur le problème du doevents je n'ai pas regardé l'entête.

    Le double-clic se fait sur la ligne de la facture donc tu es bien dans le sous-form. Donc Me.requery c'est normal.

    Je te poste le code pour le bouton Ajouter Facture.

    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
    Private Sub AjoutFacture_Click()
    On Error GoTo Err_AjoutFacture_Click
     
        stDocName = "FrmFacture"
        DoCmd.OpenForm stDocName, , , stLinkCriteria
        DoCmd.GoToRecord , , acNewRec
        On Error Resume Next
        Do
          DoEvents
        While Forms.FrmFacture.Visible
        Me.SFrmFactures.Form.Requery
        Me.SfrmFacturesValidesTotal.Form.Requery
     
    Exit_AjoutFacture_Click:
        Exit Sub
     
    Err_AjoutFacture_Click:
        MsgBox Err.Description
        Resume Exit_AjoutFacture_Click
     
    End Sub
    Pour les sommes :

    Ouvre ton pied de formulaire (il suffit de tirer vers le bas la ligne Pied de Formulaire)
    Mets 3 zones de texte et colles ces formules dans la propriété Source.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    =Somme(VraiFaux([OpérationValide];[MontantHtva];0))
     
    =Somme(VraiFaux([MontantTva];[MontantTva];0))
     
    =Somme(VraiFaux([MontantTvac];[MontantTvac];0))
    Tu peux ainsi supprimer le sousform des totaux.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Bonsoir,

    Grand merci pour ton aide Loufab. J'ai suivi ton conseil pour les totaux dans le sous-formulaire sans passer par une query distincte. Ca fonctionne. .
    Je reste cependant avec une interrogation quant à la mise à jour d'un sous-formulaire B alors que l'on agit sur un sous-formulaire A. Tant pis!
    Merci aussi pour le code du bouton Ajouter Facture. Mais je dois dire qu'il fonctionnait déjà sans souci auparavant.

    Par contre lorsqu'il n'existe pas encore de facture, le calcul du total reste vide. Or il est impératif que le total affiche 0. Nz et Iif IsNull ne fonctionnent pas. Qu'en pensez-vous?

    A bientôt.

  16. #16
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 017
    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 017
    Points : 24 550
    Points
    24 550
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms.monformprincipal.monsousform.Form.Requery
    tout simplement.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Bonjour

    Encore merci pour l'aide.
    J'ouvre une nouvelle discussion pour l'affichage d'un "zéro" en zone "total" lorsqu'il n'existe aucun enregistrement répondant à une query.

    Bonne journée.


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

Discussions similaires

  1. optimisation mise à jour sous formulaire
    Par petitours dans le forum IHM
    Réponses: 0
    Dernier message: 30/04/2008, 19h44
  2. mise à jour sous formulaire automatique
    Par maxeur dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/01/2008, 09h12
  3. débutant - mise à jour sous formulaire
    Par leglod dans le forum IHM
    Réponses: 3
    Dernier message: 23/12/2007, 16h01
  4. Mise à jour sous formulaire
    Par Invité dans le forum IHM
    Réponses: 4
    Dernier message: 29/12/2006, 20h41
  5. probleme mise à jour sous formulaires
    Par fredzouille dans le forum Access
    Réponses: 1
    Dernier message: 28/08/2006, 06h39

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