Vba 是否从其他表单中重新查询子表单?

Vba 是否从其他表单中重新查询子表单?,vba,forms,ms-access,Vba,Forms,Ms Access,我一直在独自努力解决这个问题,然后得到一些帮助,然后寻找它;但我一点运气都没有。所以我决定问 Access 2007中有两个表单,我们称之为MainForm和EntryForm MainForm有一个子表单和一个按钮。该按钮在添加模式下打开EntryForm。我想做的是当EntryForm保存新记录时,它将更新(重新查询)MainForm中的子表单 我已经尝试过这个设置代码 Private Sub cmdSaveAndClose_Click() DoCmd.Save 'requ

我一直在独自努力解决这个问题,然后得到一些帮助,然后寻找它;但我一点运气都没有。所以我决定问

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
这些尝试似乎都不起作用。有没有办法再询问一下?
提前感谢您的帮助。

您必须使用子窗体控件的名称,而不是子窗体的名称,尽管它们通常是相同的:

 Forms![MainForm]![subform control name Name].Form.Requery
或者,如果您在主窗体上:

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

更多信息:

仅就实现此目的的方法发表评论:

您正在将入口窗体永久绑定到您调用它的窗体。我认为最好不要把表单和上下文联系在一起。我将从保存/关闭例程中删除重新查询,而是使用acDialog开关以模式打开EntryForm:

  DoCmd.OpenForm "EntryForm", , ,"[ID]=" & Me!SubForm.Form!ID, , acDialog
  Me!SubForm.Form.Requery
这样,EntryForm就不会被限制在一个上下文中使用。另一种方法是用一些已知的东西使入口表单复杂化,这些东西是哪个表单打开的,需要重新查询什么。我认为最好使这类内容尽可能接近使用它的上下文,并使被调用表单的代码尽可能简单


这里的一个原则可能是,每当您使用来自另一个表单的表单集合重新查询表单时,这很好地表明您的体系结构不正确——在我看来,这种情况应该很少发生。

通过关闭和打开,主表单通常会运行所有相关的查询(包括与子表单相关的查询)。我遇到了一个类似的问题,并通过在click事件中添加下面的保存命令按钮来解决它

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

我尝试了以上几种解决方案,但都没有解决我的问题。 将数据保存到数据库后刷新表单中子表单的解决方案:

Me.subformname.Requery


这对我很管用。祝你好运。

我也有类似的问题,但有一些不同

在我的例子中,我的主窗体有一个控件(vendor),我使用该控件的值更新数据库中的查询,代码如下:

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 realization 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

毕竟,不需要刷新、重新查询、重新查询等…

刚刚发现,如果使用adodb更新子表单的源表,则重新查询需要一段时间才能找到更新的信息

在我的例子中,我添加了一些带有“dbconn.execute“sql”的记录,并想知道为什么vba中的requery命令似乎不起作用。当我调试时,重新查询成功了。在代码中添加了一个2-3秒的等待,然后重新查询,这只是为了测试是否产生了影响


但更改为“currentdb.execute”sql立即修复了该问题

您所有的控件都属于我们

菲昂努阿拉回答得很对,但像我这样的掠食者会发现很容易忽略要点

如果不刷新子窗体,则刷新子窗体控件。事实上,如果您使用allforms()检查,就访问而言,子表单甚至没有加载

在主窗体上,查看子窗体向导提供的标签,或单击一次或在其周围的边框上选择子窗体,然后查看“属性”中“其他”选项卡中的“标题”。这是用于重新查询的名称,而不是出现在导航面板中的表单名称

在我的例子中,我有一个名为frmInvProdSub的子表单,我花了好几个小时试图找出Access认为它不存在的原因。我放弃了,删除了表单并重新创建了它。最后一步是告诉它您想要调用的控件,因此我将其命名为frmInvProdSub并完成了向导。然后我试了一下,瞧,成功了

当我在导航窗口中查看表单名称时,我意识到我忘记在名称中添加“Sub”!就在那时,它点击了。该控件名为frmInvProdSub,而不是表单,使用该控件名可以工作


当然,如果两个名称相同,那么您就没有这个问题。lol。

子窗体显示什么?一个列表框,添加/编辑表单的详细信息?子表单在spreadsheetdocmd中显示添加/编辑表单的记录。保存保存对象,而不是您真正想要的记录“如果不是我。Dirty,则DoCmd.RunCommand acCmdSaveRecord”Allen Browne()建议我。Dirty=False@Remou+1用于有bug的站点和提示站点本身!后面的语法将执行得更好。(Bang运算符会导致隐式类型转换。)如果不是从包含子窗体的窗体运行,则不会:)我尝试了第一种,如下面的
Forms![MainForm]![subformControl].Form.Requery
,它不会重新查询子表单。T代码绑定到另一个表单按钮。除非在关闭另一个窗体时有办法从父窗体重新查询子窗体,否则我无法尝试后面的语法。您是否可以通过将焦点设置为字段来确保id正在选择子窗体?这将消除出现某种拼写错误的可能性。运算符依赖于您无法控制的隐式创建的属性(这就是Me.ControlName接受编译时检查的方式,因为它周围有一个隐藏的属性包装器)。这导致VBA代码损坏的趋势略微增加。有些人认为编译时检查和更好的智能感知值得冒这个风险。我不,我总是用这个!操作人员没有可能带来真实世界的性能差异。太好了,它起作用了