Как не попасть на первую запись при запросе? - PullRequest
3 голосов
/ 11 февраля 2012

Создание формы в Access 2010. Я пытаюсь создать кнопку, которая переходит к следующей записи (или первой, если она в конце), но потому, что я хочу учитывать обновления других пользователей в наборе данных что произошло в то же время, я запрашиваю форму, прежде чем перейти к следующей записи.

Я использую следующий код, адаптированный из этого ТАК сообщения :

Private Sub NextRec_Click()

Dim currentID As Long

currentID = Me.id.Value


'Here is where the requery brings the form back to the first record
Me.Requery


With Me.RecordsetClone
    .FindFirst "id=" & currentID
    If Not .NoMatch Then
       If Me.Dirty Then
          Me.Dirty = False
       End If
       Me.Bookmark = .Bookmark
    End If
End With

If Me.CurrentRecord < Me.Recordset.RecordCount Then
    DoCmd.GoToRecord , , acNext
Else
    DoCmd.GoToRecord , , acFirst
End If


End Sub

Работает нормально, за исключением того, что .requery заставляет форму ненадолго вернуться к первой записи, прежде чем вернуться к текущей записи и затем перейти к следующей записи. Я не хочу, чтобы это делалось - есть ли способ сохранить текущую запись, отображаемую в форме, пока происходит .requery, вместо того, чтобы показывать первую запись в течение доли секунды, пока .FindFirst ищет запись на CurrentID?

Ответы [ 3 ]

3 голосов
/ 28 декабря 2017

Требуется набор записей, а не сама форма:

Me.Requery  '<-- resets the current record to the first one in the recordset
Me.Recordset.Requery  '<-- doesn't affect the current record
3 голосов
/ 11 февраля 2012

Извините, но я категорически против тех программистов, которые заново изобретают уже предоставленную кнопку NEXT.
Если вам нужно что-то сделать, когда пользователь переходит к следующей записи, используйте событие OnCurrent.Таким образом, вы также будете ловить клавиши Page Down, которые пользователи имеют право использовать.

Для меня этот код не нужен и трата ресурсов.Набор записей автоматически обновляется каждые n секунд с помощью Access (как указано в интервале обновления).

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


Отредактируйте, посмотрев собственный ответ @ sigil :
Просто идея уменьшить количествоОбновления набора записей, которые кажутся вам важными: вы можете сравнить Me.Recordset.RecordCount с dCount("*", Me.RecordSource) и запросить только тогда, когда они различаются.

1 голос
/ 11 февраля 2012

Итак, как Рему написал в комментариях под ответом iDevlop, обновление ODBC не показывает новые записи. Я подозреваю, что это проблема здесь, потому что форма получает свои данные из связанной таблицы.

Мне все еще нужно будет иметь свои собственные кнопки «Предыдущая / Следующая», потому что я хочу иметь возможность вернуться к первой записи, когда я пропущу последнюю запись. Но я изменил код; вместо того, чтобы запрашивать каждый раз, я проверяю, является ли запись последней, и запрашивает только тогда, когда я нажимаю Далее в последней записи или Prev в первой. Это решает проблему адекватно.

Изменен код для NextRec_Click следующим образом:

Private Sub NextRec_Click()

Dim currentID As Long

currentID = Me.id.Value

If Me.CurrentRecord = Me.RecordsetClone.RecordCount Then
    Me.Requery
    With Me.RecordsetClone
        .FindFirst "id=" & currentID
        If Not .NoMatch Then
           If Me.Dirty Then
              Me.Dirty = False
           End If
           Me.Bookmark = .Bookmark
        End If
    End With


    If Me.CurrentRecord < Me.Recordset.RecordCount Then
        DoCmd.GoToRecord , , acNext
    Else
        DoCmd.GoToRecord , , acFirst
    End If
Else
    DoCmd.GoToRecord , , acNext
End If

End Sub
...