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. salut,
    ce que je pourrais te conseiller :
    - creer une macro qui affiche tous les enregistrements
    et faire pour ton bouton:
    Docmd.RunMacro "TaMacro"
    1. Essaye ceci à la place de ta ligne de code:

      Forms![TonForm]![TonSubForm].Requery

      Voili voilou

      Rien n'est plus dangereux qu'une idée quand on a 
      qu'une idée
        :-)
      1. ca change rien du tout
    2. Ton bouton, il est placé sur le form ou sur le subform?

      Rien n'est plus dangereux qu'une idée quand on a 
      qu'une idée
        :-)
      1. Sur le Form
      2. @julgoodMon sous form est en mode feuille de données
    3. C'est curieux, ça devrait marcher.
      Comment le bouton modifie-t-il les paramètres de ta query?

      Si le code n'est pas trop long, pourrais-tu l'afficher?

      Rien n'est plus dangereux qu'une idée quand on a 
      qu'une idée
        :-)
      1. Private Sub bouton_rech_Click()

        Call GEstion_Coch
        Forms![F_rech]![Li_resu].Requery

        End Sub

        If Me.Coch_mag.Value = True Then
        If Me.Coch_site.Value = True Then
        Cri_Unit = " LIKE '*' "
        Else
        Cri_Unit = " LIKE 'MAG' "
        End If
        Else
        If Me.Coch_site.Value = True Then
        Cri_Unit = " NOT LIKE 'MAG' "
        Else
        MsgBox "Veuillez cochez au moins un emplacement avant de lancer la recherche", , "TOTAL France"
        Exit Sub
        End If
        End If

        If Me.Coch_Ha.Value = True Then
        Cri_HA = " LIKE '" & Me.Zt_HA.Value & "' "
        Else
        Cri_HA = " LIKE '*' "
        End If

        If Me.Coch_pp.Value = True Then
        Cri_pp = " LIKE '" & Me.Zt_pp.Value & "' "
        Else
        Cri_pp = " LIKE '*' "
        End If

        If Me.Coch_pui.Value = True Then
        Cri_puiss = " LIKE '" & Me.Zt_puiss.Value & "' "
        Else
        Cri_puiss = " LIKE '*' "
        End If

        If Me.Coch_Forme.Value = True Then
        Cri_Forme = " LIKE '" & Me.Zt_Forme.Value & "' "
        Else
        Cri_Forme = " LIKE '*' "
        End If

        If Me.Coch_Cenelec.Value = True Then
        Cri_Cenelec = " LIKE '" & Me.Zt_Cenelec.Value & "' "
        Else
        Cri_Cenelec = " LIKE '*' "
        End If

        If Me.Coch_tension.Value = True Then
        Cri_Tension = " LIKE '" & Me.Zt_tension.Value & "' "
        Else
        Cri_Tension = " LIKE '*' "
        End If

        StrSQL = "SELECT Matricule, Unité, Repère, ROVB, VISR, Constructeur, Année, Cenelec, Température, Type_Constructeur, Forme, HA, Vitesse, Puissance, Tension, Intensité, n°Série, Nbre_poles, BoutArbre, [Poids moyen] FROM T_moteurs WHERE Unité" & Cri_Unit & "ANd HA" & Cri_HA & "AND Nbre_poles" & Cri_pp & "AND Puissance" & Cri_puiss & "AND Forme" & Cri_Forme & "AND Cenelec" & Cri_Cenelec & "AND Tension" & Cri_Tension & ";"

        CurrentDb.QueryDefs("Req_Rech").SQL = StrSQL
        CurrentDb.QueryDefs.Refresh

        End Sub
    4. 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
    5. 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. 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. 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. 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. Ca merche pas :'-(

            J'ai l'impression qu'il ne prends pas en compte la valeur des fonctions dans les critères
            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. 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. 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. 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. 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. En plus lors de l'ouverture de mon Form 1, Il m'execute Cri_unit Avant meme d'executer l'evenement OnFormOpen.
                        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. 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
                            • 2