Partager via


Méthode Recordset.Seek (DAO)

S’applique à : Access 2013, Office 2013

Localise l’enregistrement dans un objet Recordset de type table indexé qui correspond aux critères spécifiés pour l’index actuel et fait de cet enregistrement l’enregistrement actif (espaces de travail Microsoft Access uniquement).

Syntaxe

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

expression Variable représentant un objet Recordset.

Paramètres

Nom

Obligatoire/facultatif

Type de données

Description

Comparaison

Obligatoire

String

L'une des expressions de chaîne suivantes : <, <=, =, >= ou >.

Key1, Key2...Key13

Obligatoire

Variant

Une ou plusieurs valeurs correspondant aux champs dans l'index actuel de l'objet Recordset, comme indiqué par son paramètre de propriété Index. Vous pouvez utiliser jusqu'à 13 arguments clés.

Remarques

Vous devez définir l’index actuel avec la propriété Index avant d’utiliser la méthode Seek. Si l’index identifie un champ de clé non unique, la méthode Seek localise le premier enregistrement qui correspond aux critères.

La méthode Seek effectue une recherche dans les champs de clé spécifiés et localise le premier enregistrement qui correspond aux critères spécifiés par comparaison et key1. Une fois trouvé, cet enregistrement devient l’enregistrement actif et la propriété NoMatch est définie sur False. Si la méthode Seek ne trouve pas de correspondance, la propriété NoMatch est définie sur True, et l’enregistrement actif n’est pas défini.

Si le paramètre de comparaison est égal (=), supérieur ou égal (>=) ou supérieur à (>), la méthode Seek commence au début de l’index et effectue une recherche vers l’avant.

Si le paramètre de comparaison est inférieur (<) ou inférieur ou égal à (<=), la méthode Seek commence à la fin de l’index et effectue une recherche vers l’arrière. Toutefois, s'il existe des doublons à la fin de l'index, la méthode Seek démarre arbitrairement à partir de l'un des doublons, puis effectue une recherche vers l'arrière.

Vous devez spécifier des valeurs pour tous les champs définis dans l'index. Si vous utilisez la méthode Seek avec un index à plusieurs colonnes et que vous ne spécifiez pas de valeur de comparaison pour chaque champ de l’index, vous ne pouvez pas utiliser l’opérateur égal (=) dans la comparaison. C’est parce que certains champs de critères (key2, key3 et ainsi de suite) utilisent par défaut Null, ce qui ne correspondra pas. Par conséquent, pour que l’opérateur d’égalité (=) fonctionne correctement, vous devez avoir un enregistrement entièrement null à l’exception de la clé que vous recherchez. Nous vous recommandons d’utiliser l’opérateur supérieur ou égal (>=) à la place.

L’argument key1 doit être identique à celui du champ de données correspondant dans l’index actuel. Par exemple, si l’index actuel fait référence à un champ numérique (par exemple, « ID employé »), key1 doit être numérique. De même, si l’index actuel fait référence à un champ de texte (par exemple, « Nom »), key1 doit être une chaîne.

Il n’est pas obligatoire qu’un enregistrement soit actif lorsque vous utilisez la méthode Seek.

Vous pouvez utiliser la collection Indexes pour énumérer les index existants.

Pour rechercher un enregistrement dans un objet Recordset de type feuille de réponse dynamique ou instantané qui satisfasse à une condition spécifique non représentée par les index existants, utilisez la méthode Find. Pour inclure tous les enregistrements, et pas seulement ceux qui répondent à une condition spécifique, utilisez la méthode Move pour passer d'un enregistrement à un autre.

Vous ne pouvez pas appliquer la méthode Seek à une table liée, car les tables liées ne peuvent pas être ouvertes en tant qu'objets Recordset de type table. Cependant, si vous vous servez de la méthode OpenDatabase pour ouvrir directement une base de données ISAM installable (non ODBC), vous pouvez appliquer la méthode Seek aux tables de cette base de données.

Exemple

Cet exemple illustre la méthode Seek en autorisant l’utilisateur à rechercher un produit avec un numéro d’identification.

    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 

Cet exemple utilise la propriété NoMatch pour déterminer si une méthode Seek et une méthode FindFirst ont été exécutées, et pour proposer un commentaire approprié dans le cas contraire. Les fonctions SeekMatch et FindMatch sont nécessaires l'exécution de cette procédure.

    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 

L’exemple suivant montre comment utiliser la méthode Seek pour rechercher un enregistrement dans un tableau lié.

Exemple de code fourni parMicrosoft Access 2010 Programmer’s Reference.

    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