Otras formas de mover en un conjunto de registros
Los cuatro métodos siguientes se usan para desplazarse, o moverse, en el objeto Recordset: MoveFirst, MoveLast, MoveNext y MovePrevious. (Algunos de estos métodos no están disponibles en cursores de solo avance).
MoveFirst cambia la posición del registro actual al primer registro del objeto Recordset. MoveLast cambia la posición del registro actual al último registro del objeto Recordset. Para usar MoveFirst o MoveLast, el objeto Recordset debe admitir marcadores o movimiento de cursor hacia atrás; de lo contrario, la llamada al método generará un error.
MoveNext mueve la posición del registro actual en un solo lugar hacia delante. Si está en el último registro al llamar a MoveNext, EOF se establecerá en True. MovePrevious mueve la posición del registro actual en un lugar hacia atrás. Si está en el primer registro al llamar a MovePrevious, BOF se establecerá en True. Es aconsejable comprobar las propiedades EOF y BOF al usar estos métodos y volver a mover el cursor a una posición de registro actual válida si se mueve cualquiera de los extremos del objeto Recordset, como se muestra aquí:
. . .
oRs.MoveNext
If oRs.EOF Then oRs.MoveLast
. . .
O bien, en el caso del método MovePrevious :
. . .
oRs.MovePrevious
If oRs.BOF Then oRs.MoveFirst
. . .
En los casos en los que el objeto Recordset se ha filtrado o ordenado y se cambian los datos del registro actual, la posición también puede cambiar. En tales casos, el método MoveNext funciona normalmente, pero tenga en cuenta que la posición se mueve un registro hacia delante de la nueva posición, no la posición antigua. Por ejemplo, cambiar los datos del registro actual, de modo que el registro se mueve al final del objeto Recordset ordenado, significaría que llamar a MoveNext da como resultado que ADO establezca el registro actual en la posición después del último registro del objeto Recordset (EOF = True).
El comportamiento de los distintos métodos Move del objeto Recordset depende, en cierta medida, de los datos del objeto Recordset. Los nuevos registros agregados al objeto Recordset se agregan inicialmente en un orden determinado, que se define mediante el origen de datos y pueden depender implícita o explícitamente de los datos del nuevo registro. Por ejemplo, si se realiza una ordenación o una combinación dentro de la consulta que rellena el objeto Recordset, el nuevo registro se insertará en el lugar adecuado dentro del objeto Recordset. Si el orden no se especifica explícitamente al crear el objeto Recordset, los cambios en la implementación del origen de datos pueden hacer que la ordenación de las filas devueltas cambie accidentalmente. Además, las funciones de ordenación, filtrado y edición del objeto Recordset pueden afectar al orden y, posiblemente, a qué filas del conjunto de registros estarán visibles.
Por lo tanto, MoveNext, MovePrevious, MoveFirst, MoveLast y Move son todos sensibles a otras operaciones realizadas en el mismo objeto Recordset. ADO siempre intentará mantener su posición actual hasta que la mueva explícitamente, pero a veces, los cambios que intervienen dificultan comprender los efectos de un movimiento posterior. Por ejemplo, si llama a MoveFirst para colocar en la primera fila de un objeto Recordset ordenado y cambia la ordenación de orden ascendente a orden descendente, todavía está en la misma fila, pero ahora es la última fila del objeto Recordset. MoveFirst le llevará a otra fila (la nueva primera fila).
Como otro ejemplo, si está colocado en una fila determinada en medio de un objeto Recordset y llama a Delete y, a continuación, llama a MoveNext, ahora está en el registro inmediatamente después del registro eliminado. Sin embargo, al llamar a MovePrevious, el registro anterior al que eliminó el registro actual, ya que el registro eliminado ya no se cuenta en la pertenencia activa del objeto Recordset.
Es especialmente difícil definir la semántica de movimiento coherente en todos los proveedores para los métodos que se mueven en relación con el registro actual (MovePrevious, MoveNext y Move) frente a los cambios de datos en el registro actual. Por ejemplo, si está trabajando con un objeto Recordset ordenado, filtrado y cambia los datos del registro actual para que preceda a todos los demás registros, pero los datos modificados ya no coinciden con el filtro, no queda claro dónde debería llevarle una operación MoveNext. La conclusión más segura es que el movimiento relativo dentro de un Recordset es más arriesgado que el movimiento absoluto (por ejemplo, el uso de MoveFirst o MoveLast) cuando los datos cambian mientras se editan, agregan o eliminan los registros. La ordenación y el filtrado deben basarse en una clave principal o un identificador, ya que este tipo de valor no debe cambiar.