Как использовать несколько критериев с.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 этого не произойдет, если виновником не является первый случай.

Другие вопросы по тегам