2010-03-02 26 views
6

Soy un novato en VBA e intento entender el código de otra persona.¿Por qué clonar un conjunto de registros MS-Access?

Conjunto rstClone = Me.RecordsetClone
rstClone.MoveFirst

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

+2

Tenga en cuenta que .recordsetClone solo está disponible con los conjuntos de registros DAO. Llamar a esta propiedad en un formulario con un conjunto de registros ADODB dará lugar a un error en el tiempo de ejecución (aunque no se detectó en el momento de la compilación) –

Respuesta

7

Puede desear utilizar el recordetclone porque no desea afectar los registros mostrados en el formulario, lo que me.recordset.movefirst haría.

7

En primer lugar, el conjunto de registros es no clonado - el Recordsetclone del formulario existe mientras haya un origen de registros, incluso si no contiene registros.

En segundo lugar, el recordsetclone 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 en el registroetclone. En su lugar, sólo tiene que utilizar un bloque 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 

La alternativa de usar la configuración de una variable de registros es el siguiente:

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 de conjunto de registros, además de el 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.

4

Tenga en cuenta que los conjuntos de registros han llamado a 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 recorrer registros utilizando 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 la forma correcta y preferida de lograr esto.

Por lo tanto, el clon del conjunto de registros es una copia de los datos de los 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 pase al siguiente registro, entonces no usaría los registros establecidos, clone, pero Use el conjunto de registros actual.

Ej:

Set rstClone = me.recordset 
rstClone.movenext 

En lo anterior, la forma sería luego pasar 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 al formulario siguiente registro, entonces no necesita ni reocrdset ni clon de conjunto de registros, puede simplemente ejecutar un comando que mueva el formulario al siguiente registro.

Se puede usar el siguiente comando típica:

DoCmd.GoToRecord acActiveDataObject, , acNext 

Y, que no necesita de registros, o si RecordSetClone querer mirar a los valores de código que se coloca en un formulario, puede ir:

me!nameOfCollumFromTable 
0

El uso de la propiedad del conjunto de registros puede provocar 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.

Ej .:

debug.print me.recordset.recordcount 

hará que el registro del formulario para ser salvado. El uso de recordsetClone no mostrará este comportamiento incorrecto.

Cuestiones relacionadas