Compartir a través de


Método Recordset.Seek (DAO)

Se aplica a: Access 2013, Office 2013

Busca el registro en un objeto Recordset indexado de tipo tabla que satisface los criterios especificados para el índice actual y convierte a ese registro en el registro actual (espacios de trabajo de Microsoft Access solamente).

Sintaxis

expresión . Seek(Comparison, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13)

expression Variable que representa un objeto Recordset.

Parameters

Nombre

Obligatorio/opcional

Tipo de datos

Descripción

Comparación

Necesario

String

Una de las siguientes expresiones de cadena: <, <=, =, >=, o >.

Key1, Key2...Key13

Necesario

Variant

Uno o más valores correspondientes a campos en el índice actual del objeto Recordset, según lo especificado por su configuración de propiedad Index. Puede usar hasta 13 argumentos clave.

Comentarios

Debe establecer el índice activo con la propiedad Index antes de utilizar Seek. Si el índice identifica un campo clave no único, Seek localiza el primer registro que satisface los criterios.

El método Seek busca en los campos clave especificados y localiza el primer registro que satisface los criterios indicados por comparison y key1. Una vez encontrado, hace del registro el registro activo y establece la propiedad NoMatch en False. Si el método Seek no consigue encontrar coincidencias, la propiedad NoMatch se establece en True y el registro activo es indefinido.

Si comparison es igual que (=), mayor o igual que (>=), o mayor que (>), Seek comienza por el principio del índice y busca hacia delante.

Si comparison es menor que (<) o menor o igual que (<=), Seek comienza por el final del índice y busca hacia atrás. No obstante, si hay entradas de índice duplicadas al final del éste, Seek comienza en una entrada arbitraria entre las duplicadas y busca hacia atrás.

Debe especificar valores para todos los campos definidos en el índice. Si utiliza Seek con un índice de varias columnas y no especifica un valor de comparación para cada campo del índice, no puede utilizar el operador igual (=) en la comparación. Esto sucede porque algunos de los campos de criterios (key2, key3, etc.) tendrán el valor Null de forma predeterminada, lo que probablemente no coincidirá. Por lo tanto, el operador igual funcionará correctamente solo si tiene un registro que es todo null excepto la clave que está buscando. Se recomienda utilizar el operador mayor o igual que (>=) en su lugar.

El argumento key1 debe ser del mismo tipo de datos de campo que el campo correspondiente en el índice activo. Por ejemplo, si el índice activo se refiere a un número de campo (como ID de empleado), key1 debe ser numérico. De igual forma, si el índice activo se refiere a un campo de texto (como Apellido), key1 debe ser una cadena.

No es necesario que exista un registro actual cuando usa Seek.

Puede utilizar la colección Indexes para enumerar los índices existentes.

Para localizar un registro en un objeto Recordset de tipo dynaset o snapshot que cumpla una condición específica que no está cubierta por los índices existentes, use los métodos Find. Para incluir todos los registros, no solo los que cumplen una condición específica, use los métodos Move para desplazarse de un registro a otro.

No puede usar el método Seek en una tabla vinculada porque no puede abrir tablas vinculadas como objetos Recordset de tipo tabla. No obstante, si usa el método OpenDatabase para abrir directamente una base de datos (que no sea ODBC) ISAM instalable, puede usar Seek en las tablas de esa base de datos.

Ejemplo

Este ejemplo demuestra el método Seek al permitir al usuario buscar un producto según un número de ID.

    Sub SeekX() 
     
       Dim dbsNorthwind As Database 
       Dim rstProducts As Recordset 
       Dim intFirst As Integer 
       Dim intLast As Integer 
       Dim strMessage As String 
       Dim strSeek As String 
       Dim varBookmark As Variant 
     
       Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
       ' You must open a table-type Recordset to use an index, 
       ' and hence the Seek method. 
       Set rstProducts = _ 
          dbsNorthwind.OpenRecordset("Products", dbOpenTable) 
     
       With rstProducts 
          ' Set the index. 
          .Index = "PrimaryKey" 
     
          ' Get the lowest and highest product IDs. 
          .MoveLast 
          intLast = !ProductID 
          .MoveFirst 
          intFirst = !ProductID 
     
          Do While True 
             ' Display current record information and ask user  
             ' for ID number. 
             strMessage = "Product ID: " & !ProductID & vbCr & _ 
                "Name: " & !ProductName & vbCr & vbCr & _ 
                "Enter a product ID between " & intFirst & _ 
                " and " & intLast & "." 
             strSeek = InputBox(strMessage) 
     
             If strSeek = "" Then Exit Do 
     
             ' Store current bookmark in case the Seek fails. 
             varBookmark = .Bookmark 
     
             .Seek "=", Val(strSeek) 
     
             ' Return to the current record if the Seek fails. 
             If .NoMatch Then 
                MsgBox "ID not found!" 
                .Bookmark = varBookmark 
             End If 
          Loop 
     
          .Close 
       End With 
     
       dbsNorthwind.Close 
     
    End Sub 

En este ejemplo se utiliza la propiedad NoMatch para determinar si Seek y FindFirst han tenido un resultado correcto y, en caso contrario, proporcionar información adecuada. Se necesitan los procedimientos SeekMatch y FindMatch para que pueda ejecutarse este procedimiento.

    Sub NoMatchX() 
     
       Dim dbsNorthwind As Database 
       Dim rstProducts As Recordset 
       Dim rstCustomers As Recordset 
       Dim strMessage As String 
       Dim strSeek As String 
       Dim strCountry As String 
       Dim varBookmark As Variant 
     
       Set dbsNorthwind = OpenDatabase("Northwind.mdb") 
       ' Default is dbOpenTable; required if Index property will  
       ' be used. 
       Set rstProducts = dbsNorthwind.OpenRecordset("Products") 
     
       With rstProducts 
          .Index = "PrimaryKey" 
     
          Do While True 
             ' Show current record information; ask user for  
             ' input. 
             strMessage = "NoMatch with Seek method" & vbCr & _ 
                "Product ID: " & !ProductID & vbCr & _ 
                "Product Name: " & !ProductName & vbCr & _ 
                "NoMatch = " & .NoMatch & vbCr & vbCr & _ 
                "Enter a product ID." 
             strSeek = InputBox(strMessage) 
             If strSeek = "" Then Exit Do 
     
             ' Call procedure that seeks for a record based on  
             ' the ID number supplied by the user. 
             SeekMatch rstProducts, Val(strSeek) 
          Loop 
     
          .Close 
       End With 
     
       Set rstCustomers = dbsNorthwind.OpenRecordset( _ 
          "SELECT CompanyName, Country FROM Customers " & _ 
          "ORDER BY CompanyName", dbOpenSnapshot) 
     
       With rstCustomers 
     
          Do While True 
             ' Show current record information; ask user for  
             ' input. 
             strMessage = "NoMatch with FindFirst method" & _ 
                vbCr & "Customer Name: " & !CompanyName & _ 
                vbCr & "Country: " & !Country & vbCr & _ 
                "NoMatch = " & .NoMatch & vbCr & vbCr & _ 
                "Enter country on which to search." 
             strCountry = Trim(InputBox(strMessage)) 
             If strCountry = "" Then Exit Do 
     
             ' Call procedure that finds a record based on  
             ' the country name supplied by the user. 
             FindMatch rstCustomers, _ 
                "Country = '" & strCountry & "'" 
          Loop 
     
          .Close 
       End With 
     
       dbsNorthwind.Close 
     
    End Sub 
     
    Sub SeekMatch(rstTemp As Recordset, _ 
       intSeek As Integer) 
     
       Dim varBookmark As Variant 
       Dim strMessage As String 
     
       With rstTemp 
          ' Store current record location. 
          varBookmark = .Bookmark 
          .Seek "=", intSeek 
     
          ' If Seek method fails, notify user and return to the  
          ' last current record. 
          If .NoMatch Then 
             strMessage = _ 
                "Not found! Returning to current record." & _ 
                vbCr & vbCr & "NoMatch = " & .NoMatch 
             MsgBox strMessage 
             .Bookmark = varBookmark 
          End If 
     
       End With 
     
    End Sub 
     
    Sub FindMatch(rstTemp As Recordset, _ 
       strFind As String) 
     
       Dim varBookmark As Variant 
       Dim strMessage As String 
     
       With rstTemp 
          ' Store current record location. 
          varBookmark = .Bookmark 
          .FindFirst strFind 
     
          ' If Find method fails, notify user and return to the  
          ' last current record. 
          If .NoMatch Then 
             strMessage = _ 
                "Not found! Returning to current record." & _ 
                vbCr & vbCr & "NoMatch = " & .NoMatch 
             MsgBox strMessage 
             .Bookmark = varBookmark 
          End If 
     
       End With 
     
    End Sub 

El siguiente ejemplo muestra cómo usar el método Seek para encontrar un registro en una tabla vinculada.

Código de ejemplo proporcionado por la Referencia del programador de Microsoft Access 2010.

    Sub TestSeek()
        ' Get the path to the external database that contains
        ' the tblCustomers table we're going to search.
        Dim strMyExternalDatabase
        Dim dbs    As DAO.Database
        Dim dbsExt As DAO.Database
        Dim rst    As DAO.Recordset
        Dim tdf    As DAO.TableDef
        
        Set dbs = CurrentDb()
        Set tdf = dbs.TableDefs("tblCustomers")
        strMyExternalDatabase = Mid(tdf.Connect, 11)
        
        'Open the database that contains the table that is linked
        Set dbsExt = OpenDatabase(strMyExternalDatabase)
        
        'Open a table-type recordset against the external table
        Set rst = dbsExt.OpenRecordset("tblCustomers", dbOpenTable)
        
        'Specify which index to search on
        rst.Index = "PrimaryKey"
        
        'Specify the criteria
        rst.Seek "=", 123
        
        'Check the result
        If rst.NoMatch Then
            MsgBox "Record not found."
        Else
            MsgBox "Customer name: " & rst!CustName
        End If
        
        rst.Close
        dbs.Close
        dbsExt.Close
        Set rst = Nothing
        Set tdf = Nothing
        Set dbs = Nothing
        
        
    End Sub