powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset.MoveNext и Recordset.EOF непонятное мне поведение
9 сообщений из 9, страница 1 из 1
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913705
AM_ufu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня, уважаемые форумчане,

Помогите плиз разобратся с проблемкой. Есть небольшой цикл, в котором пробегаясь по рекордсету, программа сравнивает дату и время текущей записи и дату и время следующей записи. Если разница больше пяти минут, делаются нужные действия. Для получения даты из следующей записи внутри цикла я перехожу на следующую запись, беру значение даты и возвращаюсь на одну запись назад. Если текущая запись последняя, и EOF возвращает тру - то переменной даты следующей записи присваивается значение даты текущей записи. Но на последней записи программа выдает ошибку. То есть rst.EOF выдает постоянно false. Хотя как я понимаю, должен бы возвратить true.

вот код цикла.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
        Do Until rst.EOF
            
            dFirstDate = rst!DateInf
            
            If Not rst.EOF Then

                Debug.Print rst.EOF
           'на последней записи здесь проблема.
                rst.MoveNext

                If Not rst.EOF Then
                    dSecondDate = rst!DateInf
                    rst.MovePrevious
                End If
            Else
                dSecondDate = dFirstDate
            End If
            
            If DateDiff("n", dFirstDate, dSecondDate) > 5 Then
                lLoadId = lLoadId + 1
            

            rst.MoveNext
        Loop



Просветите, что не так.
...
Рейтинг: 0 / 0
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913725
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AM_ufu,

Код: vbnet
1.
2.
3.
Debug.Print rst.EOF
           'на последней записи здесь проблема.
                rst.MoveNext



Ещё бы не было проблемы.. EOF это не последняя запись, а запись которая идёт после последней. То есть пустая служебная строка , которая предназначена для заполнения данными. Если ее пытаться вывести ,то выпадет ошибка.
Смотрите вкратце как устроен набор данных:
BOF
Первая запись
Вторая запись
Запись N
Последняя запись
EOF
...
Рейтинг: 0 / 0
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913746
AM_ufu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Лалов
AM_ufu,

Код: vbnet
1.
2.
3.
Debug.Print rst.EOF
           'на последней записи здесь проблема.
                rst.MoveNext



Ещё бы не было проблемы.. EOF это не последняя запись, а запись которая идёт после последней. То есть пустая служебная строка , которая предназначена для заполнения данными. Если ее пытаться вывести ,то выпадет ошибка.
Смотрите вкратце как устроен набор данных:
BOF
Первая запись
Вторая запись
Запись N
Последняя запись
EOF


Как тогда проверить, есть ли ещё записи после текущей?
...
Рейтинг: 0 / 0
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913751
AM_ufu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я к тому, что если после последней записи есть "техническая" запись EOF то я должен бы переместится на неё и получить значение Истина на EOF. Но я не получаю его.
...
Рейтинг: 0 / 0
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913756
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AM_ufu
Есть небольшой цикл, в котором пробегаясь по рекордсету, программа сравнивает дату и время текущей записи и дату и время следующей записи. Если разница больше пяти минут, делаются нужные действия.


Записи то хоть в наборе отсортированы по времени? А то каша будет еще та...
...
Рейтинг: 0 / 0
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913758
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Схематично:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SET rs1=db.openrecordset("SELECT ... ORDER BY DateInf")
SET rs2=rs1.Clone
rs1.MoveFirst
rs2.MoveFirst
rs2.MoveNext

Do Until rs2.EOF
    If rs2!DateInf - rs1!DateInf > "5 минут" Then
        ' делаем чего надо
    Else
        ' делаем чего не надо
    End If
    rs1.MoveNext
    rs2.MoveNext
Loop
...
Рейтинг: 0 / 0
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913773
AM_ufu, для этой задачи удобнее методом GetRows выгрузить данные в двумерный массив, а там в цикле сравнивать значения текущего и предыдущего элементов.
Код: vbnet
1.
2.
3.
4.
5.
6.
recArray = rec.GetRows  'или, например, rec.GetRows(1000000)
For i = LBound(recArray, 2)+1 To UBound(recArray, 2)
  If DateDiff("n", recArray(0, i-1), recArray(0, i)) > 5 Then
     lLoadId = lLoadId + 1
  End If
Next i

Выделенный цветом 0, это индекс первого поля в коллекции полей. Если DateInf не первое - поменяйте значение.
...
Рейтинг: 0 / 0
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913794
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AM_ufu
Я к тому, что если после последней записи есть "техническая" запись EOF то я должен бы переместится на неё и получить значение


то ты должен просто выйти из процедуры...
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Do Until rst.EOF
' запомнили дату
rst.MoveNext
If rst.EOF Then Exit Sub 'если последняя запись, выходим
' если не последняя, запомнили следующую дату
' If ..... если чё возвращаемся на шаг назад, делаем дела и идем на шаг вперед
'rst.MovePrevious
' делаем дела
'rst.MoveNext
' End If
rst.MoveNext
Loop



тоже схематично...
...
Рейтинг: 0 / 0
Recordset.MoveNext и Recordset.EOF непонятное мне поведение
    #39913891
AM_ufu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, всем кто откликнулся. Я переписал немного цикл и всё заработало.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
	Do Until rst.EOF
            
            dFirstDate = rst!DateInf
            
            rst.MoveNext
            
            If rst.EOF Then
                rst.MovePrevious
                dSecondDate = dFirstDate
            Else
                dSecondDate = rst!DateInf
                rst.MovePrevious
                               
            End If
            
            If DateDiff("n", dFirstDate, dSecondDate) > 5 Then
                lLoadId = lLoadId + 1
            
            End If
            
            rst.MoveNext
        Loop
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset.MoveNext и Recordset.EOF непонятное мне поведение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]