Ms access Access 2003表单:下拉式导航

Ms access Access 2003表单:下拉式导航,ms-access,Ms Access,我有一个带有下拉菜单的表单,可以更快地导航表单中的记录。它基于表单绑定到的表。当值更改时(即单击下拉菜单,选择一个条目),它应跳转到正确的记录 Access 2007具有“SearchForRecord”操作,这符合我的要求。但是,Access 2003没有此功能。如何在Access 2007中执行此任务?您可能正在寻找FindFirst方法 以下是如何使用它的示例: Function FindRecord (rstTemp As Recordset, _ strFind As Stri

我有一个带有下拉菜单的表单,可以更快地导航表单中的记录。它基于表单绑定到的表。当值更改时(即单击下拉菜单,选择一个条目),它应跳转到正确的记录


Access 2007具有“SearchForRecord”操作,这符合我的要求。但是,Access 2003没有此功能。如何在Access 2007中执行此任务?

您可能正在寻找
FindFirst
方法

以下是如何使用它的示例:

Function FindRecord (rstTemp As Recordset, _
    strFind As String) As Boolean

    rstTemp.FindFirst strFind

    FindAny = IIf(rstTemp.NoMatch, False, True)
End Function

您可能正在寻找
FindFirst
方法

以下是如何使用它的示例:

Function FindRecord (rstTemp As Recordset, _
    strFind As String) As Boolean

    rstTemp.FindFirst strFind

    FindAny = IIf(rstTemp.NoMatch, False, True)
End Function

您可以在组合框的OnChange事件中尝试以下代码,或在进行选择后将其与按钮关联:

Private Sub cboExample_Change()
  'Requires reference to Microsoft DAO 3.x Object Library '
  Dim rs As DAO.Recordset

  Set rs = Forms!frmExample.RecordsetClone

  rs.FindFirst "[ExampleID] = " & Me.cboExample

  If Not rs.NoMatch Then 
      Forms!frmExample.Bookmark = rs.Bookmark
  End If

End Sub
希望这有帮助


Robert

您可以在组合框的OnChange事件中尝试以下代码,或在进行选择后将其与按钮关联:

Private Sub cboExample_Change()
  'Requires reference to Microsoft DAO 3.x Object Library '
  Dim rs As DAO.Recordset

  Set rs = Forms!frmExample.RecordsetClone

  rs.FindFirst "[ExampleID] = " & Me.cboExample

  If Not rs.NoMatch Then 
      Forms!frmExample.Bookmark = rs.Bookmark
  End If

End Sub
希望这有帮助


使用DoCmd.ApplyFilter,Robert比预期的要简单得多

Private Sub PK_Combo_Change()
    DoCmd.ApplyFilter , "[PrimaryKey] = " & PK_Combo.Value
End Sub

使用DoCmd.ApplyFilter比预期简单得多

Private Sub PK_Combo_Change()
    DoCmd.ApplyFilter , "[PrimaryKey] = " & PK_Combo.Value
End Sub

我将@Robert的代码编辑为:

  With Forms!frmExample.RecordsetClone
    FindFirst "[ExampleID] = " & Me!cboExample
    If Not .NoMatch Then 
       If Me.Dirty Then Me.Dirty = False
       Forms!frmExample.Bookmark = .Bookmark
    End If
  End With
当记录集已经存在并且可以在with块中轻松使用时,我认为绝对没有理由初始化该记录集变量

此外,在使用书签导航离开记录之前保存任何编辑也是非常重要的,因为这会强制所有验证都显式地进行,而不是隐式地在记录离开中进行。从历史上看,Jet书签导航很容易发现隐式调用的save中发生的错误。据推测,和其他书签bug一样,这些bug已经被消除了,但我只是认为最好明确地保存一个脏记录,而不是假设一切都会顺利进行

咆哮:


向导在Access的最新版本(2007年之前,即2002年和2003年)中创建的此操作的代码非常糟糕。它使用一个声明的记录集变量(正如@Robert的代码所做的),但在使用它之后不会清理它(即,将其设置为Nothing)。它还使用表单的Recordset.Clone,而不是现有的.RecordsetClone(它们是不同的对象)。最后,它没有使用.NoMatch,而是使用“If Not rs.EOF”,这没有什么意义。有人告诉我,这样做的原因是,它可以处理具有ADO记录集的表单,但ADO记录集没有.FindFirst方法,所以这很可笑。没错,您可以将.FindFirst更改为.Find,这样做会有效,但这只是一个非常糟糕的代码。

我会将@Robert的代码编辑为:

  With Forms!frmExample.RecordsetClone
    FindFirst "[ExampleID] = " & Me!cboExample
    If Not .NoMatch Then 
       If Me.Dirty Then Me.Dirty = False
       Forms!frmExample.Bookmark = .Bookmark
    End If
  End With
当记录集已经存在并且可以在with块中轻松使用时,我认为绝对没有理由初始化该记录集变量

此外,在使用书签导航离开记录之前保存任何编辑也是非常重要的,因为这会强制所有验证都显式地进行,而不是隐式地在记录离开中进行。从历史上看,Jet书签导航很容易发现隐式调用的save中发生的错误。据推测,和其他书签bug一样,这些bug已经被消除了,但我只是认为最好明确地保存一个脏记录,而不是假设一切都会顺利进行

咆哮:


向导在Access的最新版本(2007年之前,即2002年和2003年)中创建的此操作的代码非常糟糕。它使用一个声明的记录集变量(正如@Robert的代码所做的),但在使用它之后不会清理它(即,将其设置为Nothing)。它还使用表单的Recordset.Clone,而不是现有的.RecordsetClone(它们是不同的对象)。最后,它没有使用.NoMatch,而是使用“If Not rs.EOF”,这没有什么意义。有人告诉我,这样做的原因是,它可以处理具有ADO记录集的表单,但ADO记录集没有.FindFirst方法,所以这很可笑。没错,您可以将.FindFirst更改为.Find,这样就可以工作了,但这只是一个糟糕透顶的代码。

Hi Robert,您可以突出显示您的代码并选择代码按钮(上面有010)以如上所述的格式,大多数情况下它会将所有内容缩进四个空格。谢谢您的提示,Remou。我曾尝试过这样做,但当我剪切粘贴时,它只显示代码块中的顶行。我猜我做错了!你好,Robert,你可以突出显示你的代码,然后选择代码按钮(上面有010)按上面的格式设置,大多数情况下它会将所有内容缩进四个空格。谢谢你的提示,Remou。我曾尝试过这样做,但当我剪切粘贴时,它只显示代码块中的顶行。我猜我做错了!