Как намекнул Тим Уильямс, rstData.RecordCount
может быть неверным, пока вы не станете танцевать .MoveLast / .MoveFirst
. (См. Примечание 2)
Проверка для rstData.EOF
должна следовать непосредственно за .OpenRecordset
. Проверять на .BOF
здесь нет необходимости (автомобиль go культ).
Таким образом, код должен быть:
Set rstData = CurrentDb.OpenRecordset("Select * From Store_Stockouts")
If Not rstData.EOF Then
rstData.MoveLast
i = rstData.RecordCount
rstData.MoveFirst
v = rstData.GetRows(i)
Примечание:
Dim i, j, k, x, y As Integer
Это объявляет все как вариант, только y
будет целым.
Примечание 2:
Я считаю, что это может быть ошибкой, потому что это сработало для некоторых наборов записей, а не для других.
Это сделано специально. Аллен Браун объясняет это в 4. здесь: http://allenbrowne.com/ser-29.html
Для наборов записей, основанных на запросах, SQL операторах и прикрепленных таблицах, свойство RecordCount возвращает количество записей. доступ до сих пор. Когда вы впервые откроете OpenRecordset (), Access захватит первую запись и продолжит обработку вашего кода, пока загружаются остальные.
Итак, если вы протестируете RecordCount сразу после OpenRecordset, вы обычно получите 0 (если записей нет) или 1 (если есть, независимо от того, сколько будет загружено.)
Это не относится к наборам записей типа dbOpenTable (по умолчанию для локальных таблиц).
Решение:
Если вам нужно знать RecordCount, сначала используйте метод MoveLast. Это заставляет Access ждать, пока загрузятся все записи, поэтому RecordCount отражает весь набор записей.