Зачем клонировать набор записей MS-Access?
Я новичок в VBA и пытаюсь понять чужой код.
установить rstClone = Me.RecordsetClone
rstClone.MoveFirst
Почему набор записей должен быть клонирован? Почему код не может быть мной?Набор записей.MoveFirst?
4 ответов
вы можете использовать recordsetclone, потому что вы не хотите влиять на записи, отображаемые в форме, которую я.набор записей.movefirst будет делать.
во-первых, набор записей не cloned -- Recordsetclone формы существует до тех пор, пока существует источник записей, даже если он не содержит записей.
во-вторых, recordsetclone-это независимый набор записей, который вы можете перемещаться и не влиять на буфер редактирования формы, который имеет независимый набор указателей записи (т. е. закладки).
тем не менее, довольно бессмысленно устанавливать переменную набора записей в recordsetclone. Вместо этого просто используйте a с блоком:
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. Этот объект предоставляет доступ к фактическому буферу редактирования формы, а навигация по нему изменяет указатель записи в самой форме. Я бы не использовать его, как косвенного использования отдельных одинаковых объекта, который является динамическим подмножеством того же данные кажутся полезным слоем защиты от того, что делать не следует.
имейте в виду, что наборы записей, который называется метод clone. Это отличается от клона набора записей forms.
в вашем примере и вопрос, мы говорим о базовых данных, на основе форм.
Если вы собираетесь играть и перемещаться по записям с помощью кода, на котором основана форма, но вы не хотите, чтобы дисплей формы или графический интерфейс следовали за вами или прыгали, то ваш пример является правильным и предпочтительным способом добиться этого.
таким образом, набор записей clone является копией данных форм. Он позволяет перемещать или пересекать записи в этом наборе записей, но форма (пользовательский интерфейс) не следует за перемещением записей.
помните, что в некоторых случаях, если вы действительно хотите, чтобы форма переместилась на следующую запись, вы не будете использовать набор записей clone, а использовать фактический набор записей.
например:
Set rstClone = me.recordset
rstClone.movenext
В выше, затем форма перемещается на следующая запись.
типичная ситуация, когда вы используете вложенные формы. Если вы хотите суммировать или пересечь 10 записей в этой подформе, вы можете сделать это, не затрагивая или не вызывая текущую отображаемую запись, на которую в настоящее время указывает подформа. Это позволяет делать вещи за кулисами, так сказать.
однако, если вы просто хотите перейти к следующей записи форм, то вам не нужен ни reocrdset, ни recordset clone, вы можете просто выполнить команду, которая перемещает форму к следующей записи.
вы можете использовать следующие стандартные команды :
DoCmd.GoToRecord acActiveDataObject, , acNext
и вам не нужен набор записей или recordsetClone если вы хотите посмотреть значения в коде, помещенном в форму, вы можете просто пойти:
me!nameOfCollumFromTable
использование свойства recordset может вызвать непреднамеренное поведение. В частности (в Access 2010), если вы ссылаетесь на меня.recordset, это может неожиданно привести к сохранению буфера редактирования формы.
Ex.:
debug.print me.recordset.recordcount
приведет к сохранению записи формы. Использование recordsetClone не будет демонстрировать это поведение [mis].