OVH Cloud OVH Cloud

Pb pour trouver le dernier enregistrement de la table

11 réponses
Avatar
Jérémie
Bonjour,

J'ai qques pbs pour trouver le dernier enregistrement d'une table. En fait, la plupart du temps ça marche mais il arrive aussi que ça plante (rarement, mais c déjà de trop).
En ouvrant ma base et mon recordset concerné, j'applique la méthode rs.movelast pour m'assurer d'aller au dernier ( et pouvoir en ajouter un derrière) mais qd ça bug, ça s'arrête à un enregistrement dans la table et j'ai beau en rajouter derrière même en mode feuille de données, c'est toujours ce même enregistrement qu'il considère comme le dernier de mon recordset !!!
Au hasard, j'ai compacter ma base et tout s'est remis à fonctionner normalement...mais pour combien de temps ?

Qu'en pensez-vous ?

Jérémie

10 réponses

1 2
Avatar
Raymond [mvp]
Bonjour.

Pourquoi vouloir te positionner sur le dernier pour en ajouter un ? te
positionner sur ajout d'un nouvel enregistrement ne te suffit pas ? movelast
dans un recordset se positionne par rapport à un tri, alors ?
La méthode movelast est celle qui prend le plus de temps à s'exécuter et qui
pénalise les performances.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jérémie" a écrit dans le message de
news:
Bonjour,

J'ai qques pbs pour trouver le dernier enregistrement d'une table. En
fait, la plupart du temps ça marche mais il arrive aussi que ça plante

(rarement, mais c déjà de trop).
En ouvrant ma base et mon recordset concerné, j'applique la méthode
rs.movelast pour m'assurer d'aller au dernier ( et pouvoir en ajouter un

derrière) mais qd ça bug, ça s'arrête à un enregistrement dans la table et
j'ai beau en rajouter derrière même en mode feuille de données, c'est
toujours ce même enregistrement qu'il considère comme le dernier de mon
recordset !!!
Au hasard, j'ai compacter ma base et tout s'est remis à fonctionner
normalement...mais pour combien de temps ?


Qu'en pensez-vous ?

Jérémie


Avatar
3stone
Salut,

"Jérémie"
J'ai qques pbs pour trouver le dernier enregistrement d'une table. En fait, la plupart du temps ça
marche mais il arrive aussi que ça plante (rarement, mais c déjà de trop).

En ouvrant ma base et mon recordset concerné, j'applique la méthode rs.movelast pour m'assurer
d'aller au dernier ( et pouvoir en ajouter un derrière) mais qd ça bug, ça s'arrête à un

enregistrement dans la table et j'ai beau en rajouter derrière même en mode feuille de données,
c'est toujours ce même enregistrement qu'il considère comme le dernier de mon recordset !!!


C'est parce que tu suppose qu'une table possède un "ordre",
ce qui est définitivement PAS le cas.

Lorsque tu ouvre un recordset, lui il aura un ordre.
- soit indiqué par une clause "Order By" (trié par)
- soit alléatoire et temporaire, juste le temps d'ouverture de ce recordset...
à la prochaine ouverture, il peut être complètement différent.


Tu doit donc inclure un champ qui permet de garder le même ordre...
un NuméroAuto fait l'affaire en plus d'être une bonne clé primaire.
Eventuellement aussi, une date/heure qui permet de trier selon
le moment de la création des enregistrement.

De plus, pour ajouter un enregistrement, il suffit de fait
un Insert (req ajout), car vu ce qui est dit plus haut,
ajouter "à la fin de la table" ne représente rien, pour une table!


Au hasard, j'ai compacter ma base et tout s'est remis à fonctionner normalement...mais pour
combien de temps ?


Simplement dû au fait que le compactage "réorganise" entre-autre
toutes les tables et, donne pendant un bref moment l'impression
qu'une table à un ordre, ce qui n'est absolument vérifiable.


--
A+
Pierre (3stone) Access MVP
-----------------------------
http://users.skynet.be/mpfa
-----------------------------

Avatar
Jérémie
Merci pour vos contributions.

Voilà le pb qui se pose :

Lorsque je saisi des enregistrements, je renseigne un titre, une date... et aussi plusieurs mots-clés. Pour les mots-clés associés à l'enregistrement, j'ai deux listesbox : l'une contient l'ensemble des mots-clés (un lexique tt simplement) et l'autre contient la sélection des mots-clés pour mon enregistrement. J'utilise pour cela un bouton qui qui duplique le mot-clé choisi dans le lexique ds mon autre liste de sélection.
Au niveau de mon modèle de données, j'ai une table "document" et une table "mot-clé" en relation infini-infini donc avec l'apparition d'une 3è table intermédiaire composée des ID des 2 tables.
Pour chaque enregistrement, il faut d'abord saisir le titre, la date... puis ensuite les mots-clés. Lorsque je sélectionne un mot-clé, ma table "document" se met à jour avec le titre, la date, le lien hypertxt ainsi que ma table intermédiaire avec le num-auto du document et le num-auto du motclé. Si je choisi un deuxième mot-clé pour ce même enregistrement, je dis en code VB (enfin, j'essaie !) que si le titre ds le formulaire en question est égal au titre de mon enregistrement ds ma table "document, alors, il ne faut pas rajouter une 2ème fois le titre ds ma table mais juste récupérer l'identifiant de cet enregistrement et l'associer aà l'ID du 2nd mot-clé dans la table intermédiaire.

voila la clause conditionnelle en VBA :

set db = currentDb
set rs = db.openrecordset ("Document")

If rs!Titre <> txtTitre then
"execution de la macro qui ajoute un nouvel enregistrement ds la table document"
End if
........

J'ai pensé à rajouter à la suite du "set rs...." une requête qui me permet de trier les enregistrements de ma table par num-auto suivi d'un movelast et récupérer le dernier enregistrement saisi :
Document = "SELECT Document.* "
Document = Document & "FROM Document "
Document = Document & "ORDER BY Document.IdDocument ASC "
rs.movelast

Est-ce correct ?

Merci du coup de main

Jérémie


Bonjour,

J'ai qques pbs pour trouver le dernier enregistrement d'une table. En fait, la plupart du temps ça marche mais il arrive aussi que ça plante (rarement, mais c déjà de trop).
En ouvrant ma base et mon recordset concerné, j'applique la méthode rs.movelast pour m'assurer d'aller au dernier ( et pouvoir en ajouter un derrière) mais qd ça bug, ça s'arrête à un enregistrement dans la table et j'ai beau en rajouter derrière même en mode feuille de données, c'est toujours ce même enregistrement qu'il considère comme le dernier de mon recordset !!!
Au hasard, j'ai compacter ma base et tout s'est remis à fonctionner normalement...mais pour combien de temps ?

Qu'en pensez-vous ?

Jérémie


Avatar
Raymond [mvp]
Tu ferais bien de tester au préalable si le titre existe ou non dans la
table par un dlookup et récupérer directement l'identifiant. selon le
résultat, tu fais une requête ajout ou non.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jérémie" a écrit dans le message de
news:
Merci pour vos contributions.

Voilà le pb qui se pose :

Lorsque je saisi des enregistrements, je renseigne un titre, une date...
et aussi plusieurs mots-clés. Pour les mots-clés associés à

l'enregistrement, j'ai deux listesbox : l'une contient l'ensemble des
mots-clés (un lexique tt simplement) et l'autre contient la sélection des
mots-clés pour mon enregistrement. J'utilise pour cela un bouton qui qui
duplique le mot-clé choisi dans le lexique ds mon autre liste de sélection.
Au niveau de mon modèle de données, j'ai une table "document" et une table
"mot-clé" en relation infini-infini donc avec l'apparition d'une 3è table

intermédiaire composée des ID des 2 tables.
Pour chaque enregistrement, il faut d'abord saisir le titre, la date...
puis ensuite les mots-clés. Lorsque je sélectionne un mot-clé, ma table

"document" se met à jour avec le titre, la date, le lien hypertxt ainsi que
ma table intermédiaire avec le num-auto du document et le num-auto du
motclé. Si je choisi un deuxième mot-clé pour ce même enregistrement, je dis
en code VB (enfin, j'essaie !) que si le titre ds le formulaire en question
est égal au titre de mon enregistrement ds ma table "document, alors, il ne
faut pas rajouter une 2ème fois le titre ds ma table mais juste récupérer
l'identifiant de cet enregistrement et l'associer aà l'ID du 2nd mot-clé
dans la table intermédiaire.

voila la clause conditionnelle en VBA :

set db = currentDb
set rs = db.openrecordset ("Document")

If rs!Titre <> txtTitre then
"execution de la macro qui ajoute un nouvel enregistrement ds la table
document"

End if
........

J'ai pensé à rajouter à la suite du "set rs...." une requête qui me permet
de trier les enregistrements de ma table par num-auto suivi d'un movelast et

récupérer le dernier enregistrement saisi :
Document = "SELECT Document.* "
Document = Document & "FROM Document "
Document = Document & "ORDER BY Document.IdDocument ASC "
rs.movelast

Est-ce correct ?


Avatar
Jérémie
Ok, merci mais moi pas connaitre "dlookup", tu peux m'expliquer s'il te plait ?

Jérémie


Tu ferais bien de tester au préalable si le titre existe ou non dans la
table par un dlookup et récupérer directement l'identifiant. selon le
résultat, tu fais une requête ajout ou non.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jérémie" a écrit dans le message de
news:
Merci pour vos contributions.

Voilà le pb qui se pose :

Lorsque je saisi des enregistrements, je renseigne un titre, une date...
et aussi plusieurs mots-clés. Pour les mots-clés associés à

l'enregistrement, j'ai deux listesbox : l'une contient l'ensemble des
mots-clés (un lexique tt simplement) et l'autre contient la sélection des
mots-clés pour mon enregistrement. J'utilise pour cela un bouton qui qui
duplique le mot-clé choisi dans le lexique ds mon autre liste de sélection.
Au niveau de mon modèle de données, j'ai une table "document" et une table
"mot-clé" en relation infini-infini donc avec l'apparition d'une 3è table

intermédiaire composée des ID des 2 tables.
Pour chaque enregistrement, il faut d'abord saisir le titre, la date...
puis ensuite les mots-clés. Lorsque je sélectionne un mot-clé, ma table

"document" se met à jour avec le titre, la date, le lien hypertxt ainsi que
ma table intermédiaire avec le num-auto du document et le num-auto du
motclé. Si je choisi un deuxième mot-clé pour ce même enregistrement, je dis
en code VB (enfin, j'essaie !) que si le titre ds le formulaire en question
est égal au titre de mon enregistrement ds ma table "document, alors, il ne
faut pas rajouter une 2ème fois le titre ds ma table mais juste récupérer
l'identifiant de cet enregistrement et l'associer aà l'ID du 2nd mot-clé
dans la table intermédiaire.

voila la clause conditionnelle en VBA :

set db = currentDb
set rs = db.openrecordset ("Document")

If rs!Titre <> txtTitre then
"execution de la macro qui ajoute un nouvel enregistrement ds la table
document"

End if
........

J'ai pensé à rajouter à la suite du "set rs...." une requête qui me permet
de trier les enregistrements de ma table par num-auto suivi d'un movelast et

récupérer le dernier enregistrement saisi :
Document = "SELECT Document.* "
Document = Document & "FROM Document "
Document = Document & "ORDER BY Document.IdDocument ASC "
rs.movelast

Est-ce correct ?







Avatar
Raymond [mvp]
Dlookup, recherche un enregistrement précis (clause where) dans un domaine
(table ou requête) et retourne la valeur d'un champ.
Voir l'aide en ligne.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jérémie" a écrit dans le message de
news:
Ok, merci mais moi pas connaitre "dlookup", tu peux m'expliquer s'il te
plait ?


Jérémie


Avatar
Jérémie
Ok, merci Raymond, mais à supposer que 2 documents ds la base aient un titre identique, ça complique les choses, non ?

Jérémie


Tu ferais bien de tester au préalable si le titre existe ou non dans la
table par un dlookup et récupérer directement l'identifiant. selon le
résultat, tu fais une requête ajout ou non.

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jérémie" a écrit dans le message de
news:
Merci pour vos contributions.

Voilà le pb qui se pose :

Lorsque je saisi des enregistrements, je renseigne un titre, une date...
et aussi plusieurs mots-clés. Pour les mots-clés associés à

l'enregistrement, j'ai deux listesbox : l'une contient l'ensemble des
mots-clés (un lexique tt simplement) et l'autre contient la sélection des
mots-clés pour mon enregistrement. J'utilise pour cela un bouton qui qui
duplique le mot-clé choisi dans le lexique ds mon autre liste de sélection.
Au niveau de mon modèle de données, j'ai une table "document" et une table
"mot-clé" en relation infini-infini donc avec l'apparition d'une 3è table

intermédiaire composée des ID des 2 tables.
Pour chaque enregistrement, il faut d'abord saisir le titre, la date...
puis ensuite les mots-clés. Lorsque je sélectionne un mot-clé, ma table

"document" se met à jour avec le titre, la date, le lien hypertxt ainsi que
ma table intermédiaire avec le num-auto du document et le num-auto du
motclé. Si je choisi un deuxième mot-clé pour ce même enregistrement, je dis
en code VB (enfin, j'essaie !) que si le titre ds le formulaire en question
est égal au titre de mon enregistrement ds ma table "document, alors, il ne
faut pas rajouter une 2ème fois le titre ds ma table mais juste récupérer
l'identifiant de cet enregistrement et l'associer aà l'ID du 2nd mot-clé
dans la table intermédiaire.

voila la clause conditionnelle en VBA :

set db = currentDb
set rs = db.openrecordset ("Document")

If rs!Titre <> txtTitre then
"execution de la macro qui ajoute un nouvel enregistrement ds la table
document"

End if
........

J'ai pensé à rajouter à la suite du "set rs...." une requête qui me permet
de trier les enregistrements de ma table par num-auto suivi d'un movelast et

récupérer le dernier enregistrement saisi :
Document = "SELECT Document.* "
Document = Document & "FROM Document "
Document = Document & "ORDER BY Document.IdDocument ASC "
rs.movelast

Est-ce correct ?







Avatar
Raymond [mvp]
Bonjour.

il faut que la clause where de ton dlookup soit basée sur une valeur unique
dans ce cas ( valeurs concaténées possible)

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jérémie" a écrit dans le message de
news:
Ok, merci Raymond, mais à supposer que 2 documents ds la base aient un
titre identique, ça complique les choses, non ?


Avatar
Jérémie
Voilà, je l'avais déjà essayé ds ma méthode Dlookup mais ça ne marchais pas. J'avais pourtant trouvé ds le forum des questions et des réponses appropriées.

Dim Critere as variant

Critere = "[Titre]= '" & Forms!Crea_Document!txtTitre & "' And [Date] = '"& Forms!Crea_Document!txtDate &"'"
DLookup("[Titre]", "Document", Critère)

Message d'erreur : Type de données incompatibles ds l'expression du critere

Merci,

Jérémie


Bonjour.

il faut que la clause where de ton dlookup soit basée sur une valeur unique
dans ce cas ( valeurs concaténées possible)

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jérémie" a écrit dans le message de
news:
Ok, merci Raymond, mais à supposer que 2 documents ds la base aient un
titre identique, ça complique les choses, non ?







Avatar
Raymond [mvp]
C'est le format date qui est en erreur:

Critere = "[Titre]= '" & Forms!Crea_Document!txtTitre & "' And [Date] = #"&
Forms!Crea_Document!txtDate &"#"
ne connaissant pas to format de date, il faudra surement passer par le
format US:
Critere = "[Titre]= '" & Forms!Crea_Document!txtTitre & "' And [Date] = #"&
Format(Forms!Crea_Document!txtDate, "mm/dd/yyyy") &"#"

--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jérémie" a écrit dans le message de
news:
Voilà, je l'avais déjà essayé ds ma méthode Dlookup mais ça ne marchais
pas. J'avais pourtant trouvé ds le forum des questions et des réponses

appropriées.

Dim Critere as variant

Critere = "[Titre]= '" & Forms!Crea_Document!txtTitre & "' And [Date] '"& Forms!Crea_Document!txtDate &"'"
DLookup("[Titre]", "Document", Critère)

Message d'erreur : Type de données incompatibles ds l'expression du
critere


Merci,

Jérémie


1 2