recordset.find 使用变量 VBA ADODB
recordset.find using variable VBA ADODB
我非常渴望让这个微不足道的搜索工作:
rst2.Find "ID = '" & messID & "'"
我几乎尝试过任何组合,但从来没有 returns 搜索结果。整个代码将在这里:
Option Compare Database
Option Explicit
'Modul zum Updaten des Status eines Messmittels in der Stammdatenbank (Entnommen/Verfügbar)3
Public Function updateStatus()
Dim rst2 As ADODB.Recordset
Dim rst As ADODB.Recordset
Dim messID As String
Set rst = New ADODB.Recordset 'Stammdaten zur Bearbeitung öffnen
rst.ActiveConnection = CurrentProject.AccessConnection
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
rst.Open "Stammdaten"
rst.MoveFirst
Set rst2 = New ADODB.Recordset 'zur Bearbeitung öffnen
rst2.ActiveConnection = CurrentProject.AccessConnection
rst2.CursorType = adOpenKeyset
rst2.LockType = adLockOptimistic
rst2.Open "Verwendung"
Do While Not rst.EOF
messID = rst!ID
Debug.Print messID
rst2.Find "ID = '" & messID & "'"
If rst2.EOF = True Then 'Falls nicht vorhanden
Debug.Print "Keine Verwendung gefunden!"
Else
rst2.Sort = "Nr DESC"
rst2.MoveFirst
Debug.Print rst2!Status
End If
rst.MoveNext
Loop
rst.Close
rst2.Close
End Function
我错过了什么?我真的尝试了数百个不同的搜索字符串:(
您有一个 table-type 记录集,并且您正在按键搜索它。这是 Seek
方法而不是 Find
方法的典型 use-case。
据此:https://support.microsoft.com/en-us/kb/108149
The find methods (FindFirst, FindLast, FindNext, and FindPrevious) apply to Dynasets and Snapshots but not to Table objects. Conversely, the Seek method is available only on the Table object.
尽管该页面似乎更关注 DAO 而不是 ADO,但同样的逻辑应该适用于这两种情况。
我认为你应该尝试 Seek
方法 https://msdn.microsoft.com/en-us/library/ms675109(v=vs.85).aspx
rst2.Seek "=", messID
If rst2.NoMatch Then ' not found ...
我不经常使用ADO,但我有2个想法都不是很优雅-
1) Application.WorksheetFunction.Transpose(rst2.GetRows)
(确保首先使用 .MoveLast
和 .MoveFirst
)获取记录集数组,然后您可以遍历该数组以找到您正在查找的 ID对于...
2) 同样的想法,只是在记录集中做...
此外,正如其他人之前提到的那样,新查询肯定会为您提供所需的值...
希望这对您有所帮助,
TheSilkCode
我知道这已经过时了,但我遇到了同样的问题并解决了。问题是记录集的指针不在 BOF 中,因此它找不到我要查找的值,因为它是指针的当前位置 "above"。 .Find 不会循环搜索整个记录集。
我通过在 .Find 行之前添加 rs.moveFirst 解决了这个问题。这解决了问题。
我非常渴望让这个微不足道的搜索工作:
rst2.Find "ID = '" & messID & "'"
我几乎尝试过任何组合,但从来没有 returns 搜索结果。整个代码将在这里:
Option Compare Database
Option Explicit
'Modul zum Updaten des Status eines Messmittels in der Stammdatenbank (Entnommen/Verfügbar)3
Public Function updateStatus()
Dim rst2 As ADODB.Recordset
Dim rst As ADODB.Recordset
Dim messID As String
Set rst = New ADODB.Recordset 'Stammdaten zur Bearbeitung öffnen
rst.ActiveConnection = CurrentProject.AccessConnection
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
rst.Open "Stammdaten"
rst.MoveFirst
Set rst2 = New ADODB.Recordset 'zur Bearbeitung öffnen
rst2.ActiveConnection = CurrentProject.AccessConnection
rst2.CursorType = adOpenKeyset
rst2.LockType = adLockOptimistic
rst2.Open "Verwendung"
Do While Not rst.EOF
messID = rst!ID
Debug.Print messID
rst2.Find "ID = '" & messID & "'"
If rst2.EOF = True Then 'Falls nicht vorhanden
Debug.Print "Keine Verwendung gefunden!"
Else
rst2.Sort = "Nr DESC"
rst2.MoveFirst
Debug.Print rst2!Status
End If
rst.MoveNext
Loop
rst.Close
rst2.Close
End Function
我错过了什么?我真的尝试了数百个不同的搜索字符串:(
您有一个 table-type 记录集,并且您正在按键搜索它。这是 Seek
方法而不是 Find
方法的典型 use-case。
据此:https://support.microsoft.com/en-us/kb/108149
The find methods (FindFirst, FindLast, FindNext, and FindPrevious) apply to Dynasets and Snapshots but not to Table objects. Conversely, the Seek method is available only on the Table object.
尽管该页面似乎更关注 DAO 而不是 ADO,但同样的逻辑应该适用于这两种情况。
我认为你应该尝试 Seek
方法 https://msdn.microsoft.com/en-us/library/ms675109(v=vs.85).aspx
rst2.Seek "=", messID
If rst2.NoMatch Then ' not found ...
我不经常使用ADO,但我有2个想法都不是很优雅-
1) Application.WorksheetFunction.Transpose(rst2.GetRows)
(确保首先使用 .MoveLast
和 .MoveFirst
)获取记录集数组,然后您可以遍历该数组以找到您正在查找的 ID对于...
2) 同样的想法,只是在记录集中做...
此外,正如其他人之前提到的那样,新查询肯定会为您提供所需的值...
希望这对您有所帮助, TheSilkCode
我知道这已经过时了,但我遇到了同样的问题并解决了。问题是记录集的指针不在 BOF 中,因此它找不到我要查找的值,因为它是指针的当前位置 "above"。 .Find 不会循环搜索整个记录集。
我通过在 .Find 行之前添加 rs.moveFirst 解决了这个问题。这解决了问题。