Recordset2.Seek 方法 (DAO)
适用于:Access 2013、Office 2013
在已建立索引的表类型 Recordset 对象中查找符合当前索引的指定条件的记录,并使该记录成为当前记录(仅适用于 Microsoft Access 工作区)。
语法
表达式 。查找 (比较、 Key1、 Key2、 Key3、 Key4、 Key5、 Key6、 Key7、 Key8、 Key9、 Key10、 Key11、 Key12、 Key13)
表达 一个代表 Recordset2 对象的变量。
参数
名称 |
必需/可选 |
数据类型 |
说明 |
---|---|---|---|
比较 |
必需 |
String |
下列字符表串达式之一:<, <=, =, >=, 或 >。 |
Key1, Key2...Key13 |
必需 |
Variant |
Recordset对象当前索引中的字段对应一个或多个值,由其Index属性设置指定。 可以使用最多 13 个键参数。 |
说明
在使用 Seek 之前,必须使用 Index 属性设置当前索引。 如果索引标识了一个非唯一的键字段, Seek 将查找第一个符合条件的记录。
Seek 方法将在指定的键字段中搜索,并查找第一个符合 comparison 和 key1 指定的条件的记录。 一旦找到,它就会使该记录成为当前记录,同时将 NoMatch 属性设置为 False。 如果 Seek 方法未能找到匹配项, NoMatch 属性将设置为 True,并且当前记录不确定。
如果 comparison 是等于 (=)、大于等于 (>=) 或大于 (>), Seek 将从索引的开头开始往前搜索。
如果 comparison 是小于 (<) 或小于等于 (<=),Seek 将从索引的末尾开始往后搜索。 但是,如果索引的末尾有重复的索引项, Seek 将从重复项中的任一项开始往后搜索。
必须为索引中定义的所有字段指定值。 如果将 Seek 用于多列索引,并且没有为索引中的每个字段指定 comparison 值,则无法在 comparison 中使用等于 (=) 运算符。 这是因为某些条件字段(key2、 key3 等)默认为 Null,可能不匹配。 因此,当且仅当您有一条记录,除了您要查找的键以外都是null时,等号运算符才能正常工作。 建议改用大于等于 (>=) 运算符。
key1 参数必须与当前索引中的相应字段属于同一字段数据类型。 例如,如果当前索引引用了一个数字字段(例如“员工 ID”),则 key1 必须为数字。 同样,如果当前索引引用了一个文本字段(例如"姓"),key1 必须为字符串。
使用 Seek 时不一定要有当前记录。
可以使用 Indexes 集合枚举现有索引。
要在动态集类型或快照类型的 Recordset 中查找一个符合特定条件且没有被现有索引覆盖的记录,请使用 Find 方法。 要包括所有记录而不仅仅是符合特定条件的那些记录,请使用 Move 方法在记录间移动。
不能对链接表使用 Seek 方法,原因是不能将链接表打开为表类型 Recordset 对象。 但是,如果使用 OpenDatabase 方法直接打开一个可安装的 ISAM(非 ODBC)数据库,则可以对该数据库中的表使用 Seek。
示例
此示例演示Seek方法,通过允许用户基于 ID 号码搜索产品。
Sub SeekX()
Dim dbsNorthwind As Database
Dim rstProducts As Recordset2
Dim intFirst As Integer
Dim intLast As Integer
Dim strMessage As String
Dim strSeek As String
Dim varBookmark As Variant
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
' You must open a table-type Recordset to use an index,
' and hence the Seek method.
Set rstProducts = _
dbsNorthwind.OpenRecordset("Products", dbOpenTable)
With rstProducts
' Set the index.
.Index = "PrimaryKey"
' Get the lowest and highest product IDs.
.MoveLast
intLast = !ProductID
.MoveFirst
intFirst = !ProductID
Do While True
' Display current record information and ask user
' for ID number.
strMessage = "Product ID: " & !ProductID & vbCr & _
"Name: " & !ProductName & vbCr & vbCr & _
"Enter a product ID between " & intFirst & _
" and " & intLast & "."
strSeek = InputBox(strMessage)
If strSeek = "" Then Exit Do
' Store current bookmark in case the Seek fails.
varBookmark = .Bookmark
.Seek "=", Val(strSeek)
' Return to the current record if the Seek fails.
If .NoMatch Then
MsgBox "ID not found!"
.Bookmark = varBookmark
End If
Loop
.Close
End With
dbsNorthwind.Close
End Sub
以下示例使用 NoMatch 属性确定 Seek 和 FindFirst 是否成功,如果未成功,则提供相应的反馈。 若要使该过程运行,需要使用 SeekMatch 和 FindMatch 过程。
Sub NoMatchX()
Dim dbsNorthwind As Database
Dim rstProducts As Recordset2
Dim rstCustomers As Recordset2
Dim strMessage As String
Dim strSeek As String
Dim strCountry As String
Dim varBookmark As Variant
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
' Default is dbOpenTable; required if Index property will
' be used.
Set rstProducts = dbsNorthwind.OpenRecordset("Products")
With rstProducts
.Index = "PrimaryKey"
Do While True
' Show current record information; ask user for
' input.
strMessage = "NoMatch with Seek method" & vbCr & _
"Product ID: " & !ProductID & vbCr & _
"Product Name: " & !ProductName & vbCr & _
"NoMatch = " & .NoMatch & vbCr & vbCr & _
"Enter a product ID."
strSeek = InputBox(strMessage)
If strSeek = "" Then Exit Do
' Call procedure that seeks for a record based on
' the ID number supplied by the user.
SeekMatch rstProducts, Val(strSeek)
Loop
.Close
End With
Set rstCustomers = dbsNorthwind.OpenRecordset( _
"SELECT CompanyName, Country FROM Customers " & _
"ORDER BY CompanyName", dbOpenSnapshot)
With rstCustomers
Do While True
' Show current record information; ask user for
' input.
strMessage = "NoMatch with FindFirst method" & _
vbCr & "Customer Name: " & !CompanyName & _
vbCr & "Country: " & !Country & vbCr & _
"NoMatch = " & .NoMatch & vbCr & vbCr & _
"Enter country on which to search."
strCountry = Trim(InputBox(strMessage))
If strCountry = "" Then Exit Do
' Call procedure that finds a record based on
' the country name supplied by the user.
FindMatch rstCustomers, _
"Country = '" & strCountry & "'"
Loop
.Close
End With
dbsNorthwind.Close
End Sub
Sub SeekMatch(rstTemp As Recordset, _
intSeek As Integer)
Dim varBookmark As Variant
Dim strMessage As String
With rstTemp
' Store current record location.
varBookmark = .Bookmark
.Seek "=", intSeek
' If Seek method fails, notify user and return to the
' last current record.
If .NoMatch Then
strMessage = _
"Not found! Returning to current record." & _
vbCr & vbCr & "NoMatch = " & .NoMatch
MsgBox strMessage
.Bookmark = varBookmark
End If
End With
End Sub
Sub FindMatch(rstTemp As Recordset, _
strFind As String)
Dim varBookmark As Variant
Dim strMessage As String
With rstTemp
' Store current record location.
varBookmark = .Bookmark
.FindFirst strFind
' If Find method fails, notify user and return to the
' last current record.
If .NoMatch Then
strMessage = _
"Not found! Returning to current record." & _
vbCr & vbCr & "NoMatch = " & .NoMatch
MsgBox strMessage
.Bookmark = varBookmark
End If
End With
End Sub