将主表单从Subfrom移动到特定记录

时间:2015-09-15 14:53:25

标签: ms-access access-vba ms-access-2007 ms-access-2010 ms-access-2013

我有一个包含子表单的主表单。主窗体绑定到一个表,该表的主键为ID1,外键为ID2

主要表单/子表单关系在ID2上设置,因此主表单将一次显示1条记录,然后子表单将显示与当前ID2匹配的所有相关记录记录在主表格上。

我正在尝试在子窗体记录中使用命令按钮,以便我可以使用ID1字段将主窗体移动到子窗体中的特定记录:

Private Sub cmdLoadAssess_Click()

    Dim rs As DAO.Recordset
    Dim frm As Form

    Set frm = Me.Parent
    Set rs = frm.RecordsetClone

    rs.FindFirst "ID1=" & Me.ID1

    If _
        Not rs.NoMatch _
    Then        
        Debug.Print "Match found for " & Me.ID1
        frm.Bookmark = rs.Bookmark          
    Else        
        Debug.Print "No match found for " & Me.ID1      
    End If

End Sub

不幸的是,这似乎只能在ID1找到主要表单中当前记录的匹配(这是没有意义的,因为主表单已经存在!)

我知道这些记录存在(它们就在子表单中),而那些Debug.Print行告诉我ID1正从子表单传递。我在这里缺少什么?

修改 在执行rs.MoveLast然后检查克隆记录集的rs.RecordCountrs!ID之后,似乎只记录了主表单上的当前记录,而不是整个表格。主要形式必然。为什么不克隆主窗体的整个记录​​集?

2 个答案:

答案 0 :(得分:0)

我的表单使用DoCmd.OpenForm方法的 WhereCondition 参数打开了特定记录。

这会导致表单的.Filter属性设置为 WhereCondition 中放置的内容。

当在过滤后的表单上使用RecordsetClone时,它会以过滤后的状态进行克隆,因此尝试查找该克隆记录集中的任何其他记录都是徒劳的。

感谢@ andre451的评论帮助我解决了这个问题。正如所建议的那样,只需重新定义表单的过滤器以匹配所选子表单记录的过滤器就可以了:

Private Sub cmdLoadAssess_Click()

    Dim frm As Form

    Set frm = Me.Parent

    frm.filter = "ID1=" & Me.ID1

    Set frm = Nothing

End Sub

答案 1 :(得分:0)

嘿。 :)

总而言之,如果你打开一个这样的表格来显示1条记录

DoCmd.OpenForm "MainForm", WhereCondition:="ID1 = " & someId

它设置表单的.Filter属性(和.FilterOn = True)。

要显示其他记录,请更改过滤器:

frm.Filter = "ID1 = " & Me.ID1