Набор записей.найти bof и eof оба равно false, даже если нет записи

#vba #ms-access

#vba #ms-access

Вопрос:

Я пытаюсь использовать набор записей ADODB.найдите метод, чтобы проверить, присутствует ли запись, и добавьте ее, если она отсутствует, и выполните другие действия, если она присутствует. Я упростил свой текущий код, но он выглядит примерно так:

      Do While Not (myValue < 4000)
            If Not (rstLocalItems.BOF) Then
                rstLocalItems.MoveFirst
            End If
            rstLocalItems.Find "ItemNo='" amp; myVal amp; "'"
            If rstLocalItems.EOF = True or rstLocalItems.BOF = True  Then


            Else

            'This value already exists do other stuff
             
             End if
             myValue = myValue   1
Loop
 

Когда значение не найдено, я вставляю значение в локальную таблицу, которую я полностью очищаю прямо сейчас, что означает, что никакие значения не должны быть найдены. Например, когда цикл находится в 35 состоянии, у меня есть все значения от 1 до 34, которые я вижу в таблице. Но когда оно равно 35, это говорит о том, что и EOF, и BOF являются ложными. Я ищу 35 в таблице, таблица имеет значение только до 34, поэтому EOF должен возвращать true.

Кроме того, когда я печатаю значение rstLocalItems(«myVal»), оно говорит 34, когда мой отладчик находится в строке:

 If rstLocalItems.EOF = True or rstLocalItems.BOF = True  Then
 

Это немного странно, потому что должно быть указано 1, по крайней мере, потому rstLocalItems.MoveFirst , что срабатывает, когда прямо перед строкой выше, когда я просматриваю код.

По какой-то причине, когда я устанавливаю для набора записей значение movefirst и ищу 35. Код считает, что ’34’ равно ’35’, и перемещает курсор в позицию, содержащую значение ’34’.

Может кто-нибудь помочь мне объяснить, почему это может происходить?

Комментарии:

1. Я предпочитаю DAO findFirst. Я никогда не использовал ADO Find. Можно использовать агрегатную функцию домена DLookup() просто для проверки, существует ли значение в таблице. Нет необходимости открывать набор записей.

2. Является ли ItemNo текстовым или числовым полем? Если это тип number, не следует использовать разделители апострофа.

3. У вас есть переменные myVal и myValue — почему? Должно быть Option Explicit в каждом заголовке модуля. Является ли myVal также полем в таблице?

Ответ №1:

Попробуйте пропустить проверку BOF. Кроме того, ItemNo, вероятно, не является текстом:

 Do While myValue < 4000
    rstLocalItems.MoveFirst
    rstLocalItems.Find "ItemNo = " amp; myVal amp; ""
    If rstLocalItems.EOF = True Then
        ' No match.
    Else
        ' This value already exists do other stuff
    End if
    myValue = myValue   1
Loop