#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