Зачем клонировать набор записей 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].