Problèmes avec RecordCount
J’utilise
RecordCount
pour compter le nombre d’enregistrements dans un Recordset DAO… mais ça n’a pas l’air de fonctionner !
En DAO, l’objet Recordset dispose d’une propriété RecordCount
qui est supposée donner le nombre d’enregistrements de la table/requête concernée. Mais si vous testez le listing suivant, vous constaterez qu’il ne fonctionne pas (la variable lngLignes
renvoie systématiquement 1) :
1 2 3 4 5 6 7 8 9 10 |
Sub DAORecordCount1() Dim rst As DAO.Recordset Dim lngLignes As Long Set rst = CurrentDb.OpenRecordset("tblClients", dbOpenDynaset) lngLignes = rst.RecordCount MsgBox "Nombre d'enregistrements : " & lngLignes rst.Close Set rst = Nothing End Sub |
La raison : RecordCount
n’est valide que si le Recordset a été parcouru au moins une fois jusqu’au dernier enregistrement.
C’est automatique si le Recordset est de type Table (dbOpenTable
), mais pas nécessairement sinon. A vous de provoquer un .MoveLast
pour forcer cette lecture. Attention : ceci affecte forcément les performances de votre programme, on ne peut pas tout avoir !
Essayez plutôt le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub DAORecordCount2() Dim rst As DAO.Recordset Dim lngLignes As Long Set rst = CurrentDb.OpenRecordset("tblClients", dbOpenDynaset) If rst.EOF Then lngLignes = 0 Else rst.MoveLast lngLignes = rst.RecordCount End If MsgBox "Nombre d'enregistrements : " & lngLignes rst.Close Set rst = Nothing End Sub |
Pour plus de détails sur les références, consultez cette page.
Your solution does the job but is not very efficient. try to add rst.MoveLast /
rst.MoveFirst or use DCount() instead. http://stackoverflow.com/questions/6766099/record-count-in-access-table-using-vba
Thanks for the comment. In fact, a rst.MoveLast is already done in the sample code. The code illustrates how it affects Recordcount, just as it is done on StackOverflow. 😉
And there is no need for rst.MoveFirst here, as we just want to count records, we don’t need to use the Recordset after.
bonjour c’est très super d’avoir comme ces information sur cette page
je vous remercie beaucoup d’avoir m’aider à résoudre mon problème.
cordialement
wagolo > Non, le traitement des notes doit pouvoir se faire sans Recordsets, puisque les notes suivent les mêmes règles les unes les autres.
Un traitement ligne a ligne, qu’est que cela veux dire? Est-ce qu’il est plus adapté que le SQL pour la gestion des Notes Scolalires?
Comment peut on l’utiliser dans ce contexte?
je vous remercie
Yeo > Difficile à expliquer en quelques mots. Globalement, un Recordset est un objet qui permet de manipuler les lignes d’une table ou d’une requête. Manipuler, c’est-à-dire : parcourir les lignes pour les lire une à une, les modifier, les supprimer, en ajouter de nouvelles.
Le Recordset peut parfois faire double emploi avec certaines instructions SQL (SELECT, INSERT, DELETE, UPDATE). SQL est généralement plus court à écrire, et plus performant. Mais dans certains cas, les Recordsets seront plus lisibles. Et quand il faut vraiment un traitement ligne à ligne, seuls les Recordsets sont envisageables.
qu’est qu’un’objet Recordset? a quoi sert il dans une base de données access?