Access VBA Recordset.eof

Fermé
ultwee Messages postés 4 Date d'inscription mardi 9 juin 2009 Statut Membre Dernière intervention 9 octobre 2009 - 9 oct. 2009 à 13:46
blux Messages postés 26365 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 octobre 2024 - 9 oct. 2009 à 18:28
Bonjour,

J'ai codé une application access 2007 qui marchait très bien à un instant x et qui à un instant y s'est mise à dysfonctionner.

J'ai localisé l'erreur qui est qu'une des tables de ma base de donnée me renvoie un mauvais "end of file".

En fait lorsque j'ouvre ma base de données (en DAO) et que je fais table.movelast je récupère l'identifiant de la 78eme ligne de la table qui en comporte 99 !
De la même façon un code du type :

While table.eof=false do

table.movenext

wend

msgbox table!identifiant

Me renvoie à la 78eme ligne (donc ce n'est pas un problème de movelast).

L'ironie c'est qu'à force de bidouiller pour arriver à réparer l'erreur, en retapant le même code à la lettre près la table s'est "débloqué" et me renvoie à présent le bon identifiant pour un table.movelast.
Le problème c'est que cette erreur s'est produite 2 fois, que l'application en question est destinée à une entreprise et que je ne pourrai pas venir fixer l'erreur indéfiniment tout les 2-3 mois quand ca se produit.

Quelqu'un aurait il une idée d'où pourrait venir l'erreur?

Je vous remercie d'avance pour le temps que vous m'accorderez.

4 réponses

blux Messages postés 26365 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 octobre 2024 3 303
9 oct. 2009 à 14:01
Salut,

en l'absence de critère spécifique, les données sont renvoyées dans un ordre indéfini lors du parcours d'un recordset (comme dans tout sgbd, d'ailleurs).

Cet ordre est celui qui préside au stockage. Les données ne sont pas classées et renvoyées dans l'ordre de la clé primaire (ou alors par le plus grand des hasards).

Si tu veux faire un movelast sur ta clé primaire, tu dois faire comme suit :

nom_du_rs.index = "PrimaryKey"
nom_du_rs.movelast
1
ultwee Messages postés 4 Date d'inscription mardi 9 juin 2009 Statut Membre Dernière intervention 9 octobre 2009
9 oct. 2009 à 14:30
"Cet ordre est celui qui préside au stockage."

Si je comprend bien ce que vous voulez dire c'est que l'ordre des enregistrements c'est l'ordre dans lequel ils ont été enregistrés. Si c'est bien ce que vous avez voulu m'expliquer c'est comme ça que j'ai raisonné pour faire l'application et c'est bien comme ca que ca marche jusqu'à ce qu'un évènement dont j'ignore le pourquoi du comment intervienne et "bloque" la fin de la table à une valeur quelconque.

Dans tout les cas ma clé primaire est en "num auto" donc s'incrémente dans un ordre croissant automatiquement à chaque enregistrement et donc mon enregistrement id=99 est donc forcement après mon enregistrement id=78 puisque l'enregistrement a eu lieu après.

Ce qui me trouble le plus c'est que mon code marche très bien à un instant x puis a un instant y se met a dysfonctionner indéfiniment (jusqu'à ce que je fix l'erreur).
0
blux Messages postés 26365 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 octobre 2024 3 303
9 oct. 2009 à 15:54
Si je comprend bien ce que vous voulez dire c'est que l'ordre des enregistrements c'est l'ordre dans lequel ils ont été enregistrés
Non, je parle du stockage, comme si on lisait le contenu du disque en partant du premier octet.

donc mon enregistrement id=99 est donc forcement après mon enregistrement id=78 puisque l'enregistrement a eu lieu après
NON ! Qui te dis qu'ils sont au même endroit sur le disque ? peut-être que le cluster windows était plein et que l'on a mis le 99 dans un cluster placé avant le 78...

La façon dont un sgbd enregistre les données physiquement sur disque est inconnue (ou presque), elle obéit à des critères physique de place, mais aussi des critères logiques pour faciliter l'accès (type hash-coding de la clé primaire), c'est pour cela qu'on NE DOIT PAS compter dessus.

Essaie avec .index = "PrimaryKey", il est fort probable que tu n'auras plus l'erreur.
0
ultwee Messages postés 4 Date d'inscription mardi 9 juin 2009 Statut Membre Dernière intervention 9 octobre 2009
9 oct. 2009 à 16:30
J'essaye ça la semaine prochaine en espérant que ça marche.

Merci beaucoup du temps que vous m'avez accordé :)
0
blux Messages postés 26365 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 14 octobre 2024 3 303
9 oct. 2009 à 18:28
Sans oublier que les données de la base, le code, les formulaires sont stockés dans un fichier unique (à défaut de tables attachées)

La taille de la base ne croit pas linéairement avec le volume de données que l'on y stocke, mais croit par incréments : access stocke donc les données selon des critères particuliers...

Le fait de changer du code (suppression, re-création...) a sans doute provoqué dans access un 'retassement' des données (plus ou moins équivalent à la commande compresser une base, qui supprime physiquement les données effacées, en lieu et place du marquage logique d'effacement)...
0