Método Recordset.Seek (DAO)

Aplica-se a: Access 2013, Office 2013

Localiza o registro em um objeto Recordset do tipo tabela indexada que satisfaz os critérios especificados para o índice atual e torna esse registro o registro atual (somente espaços de trabalho do Microsoft Access).

Sintaxe

expressão . Seek(Comparison, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13)

expressão Uma variável que representa um objeto Conjunto de registros.

Parâmetros

Nome

Necessária/opcional

Tipo de dados

Descrição

Comparação

Obrigatório

String

Uma das seguintes expressões de cadeia de caracteres: <, <=, =, >= ou >.

Key1, Key2...Key13

Obrigatório

Variant

Um ou mais valores correspondentes a campos no índice atual do objeto Recordset, como especificado pela configuração de sua propriedade Index. Você pode usar até 13 argumentos de chave.

Comentários

Você deve definir o índice atual com a propriedade Index antes de usar Seek. Se o índice identificar um campo de chave não exclusivo, Seek localizará o primeiro registro que atenda ao critério.

O método Seek faz buscas nos campos de chave especificados e localiza o primeiro registro que atenda ao critério especificado por comparison e key1. Depois de encontrado, ela torna atual aquele registro e define a propriedade NoMatch como False. Se o método Seek falhar ao localizar uma correspondência, a propriedade NoMatch será definida como True, e o registro atual será indefinido.

Se comparison for igual a (=), maior ou igual a (>=) ou maior que (>), Seek começará no início do índice e pesquisará adiante.

Se comparison for menor que (<) ou menor ou igual a (<=), Seek começará no final do índice e pesquisará para trás. Entretanto, se houver entradas de índice duplicadas no final do índice, Seek começará em uma entrada arbitrária entre as duplicatas e pesquisará para trás.

Você deve especificar valores para todos os campos definidos no índice. Se você utilizar Seek com um índice de várias colunas e não especificar um valor de comparação para cada campo no índice, não será possível usar o operador igual (=) na comparação. Isso ocorre porque alguns dos campos de critérios (key2, key3 e assim por diante) serão padronizados como Null, o que provavelmente não terá uma correspondência. Portanto, o operador igual só funcionará corretamente se você tiver um registro que seja todo null, exceto a chave que você estiver procurando. Recomenda-se utilizar o operador maior ou igual a (>=) no lugar dele.

O argumento key1 deve ter o mesmo tipo de dados de campo que o campo correspondente no índice atual. Por exemplo, se o índice atual se referir a um campo de número (como ID de Funcionário), key1 deverá ser numérico. De forma semelhante, se o índice atual se referir a um campo de texto (como Sobrenome), key1 deverá ser uma sequência.

Não precisa ser um registro atual quando você usar Seek.

Você pode usar a coleção Indexes para enumerar os índices existentes.

Para localizar um registro em um Recordset do tipo dynaset ou instantâneo que atenda a uma condição específica não coberta por índices existentes, use os métodos Find. Para incluir todos os registros, não apenas aqueles que atendem a uma condição específica, use os métodos Move para mover de um registro para outro.

Você não pode usar o método Seek em uma tabela vinculada porque não é possível abrir tabelas vinculadas como objetos Recordset do tipo tabela. Contudo, se você utilizar o método OpenDatabase para abrir diretamente um banco de dados (não-ODBC) ISAM instalável, poderá usar Seek nas tabelas naquele banco de dados.

Exemplo

Este exemplo demonstra o método Seek ao permitir que o usuário procure um produto com base em um 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 

Este exemplo usa a propriedade NoMatch para determinar se um Seek e um FindFirst foram bem-sucedidos e, em caso negativo, para fornecer os comentários apropriados. Os procedimentos SeekMatch e FindMatch são exigidos para que esse procedimento seja executado.

    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 

O exemplo a seguir mostra como usar o método Seek para localizar um registro em uma tabela vinculada.

Código de exemplo fornecido por: a Referência do programador do 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