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.
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.
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
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.
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.
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 ...
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"