【问题标题】:Requery a subform from another form?从另一个表单重新查询子表单?
【发布时间】:2010-12-28 02:30:25
【问题描述】:

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

我在 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

这些尝试似乎都不起作用。有没有办法进行这个重新查询? 提前感谢您的帮助。

【问题讨论】:

  • 子表单显示什么?一个列表框,添加/编辑表单中的详细信息?
  • 子表单在电子表格中显示来自添加/编辑表单的记录
  • docmd.save 保存对象而不是记录 你真的想要'If Not Me.Dirty Then DoCmd.RunCommand acCmdSaveRecord'
  • Allen Browne (allenbrowne.com/bug-01.html) 建议 Me.Dirty = False
  • @Remou +1 为有错误的网站和提示网站本身!

标签: vba forms ms-access


【解决方案1】:

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

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

或者,如果您在主窗体上:

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

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

【讨论】:

  • 后面的语法会执行得更好。 (Bang 运算符会导致隐式类型转换。)
  • 如果您没有从包含子表单的表单运行,则不会:)
  • 我已经尝试过第一个,就像Forms![MainForm]![subformControl].Form.Requery 一样,它不会重新查询子表单。 T 该代码与另一个表单按钮相关联。除非有办法在另一个表单关闭时从父表单重新查询子表单,否则我无法尝试后面的语法。
  • 你能确保 id 通过设置焦点到一个字段来选择子表单吗?这应该可以消除存在某种拼写错误的可能性。
  • .运算符取决于您无法控制的隐式创建的属性(这就是 Me.ControlName 成为编译时检查的对象,因为它周围有一个隐藏的属性包装器)。这会导致 VBA 代码损坏的趋势略有增加。有些人发现编译时检查和更好的 Intellisense 值得冒险。我不 - 我总是使用 !操作员。没有可能产生实际差异的性能差异。
【解决方案2】:

只是评论一下实现这个的方法:

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

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

这样一来,EntryForm 就不会被束缚在一个上下文中使用。另一种方法是将EntryForm 复杂化,其中包含可以了解打开它的表单以及需要重新查询的内容。我认为最好让这类东西尽可能接近使用它的上下文,并保持被调用表单的代码尽可能简单。

也许这里的一个原则是,每当您使用来自另一个表单的 Forms 集合重新查询一个表单时,这很好地表明您的架构有问题——在我看来,这种情况很少发生。

【讨论】:

  • 很好,它与 acDialog 一起工作。起初我试图从主窗体中完成所有这些操作,但我没有想到使用 acDialog,但我想我的大脑在这周结束时被炸了。谢谢。
  • 像魅力一样工作!
  • 这并没有解决问题,而是一种不同的方法。我搜索了“重新查询子表单”,这就是我要找的。​​span>
【解决方案3】:

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

Me.subformname.Requery

对我来说效果很好。祝你好运。

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,但有一些不同...

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

    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】:

      通过关闭和打开,主窗体通常会运行所有相关的查询(包括子窗体相关的)。我遇到了类似的问题,并通过在单击事件上将以下内容添加到“保存命令”按钮来解决它。

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

      【讨论】:

        【解决方案6】:

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

        在我的例子中,我使用 'dbconn.execute "sql" ' 添加了一些记录,并想知道为什么 vba 中的 requery 命令似乎不起作用。当我调试时,重新查询有效。在重新查询之前在代码中添加了 2-3 秒的等待时间,只是为了测试有所不同。

        但更改为 'currentdb.execute "sql" ' 立即解决了问题。

        【讨论】:

          【解决方案7】:

          您所有的控件都属于我们!

          Fionnuala 正确回答了这个问题,但像我这样的略读的人会发现很容易错过重点。

          您不刷新子表单而是刷新子表单 CONTROL。事实上,如果您使用 allforms() 检查,就访问而言,甚至不会加载 subForm。

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

          在我的例子中,我有一个名为 frmInvProdSub 的子表单,我尝试了好几个小时来弄清楚为什么 Access 认为它​​不存在。我放弃了,删除了表格并重新创建了它。最后一步是告诉它您要调用什么控件,因此我将其命名为 frmInvProdSub 并完成了向导。然后我试过了,瞧,它奏效了!

          当我在导航窗口中查看表单名称时,我意识到我忘记在名称中输入“Sub”!就在这时,它点击了。 CONTROL 被称为 frmInvProdSub,而不是表单和使用控件名称的作品。

          当然,如果两个名字相同,那么你就没有这个问题,哈哈。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多