Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : Access 2013, Office 2013
L'objet Recordset possède des fonctionnalités intégrées permettant de réorganiser l'ordre des données dans le jeu de résultats, ce qui permet, d'une part, de rechercher des enregistrements spécifiques sur base de critères définis et, d'autre part, d'optimiser ces opérations de recherche à l'aide d'index. La disponibilité de ces fonctionnalités dépend du fournisseur et, dans certains cas, notamment celui de la propriété Index, de la structure même de la source de données.
Organisation des données
En règle générale, le moyen le plus efficace d'organiser les données d'un objet Recordset consiste à spécifier une clause ORDER BY dans la commande SQL utilisée pour retourner les résultats dans le jeu d'enregistrements. Gardez néanmoins à l'esprit que vous devrez parfois modifier l'ordre des données dans un objet Recordset lorsqu'il a déjà été créé. En définissant la propriété Sort, vous êtes en mesure d'établir l'ordre dans lequel les lignes d'un objet Recordset seront parcourues. En outre, la propriété Filter permet de déterminer les lignes accessibles lors du parcours des lignes.
La propriété Sort définit ou renvoie une valeur de type String indiquant les noms des champs de l'objet Recordset qui feront l'objet du tri. Chaque nom est séparé par une virgule et peut être suivi d'un espace et du mot clé ASC (pour un tri par ordre croissant) ou DESC (pour un tri par ordre décroissant). Par défaut, si aucun mot clé n'est spécifié, le champ sera trié par ordre croissant.
L'efficacité de l'opération de tri réside dans le fait que les données ne sont pas triées physiquement, mais simplement accédées dans l'ordre spécifié par un index.
Lorsque vous utilisez la propriété Sort, la propriété CursorLocation doit être définie avec la valeur adUseClient. En l'absence d'un index existant, un index temporaire sera créé pour chaque champ spécifié dans la propriété Sort.
Si vous définissez une chaîne vide comme valeur de la propriété Sort, les lignes sont rétablies dans leur ordre initial et les index temporaires sont supprimés. En revanche, les index existants seront conservés.
Supposons qu’un objet Recordset contienne trois champs nommés firstName, middleInitial et lastName. Définissez la propriété Sort sur la chaîne « », qui trie l’objet Recordset par nom dans l’ordre décroissant, puis par prénom dans l’ordre croissant. L'initiale du second prénom sera ignorée.
Aucun champ référencé dans une chaîne de critères de tri ne peut être nommé « ASC » ou « DESC », car ces noms provoquent des conflits avec les mots clés ASC et DESC. Attribuez au nom du champ posant problème un alias à l'aide du mot clé AS dans la requête qui retourne l'objet Recordset.
Pour plus d'informations sur le filtrage des objets Recordset, consultez la section Filtrage des résultats, plus loin dans cette rubrique.
Recherche d’un enregistrement spécifique
Les méthodes ADO Find et Seek permettent de localiser un enregistrement spécifique dans un objet Recordset. La méthode Find est prise en charge par un grand nombre de fournisseurs, mais est limitée à un seul critère de recherche. La méthode Seek permet une recherche basée sur plusieurs critères, mais n'est pas prise en charge par tous les fournisseurs.
Des champs indexés permettent d'améliorer considérablement les performances de la méthode Find ainsi que des propriétés Sort et Filter d'un objet Recordset. Vous pouvez créer un index interne pour un objet Field en définissant sa propriété dynamique Optimize. Cette propriété dynamique s'ajoute à la collection Properties de l'objet Field lorsque vous affectez à la propriété CursorLocation la valeur adUseClient. Gardez à l'esprit qu'il s'agit d'un index interne d'ADO, ce qui signifie que vous ne pouvez y accéder ou l'utiliser à d'autres fins. En outre, sachez que cet index est différent de la propriété Index de l'objet Recordset.
La méthode Find permet de localiser rapidement une valeur dans une colonne (champ) d'un objet Recordset. Vous pouvez généralement accélérer l'exécution de la méthode Find sur une colonne en utilisant la propriété Optimize pour y créer un index.
La méthode Find limite votre recherche au contenu d'un seul champ. Quant à la méthode Seek, elle requiert la présence d'un index et présente également d'autres limitations. Si vous devez lancer une recherche sur plusieurs champs non indexés ou si votre fournisseur ne prend pas les index en charge, vous pouvez limiter les résultats en utilisant la propriété Filter de l'objet Recordset.
Rechercher
La méthode Find recherche dans un objet Recordset la ligne qui répond à un critère spécifié. Il est éventuellement possible de spécifier des paramètres facultatifs, tels que la direction de la recherche, la ligne de début et un décalage par rapport à la ligne de début. Si le critère est rempli, la position de ligne actuelle est définie sur l’enregistrement trouvé ; sinon, la position est définie à la fin (ou au début) de l’objet Recordset, selon le sens de la recherche.
Seul un nom de colonne unique peut être spécifié comme critère. En effet, cette méthode ne prend pas en charge les recherches sur plusieurs colonnes.
L’opérateur de comparaison pour le critère peut être «> » (supérieur à), «< » (inférieur à), « = » (égal à), «> = » (supérieur ou égal), «< = » (inférieur ou égal à), «<> » (différent) ou « LIKE » (correspondance de modèle).
La valeur du critère doit être une chaîne, un nombre à virgule flottante ou une date. Les valeurs des chaînes sont délimitées par des guillemets simples ou des signes « # » (dièse) (par exemple, « state = WA » ou « state = #WA# »). Les valeurs de date sont délimitées par les signes « # » (dièse) (par exemple, « start_date > #7/22/97# »).
Si l'opérateur de comparaison est « like », la valeur de la chaîne peut contenir un astérisque (*) pour rechercher une ou plusieurs occurrences d'un caractère ou d'une sous-chaîne. Par exemple, « state like 'M*' » correspond à Maine et Massachusetts. Vous pouvez également utiliser des astérisques au début et à la fin pour rechercher une sous-chaîne dans les valeurs. Par exemple, « state like '*as* » correspond à Alaska, Arkansas et Massachusetts.
Les astérisque ne peuvent être utilisés qu’à la fin d’une chaîne de critères ou ensemble au début et à la fin d’une chaîne de critères, comme indiqué ci-dessus. Vous ne pouvez pas utiliser l’astérisque comme caractère générique de début ('*str') ou comme caractère générique incorporé ('s*r'). Cela provoque une erreur.
Seek et Index
Il est conseillé d’utiliser conjointement la méthode Seek avec la propriété Index si le fournisseur sous-jacent prend les index en charge sur l’objet Recordset. La méthode Supports(adSeek) permet de déterminer si le fournisseur sous-jacent prend Seek en charge, et la méthode Supports(adIndex) de déterminer si les index sont pris en charge par le fournisseur. (Par exemple, le fournisseur OLE DB pour Microsoft Jet prend Seek et Index en charge.)
Si la méthode Seek ne trouve pas la ligne recherchée, aucune erreur n'est générée et la ligne est positionnée à la fin du Recordset. Veillez à définir la propriété Index sur l'index souhaité avant d'exécuter cette méthode.
Cette méthode n'est prise en charge qu'avec des curseurs côté serveur. La méthode Seek n'est pas prise en charge lorsque la valeur de la propriété CursorLocation de l'objet Recordset est adUseClient.
Cette méthode peut être utilisée dans le seul cas où l'objet Recordset a été ouvert avec la valeur adCmdTableDirect de CommandTypeEnum.
Filtrage des résultats
La méthode Find limite votre recherche au contenu d'un seul champ. Quant à la méthode Seek, elle requiert la présence d'un index et présente également d'autres limitations. Si vous devez effectuer une recherche sur plusieurs champs qui ne sont pas la base d’un index ou si votre fournisseur ne prend pas en charge les index, vous pouvez limiter vos résultats à l’aide de la propriété Filter de l’objet Recordset .
Utilisez la propriété Filter pour filtrer les enregistrements d'un objet Recordset. L’objet Recordset filtré devient le curseur actif, ce qui signifie que les enregistrements qui ne répondent pas aux critères de filtre ne sont pas disponibles dans l’objet Recordset tant que le filtre n’est pas supprimé. Les autres propriétés qui renvoient des valeurs dépendant du curseur actuel sont affectées (par exemple AbsolutePosition, AbsolutePage, CpteEnregistrement et ComptePage). Cela est dû au fait que l'attribution d'une valeur spécifique à la propriété Filter déplace l'enregistrement actuel et le définit comme le premier enregistrement satisfaisant la nouvelle valeur.
La propriété Filter prend un argument de type Variant. Cette valeur représente l'une des trois méthodes d'utilisation de la propriété Filter: une chaîne de critères, une constante FilterGroupEnum ou un tableau de signets. Pour plus d'informations, consultez les sections Filtrage à l'aide d'une chaîne de critères, Filtrage avec une constante et Filtrage avec des signets, plus loin dans cette rubrique.
Remarque
[!REMARQUE] Lorsque vous connaissez les données à sélectionner, il est généralement plus efficace d'ouvrir un Recordset avec une instruction SQL capable de filtrer efficacement le jeu de résultats au lieu d'utiliser la propriété Filter.
Pour supprimer un filtre d'un Recordset, utilisez la constante adFilterNone. En définissant une chaîne vide ("") comme valeur de la propriété Filter, vous obtenez le même résultat qu'en utilisant la constante adFilterNone.
Filtrage avec une chaîne de critères
La chaîne de critères est constituée de clauses sous la forme FieldName Operator Value (par exemple, « LastName = 'Smith' »). Vous pouvez créer des clauses composées en concaténant des clauses individuelles avec AND (par exemple, « LastName = 'Smith' AND FirstName = 'John' ») et OR (par exemple, ). Vous pouvez créer des clauses composées en concaténant des clauses individuelles avec AND (par exemple, « LastName = 'Smith' AND FirstName = 'John' ») et OR (par exemple, « LastName = 'Smith' OR LastName = 'Jones' »). Lorsque vous utilisez des chaînes de critères, gardez les points suivants à l'esprit :
NomChamp doit être un nom de champ valide du Recordset. Si le nom de champ contient des espaces, vous devez le mettre entre crochets.
L’opérateur doit être l’un des éléments suivants : <, , ><=, >=, <>= ou LIKE.
Valeur est la valeur avec laquelle vous allez comparer les valeurs de champ (par exemple, « Smith », #24/8/95#, 12,345 ou 50,00 $). Utilisez des guillemets simples (') avec des chaînes et des signes dièse (#) avec des dates. Pour les nombres, vous pouvez utiliser les points décimaux, le signe dollar et les notations scientifiques. Si la valeur du champ Opérateur est LIKE, celle du champ Valeur peut utiliser des caractères génériques. Seuls l’astérisque (*) et le signe de pourcentage (%) sont autorisés, mais ils doivent constituer le dernier caractère de la chaîne. La valeur doit être différente de Null.
Remarque
Pour inclure des guillemets simples (’) dans le filtre Valeur, utilisez deux guillemets simples pour en afficher un seul. Par exemple, pour filtrer sur O’Malley, la chaîne de critères doit être « col1 = 'O''Malley' ».
Pour inclure des guillemets simples au début et à la fin de la valeur du filtre, placez des signes dièse (#) de part et d'autre de la chaîne. Par exemple, pour filtrer sur '1', la chaîne de critères doit être « col1 = #'1'# ».
Il n'existe pas de priorité entre AND et OR. Les clauses peuvent être regroupées dans des parenthèses. Notez toutefois que vous ne pouvez pas regrouper des clauses jointes par OR, puis associer le groupe à une autre clause avec AND, comme ceci :
(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
Le filtre doit être construit comme suit :
(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')
Dans une clause LIKE, vous pouvez utiliser un caractère générique au début et à la fin du modèle (par exemple, LastName Like '*mit*') ou seulement à la fin du modèle (par exemple, ) ou uniquement à la fin du modèle (par exemple, LastName Like 'Smit*').
Filtrage avec une constante
Les constantes suivantes sont disponibles pour le filtrage des objets Recordset.
Constante |
Description |
|---|---|
adFilterAffectedRecords |
Affiche uniquement les enregistrements concernés par le dernier appel à Delete, Resync, UpdateBatch ou CancelBatch. |
adFilterConflictingRecords |
Affiche les enregistrements pour lesquels la dernière mise à jour par lot a échoué. |
adFilterFetchedRecords |
Affiche les enregistrements du cache actif , c'est-à-dire les résultats du dernier appel visant à extraire des enregistrements de la base de données. |
adFilterNone |
Supprime le filtre actif et restaure l'affichage de tous les enregistrements. |
adFilterPendingRecords |
Affiche uniquement les enregistrements qui ont été modifiés mais pas encore envoyés au serveur. Applicable uniquement pour le mode de mise à jour par lot. |
Les constantes de filtre simplifient la résolution des conflits d'enregistrements individuels pendant le mode de mise à jour par lot en vous permettant de n'afficher, par exemple, que les enregistrements affectés par le dernier appel de la méthode UpdateBatch, comme illustré dans l'exemple suivant :
'BeginDeleteGroup
'add some bogus records
With objRs1
For i = 0 To 8
.AddNew
.Fields("CompanyName") = "Shipper Number " & i + 1
.Fields("Phone") = "(425) 555-000" & (i + 1)
.Update
Next i
're-connect & update
.ActiveConnection = GetNewConnection
.UpdateBatch
'filter on newly added records
.Filter = adFilterAffectedRecords
Debug.Print "Deleting the " & .RecordCount & _
" records you just added."
'delete the newly added bogus records
.Delete adAffectGroup
.Filter = adFilterNone
Debug.Print .RecordCount & " records remain."
.Close
End With
'EndDeleteGroup
Filtrage avec des signets
Enfin, vous pouvez transmettre un tableau de signets de type Variant à la propriété Filter. Le curseur résultant contiendra uniquement les enregistrements dont le signet a été transmis à la propriété. L'exemple de code suivant permet de créer un tableau de signets à partir des enregistrements d'un objet Recordset dont le nom contient la lettre « B » (dans le champ ProductName). Il passe ensuite le tableau à la propriété Filter et affiche les informations de l'objet Recordset filtré qui en résulte.
'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
Création d’un clone d’un objet Recordset
Utilisez la méthode Clone pour créer plusieurs objets Recordset dupliqués, notamment dans le cas où vous souhaitez conserver plusieurs enregistrements actifs dans un jeu d'enregistrements donné. La méthode Clone est plus efficace que la technique qui consiste à créer et ouvrir un nouvel objet Recordset avec une définition identique à celle de l'original.
L'enregistrement actif d'un clone créé est initialement le premier enregistrement. Le pointeur de l'enregistrement actif dans un objet Recordset cloné n'est pas synchronisé avec l'original et vice versa. Vous pouvez naviguer de façon indépendante dans chaque objet Recordset.
Les modifications apportées à un objet Recordset apparaissent dans tous ses clones, quel que soit le type de curseur utilisé. Toutefois, après l'exécution de la méthode Requery sur l'objet Recordset d'origine, les clones ne sont plus synchronisés avec l'original.
La fermeture de l'objet Recordset d'origine ne ferme pas ses copies pas plus que la fermeture d'une copie ne ferme l'objet d'origine ni aucune autre copie.
Vous pouvez cloner un objet Recordset uniquement s'il prend en charge les signets. Les valeurs des signets sont interchangeables ; en d'autres termes, une référence de signet d'un objet Recordset donné fait référence au même enregistrement dans chacun de ses clones.