Я - новичок в VBA и пытающийся понять чужой код.
Набор rstClone = Я. RecordsetClone
rstClone. MoveFirst
Почему recordset должен быть клонирован? Почему код не может быть Я. Recordset. MoveFirst?
Возможно, вы захотите использовать recordsetclone, поскольку вы не хотите влиять на записи, отображаемые в форме, что сделает me.recordset.movefirst.
Во-первых, набор записей не клонирован - Recordsetclone формы существует, пока существует источник записей, даже если он не содержит записей.
Во-вторых, recordsetclone - это независимый набор записей, по которому вы можете перемещаться и не влиять на буфер редактирования формы, который имеет независимый набор указателей записей (т. Е. Закладок).
Тем не менее, бессмысленно устанавливать переменную набора записей для recordsetclone. Вместо этого просто используйте блок WITH:
With Me.RecordsetClone
.FindFirst "[MyPK]=" & Me!cmbFindByPK
If Not .NoMatch Then
If Me.Dirty Then
Me.Dirty = False
End If
Me.Bookmark = .Bookmark
End If
End With
Альтернатива с использованием установки переменной набора записей выглядит так:
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
rs.FindFirst "[MyPK]=" & Me!cmbFindByPK
If Not rs.NoMatch Then
If Me.Dirty Then
Me.Dirty = False
End If
Me.Bookmark = rs.Bookmark
End If
Set rs = Nothing
Обратите внимание, что начиная с Access 2000 форма также имеет объект набора записей в дополнение к RecordsetClone. Этот объект дает вам доступ к фактическому буферу редактирования формы, и навигация по нему изменяет указатель записи в самой форме. Однако я бы избегал его использования, поскольку косвенное использование отдельного идентичного объекта, который представляет собой динамический набор одних и тех же данных, кажется полезным уровнем защиты от действий, которые не следует делать.
Имейте в виду, что наборы записей содержат метод клонирования. Это отличается от клона набора записей форм.
В вашем примере и вопросе мы говорим о базовых данных, на которых основана форма.
Если вы собираетесь играть и перемещаться по записям, используя код, на котором основана форма, но вы не хотите, чтобы отображение формы или графический интерфейс следовали за вами или прыгали, то ваш пример - правильный и предпочтительный способ сделать это.
Итак, клон набора записей - это копия данных формы.Это позволяет вам перемещать или перемещать записи в этом наборе записей, но форма (пользовательский интерфейс) не следует за вашим перемещением по записям.
Помните, что в некоторых случаях, если вы действительно хотите, чтобы форма переместилась к следующей записи, вы не будете использовать клон набора записей, а будете использовать фактический набор записей.
Например:
Set rstClone = me.recordset
rstClone.movenext
В приведенном выше примере форма переместится к следующей записи.
Типичная ситуация - использование подформ. Если вы хотите суммировать или просмотреть 10 записей в этой подформе, вы можете сделать это, не затрагивая и не вызывая изменения текущей отображаемой записи, на которую в данный момент указывает подформа. Это позволяет вам делать вещи, так сказать, за кулисами.
Однако, если вы просто хотите перейти к следующей записи формы, тогда вам не потребуется ни reocrdset, ни клон набора записей, вы можете просто выполнить команду, которая перемещает форму к следующей записи.
Вы можете использовать следующую типичную команду:
DoCmd.GoToRecord acActiveDataObject, , acNext
И вам не нужен набор записей или recordsetClone, если вы хотите просмотреть значения в коде, помещенном в форму, вы можете просто пойти:
me!nameOfCollumFromTable