registros registro para nuevo macro insertar formulario docmd desde crear ms-access vba clone recordset

ms-access - para - ir a nuevo registro access vba



¿Por qué clonar un conjunto de registros MS-Access? (4)

Soy un novato en VBA e intento entender el código de otra persona.

Establecer rstClone = Me.RecordsetClone
rstClone.MoveFirst

¿Por qué el conjunto de registros debe ser clonado? ¿Por qué el código no puede ser Me.Recordset.MoveFirst?


El uso de la propiedad del juego de registros puede causar un comportamiento involuntario. Específicamente (en Access 2010), si hace referencia a me.recordset, inesperadamente puede provocar que se guarde el búfer de edición del formulario.

Ex.:

debug.print me.recordset.recordcount

hará que se guarde el registro del formulario. El uso de recordsetClone no mostrará este comportamiento incorrecto.


En primer lugar, el conjunto de registros no se clona: el clon Recordset del formulario existe mientras haya un origen de registros, incluso si no contiene registros.

En segundo lugar, el recordetclone es un conjunto de registros independiente que puede navegar y no tener un efecto en el búfer de edición del formulario, que tiene un conjunto independiente de punteros de registro (es decir, marcadores).

Dicho esto, no tiene sentido establecer una variable de conjunto de registros para el registroetclone. En cambio, solo usa un bloque CON:

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

La alternativa que usa la configuración de una variable de conjunto de registros se ve así:

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

Tenga en cuenta también que desde Access 2000, el formulario también tiene un objeto Recordset además de RecordsetClone. Ese objeto le da acceso al búfer de edición real del formulario, y la navegación a través de él cambia el puntero del registro en el formulario mismo. Sin embargo, evitaría usarlo, ya que la indirección de usar un objeto idéntico separado que es un conjunto de datos similares parece una capa útil de protección para no hacer cosas que uno no debería hacer.


Es posible que desee utilizar el recordetclone porque no desea afectar los registros que se muestran en el formulario, lo que me.recordset.movefirst haría.


Tenga en cuenta que los conjuntos de registros han llamado un método de clonación. Esto es diferente, entonces, el registro de formularios establece el clon.

En su ejemplo y pregunta estamos hablando de los datos subyacentes en los que se basa el formulario.

Si va a jugar y moverse a través de registros usando el código en el que se basa un formulario, pero no desea que la pantalla del formulario o la interfaz gráfica lo siga o salte, entonces su ejemplo es el correcto y preferido forma de lograr esto.

Entonces, record set clone es una copia de los datos de formularios. Le permite mover o recorrer registros en ese conjunto de registros, pero el formulario (la interfaz de usuario) no sigue su movimiento a través de los registros.

Recuerde que, en algunos casos, si de hecho desea que el formulario se mueva al siguiente registro, entonces no usaría los registros configurados clonar, sino que usaría el conjunto de registros actual.

P.ej:

Set rstClone = me.recordset rstClone.movenext

En lo anterior, el formulario se moverá al siguiente registro.

Una situación típica es cuando usa subformularios. Si desea totalizar o recorrer los 10 registros en esa subforma, puede hacerlo sin afectar o causar el registro visual actual que la subforma actualmente apunta a cambiar. Te permite hacer cosas detrás de escena, por así decirlo.

Sin embargo, si solo desea pasar a los formularios del próximo registro, entonces no necesita ningún reocrdset o clon de conjunto de registros, puede simplemente ejecutar un comando que mueva el formulario al siguiente registro.

Puede usar el siguiente comando típico:

DoCmd.GoToRecord acActiveDataObject, , acNext

Y, no necesita recordset, o recordsetClone si quiere ver los valores en el código colocado en un formulario, puede ir a:

me!nameOfCollumFromTable