Requery Access 2000

Bonjour, j'ai une application access 2000.

Sur un formulaire, j'ai un sous formulaire et un bouton. Lorsque j'appuie sur le bouton cela modifie ma requête sur laquelle est basée le sous formulaire (donc en change les données)

Et à la fin du code de mon bouton je fais
Me.SsForm.Form.Requery et ca ne rafraichit pas

Par contre si je ferme le formulaire et que je le réouvre les nouvelles données sont apparues

Si qqun sait pourquoi le Requery ne marche pas, je lui demande son aide

24 réponses

Résumé de la discussion

Un utilisateur d'Access 2000 rencontre un problème de rafraîchissement des données lorsqu’un bouton modifie la requête du sous-formulaire: le sous-formulaire ne se réactualise pas tant que le formulaire n’est pas fermé puis rouvert. Plusieurs réponses évoquent la nécessité de relier correctement les champs père/fils ou d'utiliser une méthode de requery adaptée, notamment en invoquant directement le requery du subform. La solution la plus recommandée consiste à cibler le sous-formulaire avec sa référence explicite, par exemple Forms![TonForm]![TonSubForm].Requery, après modification, plutôt que d’attendre un rafraîchissement global. En cas d’échec, d’autres pistes restent l’ouverture du formulaire et l’exécution d’événements dans l’ordre ou l’utilisation d’un constructeur de requête pour forcer le recalcul.

Bobot (l’IA à votre service)
  1. ???????

    La je suis à court d'idées....
    Envoi moi une adresse e-mail à l'adresse suivante:
    PbAccess.1.LeLaid@Spamgourmet.Com (n'essaye pas d'envoyer plus d'un mail, je ne recevrai que le premier).

    Je t'enverai une compie d'une appli qui marche (seule différence, Access 97, il faudra donc que tu la convertisses).

    A+

    Rien n'est plus dangereux qu'une idée quand on a 
    qu'une idée
      :-)
    1. Bon,

      Je te propose de modifier tes fonctions de la manière suivante:

      Dans un module, tu écris (pour Cri_Ha):

      Public Cri_Ha As String

      Public Function ReturnCri_Ha() As String
      ReturnCri_Ha= Cri_Ha
      End Function

      Dans ta procédure click tu écris:

      Private Sub bouton_rech_Click()
      Coch_Ha.Value = True Then
      Cri_Ha = " LIKE '" & Zt_HA.Value & "' "
      Else
      Cri_Ha = " LIKE '*' "
      End If

      Forms![F_rech]![Li_resu].Requery
      End Sub

      Comme critère dans ta query tu écris pour la colonne Ha: = ReturnCri_Ha()

      .... Croisons les doights

      Rien n'est plus dangereux qu'une idée quand on a 
      qu'une idée
        :-)
      1. voila c corriG pour la 2eme remarqe
        J'ai enlevé les appels de fonctions
        Mais la requête ne me donne toujours aucun résultat
        1. Non, non,...

          Tu ne dois pas appeler la fonction Cri_xxx dans la routine. Elles doivent être utilisées directement dans les critères de ta query (dans le query panel). Quand tu es en mode design sur une query, il te suffit de mettre dans ta ligne de "Criteria" = Cri_xxx().

          La procédure Click ne doit contenir que
          Forms![Form1]![sFrom].Requery
          et rien d'autre (normalement).

          Concernant ta deuxième remarque:
          Il faut faire attention car le Sub form est ouvert AVANT le form.
          Il faut donc définr des valeur par défaut (true ou false) et ne pas laisser la propriété "default value" de tes check box à blanc.

          Rien n'est plus dangereux qu'une idée quand on a 
          qu'une idée
            :-)
          1. En plus lors de l'ouverture de mon Form 1, Il m'execute Cri_unit Avant meme d'executer l'evenement OnFormOpen.
            1. J'ai éliminé ma routine Gestion Coch.
              Lors de l'appui sur les bouton, j'appelle les fonction Cri_xxx situées dans le module.
              Ensui te je fais mon Forms![Form1]![sFrom].Requery

              Mes fonctions Cri sont écrites comme ceci:
              Public Function Cri_HA() As String

              If Forms("F_rech").Coch_Ha.Value = True Then
              Cri_HA = " LIKE '" & Forms("F_rech").Zt_HA.Value & "' "
              Else
              Cri_HA = " LIKE '*' "
              End If

              End Function

              Qd je met un espion sur Cri_Ha(), je vois bien la valeur voulue mes
              ma requête ne me donne aucun résultat
              1. N'oublie pas de spécifier dans les propriétés de Form1 que Has Module = Yes

                Rien n'est plus dangereux qu'une idée quand on a 
                qu'une idée
                  :-)
                1. Récapitulons:

                  1. Tu as un form (Form1) qui contient un subform (sform).
                  Dans ton Form1 il y a un bouton qui provoque la mise à jour de critères pour ta query (via la procédure Gestion_Coch).

                  2. Tu as déclaré dans un module les variables Publiques Cri_xxx (attention, elle ne peuvent plus être déclarées en local dans ta procédure).

                  3. Pour chaque variable Cri_xxx tu as créé une fonction Pubilique qui renvoit la valeur de Cri_xxx (fRevoiCri_xxx).

                  4. Tu as créé un query liée à ton subform (Req_Rech).
                  Dans la ligne "Criteria" tu as indiqué = fRavoiCri_xxx.

                  5. La procédure "Click" de ton bouton se termine par
                  Forms![Form1]![sFrom].Requery

                  UNE SUGGESTION:
                  Elimine ta routine Gestion_Coch et inclus le code directement dans la fonction "bouton_rech_Click" afin d'éviter le problème de variables locales et globales.

                  Rien n'est plus dangereux qu'une idée quand on a 
                  qu'une idée
                    :-)
                  1. non pas cette fois la la requête me donna aucun résultat pourtant quand je met des expression espionnes dans le code sur mes fonction ca marche
                    1. Quand tu fermes le form et que tu le réouvre, les données sont mise à jour?

                      Rien n'est plus dangereux qu'une idée quand on a 
                      qu'une idée
                        :-)
                      1. Ca merche pas :'-(

                        J'ai l'impression qu'il ne prends pas en compte la valeur des fonctions dans les critères
                        1. Donc, commence par créer ta query "Req_Rech" manuellement via le query builder.

                          Rien n'est plus dangereux qu'une idée quand on a 
                          qu'une idée
                            :-)
                          1. Non... Il ne faut pas de père fille...

                            Je retires ce que j'ai dit plus haut (dans le post précédant). Via le code
                            CurrentDb.QueryDefs("Sub Form Fermat Table query").SQL = strSQL
                            CurrentDb.QueryDefs.Refresh
                            ça ne marche pas...

                            Essaye en modifiant ta query via le query builder.

                            Pour cela il faut que tes variables de critère soit publiques et déclarées dans un module.

                            Tu crées ensuite une fonction pour chaque variable dont le seul rôle est de renvoyer la variable. (voir ci dessus post précédent).

                            Comme critère de sélection dans ta query tu met "= Nomdetafonction()".

                            Chez moi, ça marche.

                            Rien n'est plus dangereux qu'une idée quand on a 
                            qu'une idée
                              :-)
                            1. J'ai essayé ton code sur un de mes form:

                              Private Sub TBName_AfterUpdate()
                              Dim strSQL As String
                              gFTable = TBName.Value
                              strSQL = "SELECT [Fermat Table_Column].[Table Name], [Fermat Table_Column].[Column Name],[Fermat Table_Column].[Basel II], [Fermat Table_Column].Held, [Fermat Table_Column].[Column ID],[Fermat Table_Column].Question FROM [Fermat Table_Column]WHERE ((([Fermat Table_Column].[Table Name]) ='" & TBName.Value & "')) ORDER BY [Fermat Table_Column].[Column ID];"

                              CurrentDb.QueryDefs("Sub Form Fermat Table query").SQL = strSQL
                              CurrentDb.QueryDefs.Refresh

                              Forms![Fermat Tables]![Fermat Table Sub form].Requery
                              End Sub

                              Et ça marche!!!!

                              La seule dif réside dans le fait que TBName soit un menu déroulant...

                              Remarque: Ton subform ne doit pas être lié à ton form via des "Link Child Field" et "Link master Field".

                              Rien n'est plus dangereux qu'une idée quand on a 
                              qu'une idée
                                :-)
                              1. Mon SubForm n'est pas lier par les champs pères et champs fils
                                c peut etre cela qui manque??
                            2. Je viens de voir que tu fais ta sélection via un stingSQL...
                              Je te conseils de le faire via une query via le query builder...

                              Cre que j'ai écris plus haut ne fonctinnera pas avec une mise à jour de tes querydefs.

                              Rien n'est plus dangereux qu'une idée quand on a 
                              qu'une idée
                                :-)
                              1. OK, j'imagine que ta query prend en critère de sélection des valeurs telles que Cri_Unit.

                                J'ai eu le problème une fois et je l'ai contourné de la manière suivant:

                                J'ai créé une fonction (dans un module) qui renvoit la valeur de ta variable (cela force access à la mettre à jour au niveau de la query.

                                Public Function getVar() As String
                                getVar = Nom_de_taVariable
                                End Function

                                Et dans la query je mets comme critère = getVar()

                                J'espère que ça marchera. J'ai sous les yeux un form de ce type qui fonctionne (la seule dif est que le control qui modifie le suform est de type liste déroulante).

                                Rien n'est plus dangereux qu'une idée quand on a 
                                qu'une idée
                                  :-)
                                1. J'eesaye et je te dis si ca marche
                              • 1
                              • 2