Autres méthodes de déplacement dans un recordset
Les quatre méthodes suivantes sont utilisées pour se déplacer ou faire défiler l’objet Recordset : MoveFirst, MoveLast, MoveNext et MovePrevious. (Certaines de ces méthodes ne sont pas disponibles sur les curseurs avant uniquement.)
MoveFirst modifie la position d’enregistrement actuelle sur le premier enregistrement dans l’objet Recordset. MoveLast modifie la position d’enregistrement actuelle sur le dernier enregistrement dans l’objet Recordset. Pour utiliser MoveFirst ou MoveLast, l’objet Recordset doit prendre en charge les signets ou le déplacement du curseur vers l’arrière ; sinon, l’appel de méthode génère une erreur.
MoveNext déplace la position d’enregistrement actuelle d’une position vers l’avant. Si vous êtes sur le dernier enregistrement lorsque vous appelez MoveNext, EOF est défini sur True. MovePrevious déplace la position actuelle de l’enregistrement vers l’arrière. Si vous êtes sur le premier enregistrement lorsque vous appelez MovePrevious, BOF est défini sur True. Il est judicieux de vérifier les propriétés EOF et BOF lors de l’utilisation de ces méthodes et de déplacer le curseur vers une position d’enregistrement actuelle valide si vous vous déplacez depuis l’une ou l’autre extrémité du Recordset, comme illustré ici :
. . .
oRs.MoveNext
If oRs.EOF Then oRs.MoveLast
. . .
Ou, dans le cas de la méthode MovePrevious :
. . .
oRs.MovePrevious
If oRs.BOF Then oRs.MoveFirst
. . .
Dans les cas où l’objet Recordset a été filtré ou trié et que les données de l’enregistrement actuel sont modifiées, la position peut également changer. Dans ce cas, la méthode MoveNext fonctionne normalement, mais sachez que la position est déplacée d’un enregistrement à partir de la nouvelle position, et non de l’ancienne position. Par exemple, la modification des données dans l’enregistrement actif, de sorte que l’enregistrement est déplacé à la fin de l’objet Recordset trié, signifie que l’appel de MoveNext génère des résultats MoveNext en définissant l’enregistrement actif sur la position après le dernier enregistrement dans l’objet Recordset (EOF = True).
Le comportement des différentes méthodes Move de l’objet Recordset dépend, dans une certaine mesure, des données dans l’objet Recordset. Les nouveaux enregistrements ajoutés à l’objet Recordset sont initialement ajoutés dans un ordre particulier, qui est défini par la source de données et peut être dépendant implicitement ou explicitement des données du nouvel enregistrement. Par exemple, si un tri ou une jointure est effectué dans la requête qui remplit le Recordset, le nouvel enregistrement sera inséré à l’endroit approprié dans le Recordset. Si l’ordre n’est pas spécifié explicitement lors de la création de l’objet Recordset, les modifications apportées à l’implémentation de la source de données peuvent entraîner la modification par inadvertance des lignes retournées. En outre, les fonctions de tri, de filtrage et de modification du Recordset peuvent affecter l’ordre et éventuellement la visibilité des lignes du Recordset.
Par conséquent, MoveNext, MovePrevious, MoveFirst, MoveLast et Move sont tous sensibles aux autres opérations effectuées sur le même Recordset. ADO tentera toujours de maintenir votre position actuelle jusqu’à ce que vous le déplaciez explicitement, mais parfois, les modifications compliquent la compréhension des effets d’un déplacement ultérieur. Par exemple, si vous appelez MoveFirst pour positionner la première ligne d’un Recordset trié et que vous modifiez le tri de l’ordre croissant vers l’ordre décroissant, vous êtes toujours sur la même ligne, mais maintenant il s’agit de la dernière ligne dans l’objet Recordset. MoveFirst vous amènera à une autre ligne (la nouvelle ligne).
Par exemple, si vous êtes positionné sur une ligne particulière au milieu d’un objet Recordset et que vous appelez Delete, puis MoveNext, vous êtes maintenant sur l’enregistrement immédiatement après l’enregistrement supprimé. Toutefois, l’appel à MovePrevious fait de l’enregistrement précédant celui que vous avez supprimé l’enregistrement actif, car l’enregistrement supprimé n’est plus comptabilisé dans l’appartenance active au Recordset.
Il est particulièrement difficile de définir une sémantique de déplacement cohérente entre tous les fournisseurs pour les méthodes qui se déplacent par rapport à l’enregistrement actif (MovePrevious, MoveNext et Move) quand les données dans l’enregistrement actif sont modifiées. Par exemple, si vous travaillez avec un Recordset trié et filtré, et que vous modifiez les données de l’enregistrement actuel afin qu’il précède tous les autres enregistrements, mais que les données modifiées ne correspondent plus au filtre, il n’est pas évident de savoir où une opération MoveNext doit vous mener. La conclusion la plus sûre est que le déplacement relatif dans un objet Recordset est plus risqué que le déplacement absolu (par exemple, utilisation de MoveFirst ou MoveLast) lorsque les données changent pendant que les enregistrements sont modifiés, ajoutés ou supprimés. Le tri et le filtrage doivent être basés sur une clé primaire ou un ID, car ce type de valeur ne doit pas changer.