web-dev-qa-db-fra.com

Comment requery un sous-formulaire à partir d'un autre formulaire?

J'ai moi-même lutté avec ce problème, puis avec de l'aide, puis cherché à ce sujet; mais je n'ai pas eu de chance. Alors j'ai décidé de demander.

J'ai deux formulaires dans Access 2007 appelons-les MainForm et EntryForm.
MainForm a un sous-formulaire et un bouton. Le bouton ouvre la EntryForm en mode Ajout. Ce que je veux faire, c’est que lorsque EntryForm enregistre le nouvel enregistrement, il met à jour (actualise à nouveau) le sous-formulaire dans MainForm.

J'ai essayé ce code d'installation

Private Sub cmdSaveAndClose_Click()
    DoCmd.Save

    'requery list
    Forms![MainForm]![subformName].Requery

    '' I've also tried these
    'Forms![MainForm]![subformName].Form.Requery
    'Forms.("MainForm").[subformName].Requery
    'Forms.("MainForm").[subformName].Form.Requery


    DoCmd.Close
End Sub

Aucune de ces tentatives ne semble fonctionner. Y at-il un moyen de faire cette requery? Merci pour l'aide à l'avance.

11
Tony L.

Juste un commentaire sur la méthode pour y parvenir:

Vous associez votre formulaire EntryForm de manière permanente au formulaire à partir duquel vous l'appelez. Je pense qu'il est préférable de ne pas avoir de formulaires liés à un contexte comme celui-là. J'enlèverais la requête de la routine Save/Close et ouvrirais plutôt EntryForm en mode modal, à l'aide du commutateur acDialog:

  DoCmd.OpenForm "EntryForm", , ,"[ID]=" & Me!SubForm.Form!ID, , acDialog
  Me!SubForm.Form.Requery

De cette façon, EntryForm n'est pas contraint d'utiliser dans un seul contexte. L’alternative est de compliquer EntryForm avec quelque chose d’expert qui sait quel formulaire l’a ouvert et ce qui doit être demandé. Je pense qu'il est préférable de garder ce genre de chose aussi proche du contexte dans lequel il est utilisé, et de garder le code du formulaire appelé aussi simple que possible.

Un principe peut-être est que, chaque fois que vous interrogez un formulaire à l'aide de la collection Forms d'un autre formulaire, cela indique que quelque chose ne va pas dans votre architecture - cela devrait arriver rarement, à mon avis.

9
David-W-Fenton

Vous devez utiliser le nom du contrôle de sous-formulaire, pas le nom du sous-formulaire, bien que ceux-ci soient souvent identiques

 Forms![MainForm]![subform control name Name].Form.Requery

Ou, si vous êtes sur le formulaire principal:

 Me.[subform control name Name].Form.Requery

Plus d'infos: http://www.mvps.org/access/forms/frm0031.htm

14
Fionnuala

J'ai essayé plusieurs solutions ci-dessus, mais aucune n'a résolu mon problème . Solution pour actualiser un sous-formulaire dans un formulaire après avoir enregistré des données dans une base de données:

Me.nomformulaire.Requery

Cela a bien fonctionné pour moi. Bonne chance.

2
user1603444

Nous venons de découvrir que si la table source d’un sous-formulaire est mise à jour à l’aide d’adodb, il faut un certain temps pour que la requête puisse retrouver les informations mises à jour. 

Dans mon cas, j’ajoutais des enregistrements avec 'dbconn.execute "sql"' et je me demandais pourquoi la commande requery dans vba ne semblait pas fonctionner. Lorsque je déboguais, le requery a fonctionné. Un délai d’attente de 2-3 secondes dans le code avant de réessayer, juste pour tester, a fait une différence.

Mais le passage à 'currentdb.execute "sql"' a immédiatement résolu le problème. 

0
Hannu T

J'ai eu un problème similaire, mais avec quelques différences ...

Dans mon cas, mon formulaire principal contient un contrôle (fournisseur) avec la valeur que j'ai utilisée pour mettre à jour une requête dans ma base de données, à l'aide du code suivant:

Sub Set_Qry_PedidosRealizadosImportados_frm(Vd As Long)
Dim temp_qry As DAO.QueryDef

'Procedimento para ajustar o codigo do cliente na Qry_Pedidos realizados e importados
'Procedure to adjust the code of the client on Qry_Pedidos realizados e importados
Set temp_qry = CurrentDb.QueryDefs("Qry_Pedidos realizados e importados")
temp_qry.SQL = "SELECT DISTINCT " & _
            "[Qry_Pedidos distintos].[Codigo], " & _
            "[Qry_Pedidos distintos].[Razao social], " & _
            "COUNT([Qry_Pedidos distintos].[Pedido Avante]) As [Pedidos realizados], " & _
            "SUM(IIf(NZ([Qry_Pedidos distintos].[Pedido Flexx], 0) > 1, 1, 0)) As [Pedidos Importados] " & _
            "FROM [Qry_Pedidos distintos] " & _
            "WHERE [Qry_Pedidos distintos].Vd = " & Vd & _
            " Group BY " & _
            "[Qry_Pedidos distintos].[Razao social], " & _
            "[Qry_Pedidos distintos].[Codigo];"
End Sub

Depuis le début, ma source d'enregistrement de sous-formulaire était la requête intitulée "Qry_Pedidos realizados e importados".

Mais la seule façon de mettre à jour les données de sous-formulaire à l'intérieur du contexte de formulaire principal était d'actualiser lui-même la source de données du sous-formulaire, comme ci-dessous:

Private Sub cmb_vendedor_v1_Exit(Cancel As Integer)
'Codigo para atualizar o comando SQL da query
'Code to update the SQL statement of the query 
    Call Set_Qry_Pedidosrealizadosimportados_frm(Me.cmb_vendedor_v1.Value)

'Codigo para forçar o Access a aceitar o novo comando SQL
'Code to force de Access to accept the new sql statement
    Me!Frm_Pedidos_realizados_importados.Form.RecordSource = "Qry_Pedidos realizados e importados"
End Sub

Aucun rafraîchissement, recalc, requery, etc, n'était nécessaire après tout ...

0
Leo

En fermant et en ouvrant, le formulaire principal exécute généralement toutes les requêtes associées (y compris celles liées aux sous-formulaires). J'ai eu un problème similaire et je l'ai résolu en ajoutant ce qui suit au bouton Enregistrer la commande lors d'un événement clic.

DoCmd.Close acForm, "formname", acSaveYes
DoCmd.OpenForm "formname"
0
Vitanov