Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access
Access Forum d'entraide sur Microsoft Access. Avant de poster -> La F.A.Q Access
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 16/08/2007, 10h10   #1
Membre actif
 
Inscription : septembre 2003
Messages : 374
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 374
Points : 150
Points : 150
Par défaut (recordset) MoveFirst plante si le recordset est vide.

Bonjour,
Dans la FAQ à la question "comment parcourir un recordset", il est donné comme solution :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
Rst.MoveFirst 
While Not rst.Eof
    ' code
    rst.MoveNext
Wend
 
Ou
 
Do Until rst.Eof
    ' code
    rst.MoveNext
Loop
sauf que la premiere solution est tout simplement fausse.
En effet, si le record set est nul, on recupere un erreur "3021 aucun enregistrement en cours"
exemple avec mon code :
Code :
1
2
3
4
5
6
7
8
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("select ... from ... where ...")
rs.MoveFirst
While (Not (rs.EOF))
 ...
wend
il y a erreur sur le movefirst dans le cas ou le recordset est vide.
Alors je me suis dit, avant de commencer, il suffit de connaitre le nombre d'enregistrement... et de memoire il faut je crois faire un movelast pour avoir une bonne valeur dans recordcount, d'ailleur je viens de le lire dans la FAQ...

Bien entendu MoveLast souffre du même probleme que moveFirst : access retourne une erreur si le recordset n'a aucun enregistrement...

Mais comment faire pour savoir s'il y a un enregistrement quand la methode pour avoir le nombre d'enregistrement plante si egal à zero ?!!! ca se mort la queue...

existe t'il une methode ellegante (pas a base de "on error", ni de "Dcount", une methode a base de recordset). si oui, il serait peut être bien d'en faire une entrée dans la FAQ non ?

Merci d'avance.


Note (au cas où) Access2000 et 2002.
hpfx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 10h20   #2
Membre actif
 
Inscription : juin 2007
Messages : 155
Détails du profil
Informations personnelles :
Âge : 62

Informations forums :
Inscription : juin 2007
Messages : 155
Points : 158
Points : 158
Bonjour,

En ce qui me concerne, j'utilise :

Code :
1
2
3
4
If Not Rst.EOF Then
   Rst.MoveFirst
End If
....
Alain36 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 10h25   #3
Membre actif
 
Inscription : septembre 2003
Messages : 374
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 374
Points : 150
Points : 150
Citation:
Envoyé par Alain36
Bonjour,

En ce qui me concerne, j'utilise :

Code :
1
2
3
4
If Not Rst.EOF Then
   Rst.MoveFirst
End If
....
Bien joué !
ca marche nickel...
ce genre d'astuce aurait bien leur place dans la FAQ non ? (en plus de corriger "comment parcourir un recordset")?
enfin, je dis celà comme ca hein.

Merci en tout cas pour cette reponse ultra rapide.
a+
hpfx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 10h35   #4
Rédacteur
 
Avatar de Lou Pitchoun
 
Christophe Lessirard
Inscription : février 2005
Messages : 5 029
Détails du profil
Informations personnelles :
Nom : Christophe Lessirard
Âge : 33
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2005
Messages : 5 029
Points : 6 000
Points : 6 000
Envoyer un message via MSN à Lou Pitchoun
Salut,

La question de la FAQ est "Comment parcourir un recordset" et n'est donc pas fausse.

De plus, il y a un tuto complet sur les Recordsets.
On y trouve la réponse à la question savoir si un recordset est vide.

Nous pouvons bien sûr envisager d'ajouter une entrée à la FAQ et de compléter celles existantes avec le lien vers le tutoriel.

__________________

Access : Les Cours, Les Sources et Les FAQs Office
Avant de poster : les choses importantes à lire pour la bonne tenue du forum.
sinon

Ma boite à MPs n'est pas l'annexe du forum Le complément BouleDeCristal n'existe pas encore !!!
Lou Pitchoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 11h31   #5
Membre actif
 
Inscription : septembre 2003
Messages : 374
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 374
Points : 150
Points : 150
Citation:
Envoyé par Lou Pitchoun
Salut,
La question de la FAQ est "Comment parcourir un recordset" et n'est donc pas fausse.
je chipote : mais alors la question devrait être "comment parcourir un recordset non vide"...
parceque si on parcours un recordset sans enregistrement ca plante.

ou du moins mettre en commentaire (en dehors du code) qu'il "faut que celui-ci soit non vide", et que pour tester s'il est vide ou pas, il faut utiliser rs.EOF et non pas chercher a connaitre le nombre d'enregistrement.

voilà.
hpfx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2007, 21h39   #6
Rédacteur

 
Avatar de Tofalu
 
Christophe Warin
Inscription : octobre 2004
Messages : 8 635
Détails du profil
Informations personnelles :
Nom : Christophe Warin
Âge : 28

Informations forums :
Inscription : octobre 2004
Messages : 8 635
Points : 13 718
Points : 13 718
En effet, le movefirst est tout simplement inutile ici puisqu'à l'ouverture, le recordset est forcément à sa première position s'il est plein.

Ceci dit, rien ne précise qu'il vient d'être ouvert donc le test avec if not .eof est nécessaire (enfin recommandé si on ne veut pas prendre de risque)

Nous allons corriger cela

Tofalu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 15h57   #7
 
Inscription : novembre 2008
Messages : 5
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 5
Points : -1
Points : -1
Par défaut if not (.BOF and .EOF)

Citation:
Envoyé par Tofalu Voir le message
En effet, le movefirst est tout simplement inutile ici puisqu'à l'ouverture, le recordset est forcément à sa première position s'il est plein.

Ceci dit, rien ne précise qu'il vient d'être ouvert donc le test avec if not .eof est nécessaire (enfin recommandé si on ne veut pas prendre de risque)

Nous allons corriger cela

Attention, ce test avec not .eof n'est pas suffisant dans le cas où l'on souhaite parcourir le recordset plusieurs fois, dans une boucle par exemple. En effet, au deuxième tour de boucle, le test avec if not .eof retournera faux puisqu'on se trouvera bien après le dernier enregistrement. Ce n'est pas pour autant que le recordset est vide.
Il faut donc utiliser dans ce cas if not (.BOF and .EOF), ce qui permet de déterminer que le recordset n'est pas vide, qu'on l'ait déjà parcouru ou non.
Atlantic64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h50.


 
 
 
 
Partenaires

Hébergement Web