Как использовать несколько критериев с.Find в VBA?
Я пытаюсь.FindLast для поиска конкретной записи, и она работала с одним критерием, но когда я попытался использовать.FindLast с несколькими критериями, он перестал работать. Тем не менее, я использую почти тот же оператор с.FindFirst, и он работает, поэтому я запутался.
Я получаю ошибку "Несоответствие типов данных в выражении критериев". И ошибка для этой строки: rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'"). Я прошел через мой код, и строка.FindFirst ("DONOR_CONTACT_ID= 'strDonor1' и ORDER_NUMBER = 'strOrderNum1'") работает правильно, однако.
Option Compare Database
Option Explicit
Public dbs As DAO.Database
Public rst As DAO.Recordset
Public rstOutput As DAO.Recordset
'Defines DAO objects
Public strDonor1 As Variant
Public strDonor2 As Variant
Public strRecip1 As Variant
Public strRecip2 As Variant
Public strOrderNum1 As Variant
Public strOrderNum2 As Variant
Public strLastDonor As Variant
Function UsingTemps()
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("T_RECIPIENT_SORT", dbOpenDynaset)
'rst refers to the table T_RECIPIENT_SORT
Set rstOutput = dbs.OpenRecordset("T_OUTPUT", dbOpenDynaset)
'rstOutput refers to the table T_OUTPUT
rst.MoveFirst
'first record
strDonor1 = rst!DONOR_CONTACT_ID
'sets strTemp1 to the first record of the DONOR_CONTACT_ID
strRecip1 = rst!RECIPIENT_CONTACT_ID
strOrderNum1 = rst!ORDER_NUMBER
rst.MoveNext
'moves to the next record
Do While Not rst.EOF
'Loop while it's not the end of the file
strDonor2 = rst!DONOR_CONTACT_ID
'strTemp2 = DONOR_CONTACT_ID from T_RECIPIENT_SORT
strRecip2 = rst!RECIPIENT_CONTACT_ID
strOrderNum2 = rst!ORDER_NUMBER
'Sets strRecip = RECIPIENT_CONTACT_ID FROM T_RECIPIENT_SORT
With rstOutput
'Uses T_OUTPUT table
If (strDonor1 = strDonor2) And (strOrderNum1 = strOrderNum2) Then
'Runs if temps have same DONOR_CONTACT ID
If .RecordCount > 0 Then
'If table has records then you can check
rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'")
strLastDonor = rst!RECIPIENT_CONTACT_ID
If strLastDonor = strRecip2 Then
Call LastDonor
Else
Call FirstDonor
End If
Else
'No records in T_Output so needs to add first record
.AddNew
!DONOR_CONTACT_ID = strDonor1
!RECIPIENT_1 = strRecip1
!ORDER_NUMBER = strOrderNum1
.Update
End If
Else
.FindFirst ("DONOR_CONTACT_ID= 'strDonor1' and ORDER_NUMBER= 'strOrderNum1'")
If .NoMatch Then
.AddNew
!DONOR_CONTACT_ID = strDonor1
!RECIPIENT_1 = strRecip1
!ORDER_NUMBER = strOrderNum1
.Update
End If
End If
End With
'Slides variables down
rst.FindFirst "[RECIPIENT_CONTACT_ID] = " & strRecip2
strDonor1 = strDonor2
strRecip1 = strRecip2
strOrderNum1 = strOrderNum2
rst.MoveNext
Loop
Call LastRecord
Set dbs = Nothing
Set rst = Nothing
Set rstOutput = Nothing
End Function
РЕДАКТИРОВАТЬ:
Я просто добавил следующий код:
Dim strFind As Variant
strFind = "DONOR_CONTACT_ID= '" & strDonor1 & "' AND ORDER_NUMBER= '" & strOrderNum1 & "'"
Debug.Print strFind
rst.FindLast strFind
Это отображалось с помощью Debug.Print:
DONOR_CONTACT_ID= '10136851341' AND ORDER_NUMBER= '112103071441001'
Это правильные значения для DONOR_CONTACT_ID и ORDER_NUMBER, но я получаю ошибку "Несоответствие типов данных в выражении критериев" со строкой rst.FindLast strFind. Может ли это быть потому, что я определил мои переменные как варианты? В таблице у меня DONOR_CONTACT_ID определен как десятичный с точностью до 11, RECIPIENT_CONTACT_ID определен как десятичный с точностью до 11, а ORDER_NUMBER как десятичный с точностью до 15. Затем я определяю переменные в своем коде как варианты. Как вы думаете, может быть проблема с этим?
2 ответа
Я думаю, что ваши усилия по устранению неполадок будут легче, если вы измените это...
rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'")
что-то вроде этого...
Dim strFind As String
strFind = "DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'"
Debug.Print strFind
rst.FindLast strFind
Когда код выдает ошибку, или просто не находит то, что вы ожидаете, перейдите в окно Immediate (Ctrl + g) и проверьте вывод из Debug.Print strFind
, Вы можете сразу определить проблему. Если нет, скопируйте Debug.Print
вывод, откройте новый запрос в конструкторе запросов, переключитесь на SQL View и используйте скопированный текст в WHERE
пункт. В этом случае, я думаю, что запрос SQL может быть:
SELECT *
FROM T_RECIPIENT_SORT
WHERE yadda_yadda;
Замените yadda_yadda текстом, который вы скопировали из окна Immediate.
Это было больше похоже на общий совет по устранению неполадок. Для этой конкретной проблемы, я думаю, вы строите Find
текст для включения имен переменных вместо значений этих переменных. Посмотрите, что вы получите, когда вы Debug.Print
эти 2 строковых выражения.
"DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'"
"DONOR_CONTACT_ID= '" & strDonor1 & "' AND ORDER_NUMBER= '" & strOrderNum1 & "'"
Ваш код использовал первое, но я думаю, что вам действительно нужно второе.
В обновлении вашего вопроса вы сообщили DONOR_CONTACT_ID
а также ORDER_NUMBER
оба числовых типа данных. В этом случае не заключайте в кавычки эти значения поиска в Find
строка.
"DONOR_CONTACT_ID= " & strDonor1 & " AND ORDER_NUMBER= " & strOrderNum1
Можем ли мы иметь некоторые недостающие данные, где DONOR_CONTACT_ID совпадает, но ORDER_NUMBER имеет значение Null? Я думаю, что Access выкинет ошибку, которую вы получаете из этой ситуации.
На FindFirst этого не произойдет, если виновником не является первый случай.