Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/07/2011, 19h17   #1
Membre du Club
 
Inscription : octobre 2005
Messages : 304
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 304
Points : 59
Points : 59
Par défaut recordset et recordcount

Bonjour à tous je souhaite compter le nombre d'enregistrement que me renvoi une requete.
La requete me renvoi trois enregistrement pourtant le recordcount me renvoi 1...
je viens de m'en rendre compte et j'utlise tres souvent le recordcount dans le code,du coup je me demande si cette méthode est bien fiable.

j'ai lu le tuto suivant http://warin.developpez.com/access/d...artie_5#L5.4.5

J'ai donc tester le movelast mais quand la requete ne renvoi pas d'enregistrement ca plante sur :
en disant no current record...

Quelqu'un a déja rencontrer le probleme ?

J'espere que quelqu'un pourra m'aider car j'utilise souvent cette méthode dans le code.

Merci
_developpeur_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 19h28   #2
Membre du Club
 
Homme
Chef d'entreprise
Inscription : mai 2011
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Chef d'entreprise
Secteur : Arts - Culture

Informations forums :
Inscription : mai 2011
Messages : 57
Points : 61
Points : 61
Bonsoir,

Il faut que tu vérifies avant si des enregistrements sont présents avec la propriété NoMatch.
Francesco34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 19h35   #3
Membre du Club
 
Inscription : octobre 2005
Messages : 304
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 304
Points : 59
Points : 59
Bonsoir et merci pour ta réponse mais
renvoi false si j'ai des enregistrement et false si j'en ai pas.
_developpeur_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 19h39   #4
Membre du Club
 
Inscription : octobre 2005
Messages : 304
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 304
Points : 59
Points : 59
petite précision je travaille avec DAO
_developpeur_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 20h14   #5
Membre du Club
 
Homme
Chef d'entreprise
Inscription : mai 2011
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Chef d'entreprise
Secteur : Arts - Culture

Informations forums :
Inscription : mai 2011
Messages : 57
Points : 61
Points : 61
Autant pour moi, le NoMatch ne fonctionne qu'avec les méthode find et seek.
Dans ton cas, paradoxalement, il faut tester l'existence d'enregistrements avec... recordCount. En effet, si il existe des enregistrements, le premier sera actif, donc recordCount vaudra 1, sinon, cette propriété vaudra 0.
Francesco34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 20h58   #6
Membre du Club
 
Inscription : octobre 2005
Messages : 304
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 304
Points : 59
Points : 59
en fait je me suis mal exprimé, ce que je cherche a savoir c'est si ma requete renvoi au moins un enregistrement. Le nombre exact m'importe peu en fait. Pour avoir le nombre exact j'aurai pu faire tout simplement une requete avec un count.
Donc pour tester s'il y a des enregistrements ou s'il n'y en a pas soit je fait :
Code :
IF not rs.eof then .....end if
c'est bon ça ?estce que par pur hasard ca peut arriver d'ouvrir un recorset et qu'il se place directement sur eof ? et la ...

ou bien j'ai lu quelque part ce code :
Code :
IF rs.BOF = true AND rs.EOF = TRUE then ... END IF
>> pas d'enregistrement

ou bien le recordcount mais j'avoue avoir quelques doutes sur cette propriété.

un avis ?
_developpeur_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 00h21   #7
Membre du Club
 
Homme
Chef d'entreprise
Inscription : mai 2011
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Chef d'entreprise
Secteur : Arts - Culture

Informations forums :
Inscription : mai 2011
Messages : 57
Points : 61
Points : 61
Et bien ce ce que je te disais dans mon message précédent, tu peux tester l'existence d'enregistrement avec recordCount. Lors de l'ouverture d'un recordset, l'enregistrement actif est toujours le premier, la propriété recordCount est donc à 1 - sauf dans le cas où il n'y a pas d'enregistrement, là recordCount vaut 0 d'où :
Code :
1
2
3
4
5
6
 
If rs.recordCount Then
    Debug.Print "Présence d'enregistrements"
Else
    Debug.Print "Pas d'enregistrement"
End If
Francesco34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 11h40   #8
Membre du Club
 
Inscription : octobre 2005
Messages : 304
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 304
Points : 59
Points : 59
j'ai lu quelque part que le recordcount pouvait être a -1, ça se produit quand ?

Je veux pas trop utiliser le recordcount vu tous les messages problématiques qu'il y a dessus en fonction du type de curseur choisi, ou de s'il y a des jointures ...

Est-ce que tu sais si mes deux autres solutions sont bonnes ?
Merci je poste mon code quand meme :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
'Parcourir tous les plans d'activités pour afficher un message de purge global
Do While Len(NomFichier) > 0
 
    'Contrction du message de confirmation de purge a l'utilisateur
    sMessagePurge = "Des saisies ont déja été effectuée pour le(s) couple(s) producteur / période suivant(s) :" & vbCrLf
 
    'ouverture du fichier
    Set xlsClasseur = xls.Workbooks.Open(sRepertoireChoisi & "\" & NomFichier)
 
    'Activer onglet "projet"
    Set xlsFeuille = xlsClasseur.Worksheets("projet")
    xlsFeuille.Activate
 
    'Y a t il déja des saisies pour la période et le producteur dans la table Activité service?
    SQLExistenceSaisie = "SELECT * FROM AssociationActiviteService WHERE Periode='" & xlsFeuille.Cells(NumLigneDebut, 2) & "' AND Producteur= '" & xlsFeuille.Cells(NumLigneDebut, 1) & "'"
    Set rs = CurrentDb.OpenRecordset(SQLExistenceSaisie)
 
    If Not rs.EOF Then
        sMessagePurge = sMessagePurge & xlsFeuille.Cells(NumLigneDebut, 1) & "-" & xlsFeuille.Cells(NumLigneDebut, 2) & vbCrLf
    End If
 
    Set rs = Nothing
 
    NomFichier = Dir()
Loop
_developpeur_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 12h47   #9
Membre du Club
 
Homme
Chef d'entreprise
Inscription : mai 2011
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Chef d'entreprise
Secteur : Arts - Culture

Informations forums :
Inscription : mai 2011
Messages : 57
Points : 61
Points : 61
Lors de l'ouverture d'un recordset, deux cas peuvent se produire :

- Il n'y a pas d'enregistrement :
--> EOF et BOF ont la valeur True
--> RecordCount a la valeur 0

- Il y a un ou plusieurs enregistrements, le premier enregistrement est alors actif :
--> EOF et BOF ont la valeur False
--> RecordCount a la valeur 1

Pour ce que tu souhaites faire, écrire "If not rst.EOF" ou "If not rst.BOF" ou "If rs.RecordCount = 1" produira les mêmes effets.

La deuxième solution est une surcharge inutile puique à l'ouverture d'un recordset EOF et BOF ont toujours la même valeur.


Edit : N'oublie pas de fermer tes recordset avec close, sinon tu verras la taille de base de données augmenter régulièrement et tu devras passer par des compactages régulièrement.
Francesco34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 14h01   #10
Membre chevronné
 
Homme Alexandre Sahli
Comptable
Inscription : mars 2005
Messages : 507
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Sahli
Localisation : Suisse

Informations professionnelles :
Activité : Comptable

Informations forums :
Inscription : mars 2005
Messages : 507
Points : 628
Points : 628
Bonjour,

je ne sais pas si çà peux t'aider personnellement j'utilise une fonction pour compter le nombre d'enregistrement d'une requête en Sql. Ce serait possible de l'adapter avec une requête enregistrée.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Function FctCompteNbRecord(StrSql As String)
    Dim Db As Database, RstControle As Recordset
    Set Db = CurrentDb()
    'MsgBox StrSql
    Set RstControle = Db.OpenRecordset(StrSql, dbOpenDynaset)
 
    If RstControle.RecordCount = 0 Then
        ' s'il n'y a pas de donnée sortie de la fonction
        FctCompteNbRecord = 0
    Else
        RstControle.MoveLast
        FctCompteNbRecord = RstControle.RecordCount
    End If
    RstControle.Close
    Set Db = Nothing
End Function

Il faut aussi savoir que s'il n'y a pas d'enregistrement dans un recordset la fonction
Code :
RstControle.RecordCount = 0
est toujours = 0

bonne chance
Alexandre Sahli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 11h07   #11
Membre du Club
 
Inscription : octobre 2005
Messages : 304
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 304
Points : 59
Points : 59
bonjour et merci pour vos réponses.

Savez-vous quand le recordcount peut retourner -1 ?

Merci
_developpeur_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h22.


 
 
 
 
Partenaires

Hébergement Web