Compartir a través de


Trabajar con conjuntos de registros

El objeto Recordset tiene características integradas que permiten reorganizar el orden de los datos en el conjunto de resultados, para buscar un registro específico en función de los criterios que proporcione e incluso optimizar esas operaciones de búsqueda mediante índices. Si estas características están disponibles para su uso dependen del proveedor y, en algunos casos, como la de la propiedad Index, la estructura del propio origen de datos.

Organizar datos

Con frecuencia, la manera más eficaz de ordenar los datos en el Recordset es especificando una cláusula ORDER BY en el comando SQL que se usa para devolver los resultados. Sin embargo, es posible que tenga que cambiar el orden de los datos en un Recordset que ya se ha creado. Puede usar la propiedad Sort para establecer el orden en el que se atraviesan las filas de un Recordset. Además, la propiedad Filter determina a qué filas se puede acceder al recorrer filas.

La propiedad Sort establece o devuelve un valor String que indica los nombres de campo del Recordset en el que se va a ordenar. Cada nombre está separado por una coma y, opcionalmente, va seguido de un espacio y la palabra clave ASC, que ordena el campo en orden ascendente o DESC, que ordena el campo en orden descendente. De forma predeterminada, si no se especifica ninguna palabra clave, el campo se ordena en orden ascendente.

La operación de ordenación es eficaz porque los datos no se reorganizan físicamente, pero se accede a ellos en el orden especificado por un índice.

La propiedad Sort requiere que la propiedad CursorLocation se establezca en adUseClient. Se creará un índice temporal para cada campo especificado en la propiedad Sort si aún no existe un índice.

Al establecer la propiedad Sort en una cadena vacía, se restablecerán las filas a su orden original y se eliminarán los índices temporales. Los índices existentes no se eliminarán.

Supongamos que un objeto Recordset contiene tres campos denominados firstName, middleInitial y lastName. Establezca la propiedad Sort en la cadena "lastName DESC, firstName ASC", que ordenará el objeto Recordset por apellido en orden descendente y, a continuación, por nombre en orden ascendente. Se omite la inicial central.

Ningún campo al que se hace referencia en una cadena de criterios de ordenación se puede denominar "ASC" o "DESC" porque esos nombres entran en conflicto con las palabras clave ASC y DESC. Asigne un campo que tenga un nombre en conflicto con un alias mediante la palabra clave AS de la consulta que devuelve el Recordset.

Para obtener más información sobre el filtrado de Recordset, vea "Filtrado de los resultados" más adelante en este tema.

Búsqueda de un registro específico

ADO proporciona los métodos Find y Seek para buscar un registro determinado en un Recordset. El método Find es compatible con una variedad de proveedores, pero está limitado a un único criterio de búsqueda. El método Seek admite la búsqueda en varios criterios, pero no es compatible con muchos proveedores.

Los índices de los campos pueden mejorar considerablemente el rendimiento del método Find y las propiedades Sort y Filter del objeto Recordset. Puede crear un índice interno para un objeto Field estableciendo su propiedad Optimize dinámica. Esta propiedad dinámica se agrega a la colección Properties del objeto Field al establecer la propiedad CursorLocation en adUseClient. Recuerde que este índice es interno para ADO: no puede obtener acceso a él ni usarlo para ningún otro propósito. Además, este índice es distinto de la propiedad Index del objeto Recordset.

El método Find busca rápidamente un valor dentro de una columna (campo) de un Recordset. Con frecuencia, puede mejorar la velocidad del método Find en una columna mediante la propiedad Optimize para crear un índice en ella.

El método Find limita la búsqueda al contenido de un campo. El método Seek requiere que tenga un índice y que también tenga otras limitaciones. Si debe buscar en varios campos que no son la base de un índice, o si el proveedor no admite índices, puede limitar los resultados mediante la propiedad Filter del objeto Recordset.

Find

El método Find busca un Recordset para la fila que cumple un criterio especificado. Opcionalmente, se puede especificar la dirección de la búsqueda, la fila inicial y el desplazamiento desde la fila inicial. Si se cumple el criterio, la posición de fila actual se establece en el registro encontrado; de lo contrario, la posición se establece en el final (o inicio) del Recordset, en función de la dirección de búsqueda.

Solo se puede especificar un nombre de una sola columna para el criterio. En otras palabras, este método no admite búsquedas de columnas múltiples.

El operador de comparación del criterio puede ser ">" (mayor que), "<" (menor que), "=" (igual), ">=" (mayor o igual que), "<=" (menor o igual que), "<>" (no igual) o "LIKE" (coincidencia de patrones).

El valor del criterio puede ser una cadena, un número de punto flotante o una fecha. Los valores de cadena se delimitan con comillas simples o marcas "#" (signo de número) (por ejemplo, "state = 'WA'" o "state = #WA#"). Los valores de fecha se delimitan con marcas "#" (signo de número) (por ejemplo, "start_date > #7/22/97#").

Si el operador de comparación es "like", el valor de cadena puede contener un asterisco (*) para buscar una o varias repeticiones de cualquier carácter o subcadena. Por ejemplo, "state like 'M*'" coincide con Maine y Massachusetts. También puede usar asteriscos iniciales y finales para buscar una subcadena contenida en los valores. Por ejemplo, "state like '*as*'" coincide con Alaska, Arkansas y Massachusetts.

Los asteriscos solo se pueden usar al final de una cadena de criterios o juntos al principio y al final de una cadena de criterios, como se muestra anteriormente. No se puede usar el asterisco como carácter comodín inicial ('*str') o comodín incrustado ('s*r'). Esto provocará un error.

Búsqueda e índice

Utilice el método Seek junto con la propiedad Index si el proveedor subyacente admite índices en el objeto Recordset. Use el método Supports(adSeek) para determinar si el proveedor subyacente admite Seek y el método Supports(adIndex) para determinar si el proveedor admite índices. (Por ejemplo, el proveedor OLE DB para Microsoft Jet admite Seek e Index).

Si Seek no encuentra la fila deseada, no se produce ningún error y la fila se coloca al final del objeto Recordset. Establezca la propiedad Index en el índice deseado antes de ejecutar este método.

Este método solo se admite con cursores del lado servidor. Seek no se admite cuando el valor de la propiedad CursorLocation del objeto Recordset es adUseClient.

Este método solo se puede usar cuando el objeto Recordset se ha abierto con un valor CommandTypeEnum de adCmdTableDirect.

Filtrado de los resultados

El método Find limita la búsqueda al contenido de un campo. El método Seek requiere que tenga un índice y que también tenga otras limitaciones. Si debe buscar en varios campos que no son la base de un índice, o si el proveedor no admite índices, puede limitar los resultados mediante la propiedad Filter del objeto Recordset.

Utilice la propiedad Filter para filtrar de forma selectiva los registros de un objeto Recordset. El Recordset filtrado se convierte en el cursor actual, lo que significa que los registros que no cumplen los criterios de Filter no están disponibles en el Recordset hasta que se quite Filter. Otras propiedades que devuelven valores basados en el cursor actual se ven afectadas, como AbsolutePosition, AbsolutePage, RecordCount y PageCount. Esto se debe a que establecer la propiedad Filter en un valor específico moverá el registro actual al primer registro que satisfaga el nuevo valor.

La propiedad Filter toma un argumento variant. Este valor representa uno de los tres métodos para usar la propiedad Filter: una cadena criteria, una constante FilterGroupEnum o una matriz de marcadores. Para obtener más información, vea Filtrado con una cadena de criterios, Filtrado con una constante y Filtrado con marcadores más adelante en este tema.

Nota:

Cuando conoce los datos que desea seleccionar, suele ser más eficaz abrir un objeto Recordset con una instrucción SQL que filtre eficazmente el conjunto de resultados, en lugar de confiar en la propiedad Filter .

Para quitar un filtro de un Recordset, use la constante adFilterNone. Establecer la propiedad Filter en una cadena de longitud cero ("") tiene el mismo efecto que el uso de la constante adFilterNone.

Filtrado con una cadena de criterios

La cadena criteria consta de cláusulas con el formato FieldName Operator Value (por ejemplo, "LastName = 'Smith'"). Puede crear cláusulas compuestas mediante la concatenación de cláusulas individuales con AND (por ejemplo, "LastName = 'Smith' AND FirstName = 'John'") y OR (por ejemplo, "LastName = 'Smith' OR LastName = 'Jones'"). Siga las instrucciones que se detallan a continuación para especificar el nombre del servidor:

  • FieldName debe ser un nombre de campo válido del objeto Recordset. Si el nombre del modelo de minería de datos contiene espacios, debe escribirse entre corchetes.

  • El operador debe ser uno de los siguientes: <, >,<=, >=, <>, =o LIKE.

  • Value es el valor con el que comparará los valores de campo (por ejemplo, 'Smith', #8/24/95#, 12.345o $50.00). Utilice comillas simples (') con cadenas y signos de libra (#) con fechas. En el caso de los números, puede usar puntos decimales, signos de dólar y notación científica. Si Operator es LIKE, Value puede usar caracteres comodín. Solo se permiten los caracteres comodín asterisco (*) y porcentaje (%) y deben ser el último carácter de la cadena. Value no puede ser null.

    Nota:

    Para incluir comillas simples (') en el valor del filtro, use dos comillas simples para representar una. Por ejemplo, para filtrar por O'Malley, la cadena de criterios debe ser "col1 = 'O''Malley'". Para incluir comillas simples al principio y al final del valor del filtro, incluya la cadena en signos de libra (#). Por ejemplo, para filtrar por '1', la cadena de criterios debe ser "col1 = #'1'#".

No hay prioridad entre ANDy OR. Las cláusulas se pueden agrupar entre paréntesis. Sin embargo, no se pueden agrupar cláusulas unidas por un OR y, a continuación, unir el grupo a otra cláusula con un AND, como se indica a continuación.

(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'  

En su lugar, construiría este filtro de la siguiente manera.

(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')  

En una cláusula LIKE, puede usar un carácter comodín al principio y al final del patrón (por ejemplo, LastName Like '*mit*') o solo al final del patrón (por ejemplo, LastName Like 'Smit*').

Filtrado con una constante

Las siguientes constantes están disponibles para filtrar Recordsets.

Constante Descripción
adFilterAffectedRecords Filtra solo los registros afectados por la última llamada a Delete, Resync, UpdateBatch o CancelBatch.
adFilterConflictingRecords Filtra para ver los registros con errores en la última actualización por lotes.
adFilterFetchedRecords Filtra para ver los registros en la memoria caché actual; es decir, los resultados de la última llamada para recuperar registros de la base de datos.
adFilterNone Quita el filtro actual y restaura todos los registros para su visualización.
adFilterPendingRecords Filtra para ver solo los registros que han cambiado, pero que aún no se han enviado al servidor. Solo se aplica al modo de actualización por lotes.

Las constantes de filtro facilitan la resolución de conflictos de registros individuales durante el modo de actualización por lotes al permitirle ver, por ejemplo, solo los registros afectados durante la última llamada al método UpdateBatch, como se muestra en el ejemplo siguiente.

Attribute VB_Name = "modExaminingData"

Filtrado con marcadores

Por último, puede pasar una matriz variant de marcadores a la propiedad Filter. El cursor resultante contendrá solo los registros cuyo marcador se pasó a la propiedad. En el ejemplo de código siguiente se crea una matriz de marcadores a partir de los registros de un Recordset que tienen una "B" en el campo ProductName. A continuación, pasa la matriz a la propiedad Filter y muestra información sobre el Recordset filtrado resultante.

'BeginFilterBkmk  
Dim vBkmkArray() As Variant  
Dim i As Integer  
  
'Recordset created using "SELECT * FROM Products" as command.  
'So, we will check to see if ProductName has a capital B, and  
'if so, add to the array.  
i = 0  
Do While Not objRs.EOF  
    If InStr(1, objRs("ProductName"), "B") Then  
        ReDim Preserve vBkmkArray(i)  
        vBkmkArray(i) = objRs.Bookmark  
        i = i + 1  
        Debug.Print objRs("ProductName")  
    End If  
    objRs.MoveNext  
Loop  
  
'Filter using the array of bookmarks.  
objRs.Filter = vBkmkArray  
  
objRs.MoveFirst  
Do While Not objRs.EOF  
    Debug.Print objRs("ProductName")  
    objRs.MoveNext  
Loop  
'EndFilterBkmk  

Creación de un clon de un conjunto de registros

Use el método Clone para crear varios objetos Recordset duplicados, especialmente si desea mantener más de un registro actual en un conjunto determinado de registros. El uso del método Clone es más eficaz que crear y abrir un nuevo objeto Recordset con la misma definición que el original.

El registro actual de un clon recién creado se establece originalmente en el primer registro. El puntero de registro actual de un Recordset clonado no se sincroniza con el original o viceversa. Puede navegar de forma independiente en cada Recordset.

Los cambios realizados en un objeto Recordset son visibles en todos sus clones independientemente del tipo de cursor. Sin embargo, después de ejecutar Requery en el Recordset original, los clones ya no se sincronizarán con el original.

Cerrar el Recordset original no cierra sus copias, ni cierra una copia cierra el original o ninguna de las demás copias.

Solo puede clonar un objeto Recordset si admite marcadores. Los valores de marcador son intercambiables; es decir, una referencia de marcador de un objeto Recordset hace referencia al mismo registro en cualquiera de sus clones.