我一直在努力解决这个问题,然后在一些帮助下,然后搜索它;但我没有运气。所以我决定问。
我在 Access 2007中有两种表单可以调用它们MainForm
和EntryForm
。
MainForm
有一个子表单和一个按钮。该按钮在添加模式下打开EntryForm
。我想要做的是当EntryForm
保存新记录时它会更新(重新查询)MainForm
中的子表单。
我试过这个设置代码
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
这些尝试似乎都不起作用。有没有办法解决这个问题? 感谢您的帮助。
答案 0 :(得分:14)
您必须使用子表单控件的名称,而不是子表单的名称,尽管这些名称通常是相同的:
Forms![MainForm]![subform control name Name].Form.Requery
或者,如果您在主表单上:
Me.[subform control name Name].Form.Requery
答案 1 :(得分:9)
只是评论实现这一目标的方法:
您正在将EntryForm永久地绑定到您从中调用它的表单。我认为最好不要将形式与上下文联系起来。我将从Save / Close例程中删除requery,而是使用acDialog开关以模态方式打开EntryForm:
DoCmd.OpenForm "EntryForm", , ,"[ID]=" & Me!SubForm.Form!ID, , acDialog
Me!SubForm.Form.Requery
这样,EntryForm就不会在一个上下文中使用。另一种方法是使EntryForm复杂化,这些知识可以通过哪种形式打开它以及需要重新获取的内容。我认为最好将这类内容保持在与其使用的上下文接近的位置,并尽可能简化被调用表单的代码。
这里的一个原则可能是,无论何时你使用另一种形式的Forms集合重新查找表单,这都是一个很好的迹象,表明你的架构不正确 - 在我看来这应该很少发生。
答案 2 :(得分:2)
我上面尝试了几种解决方案,但没有解决我的问题。 将数据保存到数据库后刷新表单中的子表单的解决方案:
Me.subformname.Requery
它对我来说很好。祝你好运。
答案 3 :(得分:0)
通过关闭和打开,主窗体通常运行所有相关查询(包括与子窗体相关的查询)。我遇到了类似的问题并通过在点击事件中添加以下保存命令按钮来解决它。
DoCmd.Close acForm, "formname", acSaveYes
DoCmd.OpenForm "formname"
答案 4 :(得分:0)
我遇到过类似的问题,但有一些区别...
在我的情况下,我的主窗体具有一个Control(供应商),该值用于使用以下代码更新数据库中的Query:
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
自从我的子表单记录源开始就是名为“ Qry_Pedidos realizados e importados”的查询。
但是我可以在主表单上下文中更新子表单数据的唯一方法是自行将子表单的数据源刷新为其自身,就像下面这样:
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
根本不需要刷新,重新计算,重新查询等……
答案 5 :(得分:0)
刚刚发现,如果使用adodb更新了子表单的源表,则需要一段时间,直到重新查询才能找到更新的信息。
在我的情况下,我使用dbconn.execute“ sql”添加了一些记录,并且想知道为什么vba中的requery命令似乎不起作用。在调试时,重新查询有效。在代码中添加了2-3秒的等待时间,然后重新查询只是为了测试有所不同。
但是更改为'currentdb.execute“ sql”'立即解决了该问题。
答案 6 :(得分:0)
您的所有控件都属于我们!
Fionnuala的回答正确,但是像我这样的略读者会发现很容易错过这一点。
您不刷新子窗体,而是刷新子窗体CONTROL。实际上,如果您使用allforms()检查,就访问而言,甚至不会加载子表单。
在主窗体上,查看子窗体向导提供的标签,或者通过单击一次或在其周围的边框上选择子窗体,然后在属性的“其他”选项卡中查看“标题”。那是您用于重新查询的名称,而不是出现在导航面板中的表单的名称。
在我的情况下,我有一个名为frmInvProdSub的子表单,我尝试了许多小时才弄清楚为什么Access不认为它存在。我放弃了,删除了表格并重新创建了它。最后一步是告诉它要调用的控件,因此我将其命名为frmInvProdSub并完成了向导。然后我尝试了,瞧,它成功了!
当我在导航窗口中查看表单名称时,我意识到我忘记了在名称中添加“ Sub”!那是它单击的时间。该控件称为frmInvProdSub,而不是窗体,并且使用控件名称也可以。
当然,如果两个名字相同,那么您就不会遇到这个问题了。