首页 文章

如何从另一个表单重新查询子表单?

提问于
浏览
11

我一直在努力解决这个问题,然后在一些帮助下,然后搜索它;但我没有运气 . 所以我决定问 .

我在Access 2007中有两个表单,可以调用它们 MainFormEntryForm .
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

这些尝试似乎都不起作用 . 有没有办法解决这个问题?我在这里先向您的帮助表示感谢 .

6 回答

  • 0

    只是对完成此方法的方法发表评论:

    您将EntryForm永久地绑定到您正在调用它的表单上 . 我认为最好不要将形式与这样的背景联系起来 . 我将从Save / Close例程中删除requery,而是使用acDialog开关以模态方式打开EntryForm:

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

    这样,EntryForm就无法在一个上下文中使用 . 另一种方法是使EntryForm复杂化,这些知识可以通过哪种形式打开它以及需要重新获取的内容 . 我认为最好将这类内容保持在与其使用的上下文接近的位置,并尽可能简化被调用表单的代码 .

    也许这里的一个原则是,无论何时你使用另一种形式的Forms集合重新查找表单,这都是一个很好的迹象表明你的架构不正确 - 在我看来这应该很少发生 .

  • 0

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

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

    或者,如果您在主表单上:

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

    更多信息:http://www.mvps.org/access/forms/frm0031.htm

  • 2

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

    Me.subformname.Requery

    它对我来说很好 . 祝好运 .

  • 13

    通过关闭和打开,主窗体通常运行所有相关查询(包括与子窗体相关的查询) . 我有一个类似的问题,并通过在点击事件上添加以下保存命令按钮解决它 .

    DoCmd.Close acForm, "formname", acSaveYes
    DoCmd.OpenForm "formname"
    
  • 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
    

    毕竟不需要刷新,重新计算,重新查询等等......

  • 10

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

    在我的情况下,我用'dbconn.execute“sql”'添加了一些记录,并想知道为什么vba中的requery命令似乎不起作用 . 当我调试时,requery工作 . 在重新查询之前在代码中添加了2-3秒等待,以便测试产生差异 .

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

相关问题