Почему клон Доступ MS recordset?

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

Набор rstClone = Я. RecordsetClone
rstClone. MoveFirst

Почему recordset должен быть клонирован? Почему код не может быть Я. Recordset. MoveFirst?

6
задан dmr 2 March 2010 в 20:04
поделиться

3 ответа

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

7
ответ дан 8 December 2019 в 12:58
поделиться

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

7
ответ дан 8 December 2019 в 12:58
поделиться

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

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

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

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

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

Например:

Set rstClone  = me.recordset
rstClone.movenext

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

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

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

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

DoCmd.GoToRecord acActiveDataObject, , acNext

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

me!nameOfCollumFromTable
4
ответ дан 8 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: