Зачем клонировать набор записей MS-Access? - PullRequest
6 голосов
/ 02 марта 2010

Я новичок в VBA и пытаюсь понять чужой код.

Set rstClone = Me.RecordsetClone
rstClone.MoveFirst

Почему набор записей должен быть клонирован? Почему код не может быть Me.Recordset.MoveFirst?

Ответы [ 4 ]

7 голосов
/ 03 марта 2010

Во-первых, набор записей не клонирован - форма набора записей 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.Этот объект дает вам доступ к фактическому буферу редактирования формы, и навигация по нему изменяет указатель записи в самой форме.Однако я бы не стал его использовать, поскольку косвенное использование отдельного идентичного объекта, представляющего собой набор из тех же данных, кажется полезным уровнем защиты от действий, которые не следует делать.

7 голосов
/ 02 марта 2010

Возможно, вы захотите использовать набор записей clone, потому что не хотите влиять на записи, отображаемые в форме, что может сделать me.recordset.movefirst.

4 голосов
/ 03 марта 2010

Имейте в виду, что в наборах записей есть метод клонирования. Это отличается от клона набора записей форм.

В вашем примере и вопросе мы говорим о базовых данных, на которых основана форма.

Если вы собираетесь играть и просматривать записи, используя код, на котором основана форма, но вы не хотите, чтобы отображение формы или графический интерфейс следовали за вами или перепрыгивали, тогда ваш пример - правильный и предпочтительный способ сделать это.

Итак, клон набора записей является копией данных форм. Он позволяет вам перемещать или проходить записи в этом наборе записей, но форма (пользовательский интерфейс) не соответствует перемещению по записям.

Помните, что в некоторых случаях, если вы действительно хотите, чтобы форма перемещалась к следующей записи, вы не будете использовать клон набора записей, а будете использовать фактический набор записей.

Например:

Set rstClone  = me.recordset
rstClone.movenext

В приведенном выше примере форма переместится на следующую запись.

Типичная ситуация, когда вы используете подформы. Если вы хотите суммировать или проследить 10 записей в этой форме, вы можете сделать это, не затрагивая и не вызывая текущую отображаемую запись, которую в данный момент указывает форма. Это позволяет вам делать вещи за кулисами, так сказать.

Однако, если вы просто хотите перейти к следующей записи формы, вам не потребуется ни reocrdset, ни клон набора записей, вы можете просто выполнить команду, которая перемещает форму к следующей записи.

Вы можете использовать следующую типичную команду:

DoCmd.GoToRecord acActiveDataObject, , acNext

И вам не нужен набор записей или recordsetClone, если вы хотите просмотреть значения в коде, помещенном в форму, вы можете просто пойти:

me!nameOfCollumFromTable
0 голосов
/ 22 августа 2014

Использование свойства набора записей может привести к непреднамеренному поведению. В частности (в Access 2010), если вы ссылаетесь на me.recordset, это может неожиданно вызвать сохранение буфера редактирования формы.

Ex:.

debug.print me.recordset.recordcount

приведет к сохранению записи формы. Использование recordsetClone не будет демонстрировать это [неправильное] поведение.

...