OVH Cloud OVH Cloud

incrémentation particuliere

7 réponses
Avatar
pascal913
Bonjour a tous !

Je suis sous access 97. J'ai une table qui contient une douzaine de
champs et un formulaire bas=E9 sur cette table qui me permet d'entrer
des nouveaux enregistrements dans ma base de donn=E9es.
J'ai un champ NoFA (avec Indexed Yes (Duplicates OK)) qui
m'incr=E9mente mon num=E9ro parfaitement, voici le code :

Code :
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim rs As DAO.Recordset
Set rs =3D CurrentDb.OpenRecordset(Me.RecordSource, dbOpenSnapshot)
Me!NoFA =3D 1
rs.MoveLast
Me!NoFA =3D rs!NoFA + 1
rs.Close
Set rs =3D Nothing
End Sub

Code qui m'incremente de 1 =E0 chaque nouvel enregistrement. J'ai
r=E9ussi =E0 avoir ceci :

No Client
1 toto
4 tata
12 titi
7 tutu

L=E0 c'est moi qui mets le num=E9ro que je veux. j'ai reussi =E0 ce que
dans l'enregistrement suivant, sans que je touche au num=E9ro NoFA, que
NoFA ait le num=E9ro 8.
Donc obtenir le num=E9ro qui suit celui du dernier enregistrement
entr=E9.

Mais je viens de m'apercevoir qu'il y a une erreur qui se produit a
chaque fois que je reouvre le formulaire !
En fait le syst=E8me que je voulais marche parfaitement mais le souci
est que quand je reouvre le formulaire, il m'inverse les deux derniers
enregistrements
dans mon cas :

table datasheet
1203
1204

formulaire
1204
1203

Et apr=E8s, impossible de recommencer =E0 incrementer de la m=EAme fa=E7on
que je vous ai montr=E9.
C'est-=E0-dire que si apres 1204 et 1203 j'=E9cris 2500 pour
l'enregistrement suivant celui d'apres aura le num=E9ro 1205 et celui
d'apres 1205 ! alors que je voudrais le 2501.
C'est trop bizarre !
Par contre au tout d=E9but quand j'ai entr=E9 plus de 70 enregistrements
de cette fa=E7on sans fermer le formulaire, aucun probl=E8me.

Quelqu'un aurait-il une id=E9e pour mon souci ? Je remercie d=E9j=E0 tous
ceux qui m'aideront =E0 r=E9soudre mon dernier probl=E8me.

Merci

7 réponses

Avatar
Raymond [mvp]
Bonjour.

il ne faut pas procéder ainsi car tu ne peux pas savoir si le dernier
enregistrement est bien physiquement ou logiquement le dernier (pas de tri
indiqué)
utilise plutôt la fonction Dmax qui ira chercher le numéro de plus forte
valeur.
voir une exemple de création de numéro sur:
http://officesystem.access.free.fr/ex_numauto_personnel.htm

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
Découvrez le Jargonaute, le langage IT, tel que vous n'avez jamais osé le
parler:
http://www.microsoft.com/france/communautes/jargonaute/


"pascal913" a écrit dans le message de news:

Bonjour a tous !

Je suis sous access 97. J'ai une table qui contient une douzaine de
champs et un formulaire basé sur cette table qui me permet d'entrer
des nouveaux enregistrements dans ma base de données.
J'ai un champ NoFA (avec Indexed Yes (Duplicates OK)) qui
m'incrémente mon numéro parfaitement, voici le code :

Code :
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(Me.RecordSource, dbOpenSnapshot)
Me!NoFA = 1
rs.MoveLast
Me!NoFA = rs!NoFA + 1
rs.Close
Set rs = Nothing
End Sub

Code qui m'incremente de 1 à chaque nouvel enregistrement. J'ai
réussi à avoir ceci :

No Client
1 toto
4 tata
12 titi
7 tutu

Là c'est moi qui mets le numéro que je veux. j'ai reussi à ce que
dans l'enregistrement suivant, sans que je touche au numéro NoFA, que
NoFA ait le numéro 8.
Donc obtenir le numéro qui suit celui du dernier enregistrement
entré.

Mais je viens de m'apercevoir qu'il y a une erreur qui se produit a
chaque fois que je reouvre le formulaire !
En fait le système que je voulais marche parfaitement mais le souci
est que quand je reouvre le formulaire, il m'inverse les deux derniers
enregistrements
dans mon cas :

table datasheet
1203
1204

formulaire
1204
1203

Et après, impossible de recommencer à incrementer de la même façon
que je vous ai montré.
C'est-à-dire que si apres 1204 et 1203 j'écris 2500 pour
l'enregistrement suivant celui d'apres aura le numéro 1205 et celui
d'apres 1205 ! alors que je voudrais le 2501.
C'est trop bizarre !
Par contre au tout début quand j'ai entré plus de 70 enregistrements
de cette façon sans fermer le formulaire, aucun problème.

Quelqu'un aurait-il une idée pour mon souci ? Je remercie déjà tous
ceux qui m'aideront à résoudre mon dernier problème.

Merci
Avatar
pascal913
Merci Raymond[mvp] de m'avoir répondu mais le truc c'est que j'avais
déjà essayé cette fonction mais sans succès. Peut être alors
sais-tu comment l'intégrer dans mon code et dans mon cas ? Parce que
je ne fais que des essais grace a ton lien mais rien ne marche.

Merci d'avance.
Avatar
Raymond [mvp]
remplace ta procédure:
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(Me.RecordSource, dbOpenSnapshot)
Me!NoFA = 1
rs.MoveLast
Me!NoFA = rs!NoFA + 1
rs.Close
Set rs = Nothing
End Sub

par :
Private Sub Form_BeforeInsert(Cancel As Integer)
Me!NoFA = DMax("NoFA", "matable") + 1
End Sub

matable est le nom exact de ta table.
qu'est-ce que ça dit ?
--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
Découvrez le Jargonaute, le langage IT, tel que vous n'avez jamais osé le
parler:
http://www.microsoft.com/france/communautes/jargonaute/


"pascal913" a écrit dans le message de news:

Merci Raymond[mvp] de m'avoir répondu mais le truc c'est que j'avais
déjà essayé cette fonction mais sans succès. Peut être alors
sais-tu comment l'intégrer dans mon code et dans mon cas ? Parce que
je ne fais que des essais grace a ton lien mais rien ne marche.

Merci d'avance.
Avatar
pascal913
Si je prends le code que tu m'as montré, mon numéro va s'incrémenter
par rapport au numéro le plus grand et non pas le dernier écrit.

Merci pour ton aide.
Avatar
Raymond [mvp]
le dernier écrit n'est pas toujours en dernière position et tu ne peux pas
partir sur ce shéma.
il te faut donc placer ce numéro dans une table paramètres et aller le
chercher dans ta procédure.
dans l'événement afterupdate, tu iras replacer le numéro réel créé dans la
table paramètres.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
Découvrez le Jargonaute, le langage IT, tel que vous n'avez jamais osé le
parler:
http://www.microsoft.com/france/communautes/jargonaute/


"pascal913" a écrit dans le message de news:

Si je prends le code que tu m'as montré, mon numéro va s'incrémenter
par rapport au numéro le plus grand et non pas le dernier écrit.

Merci pour ton aide.
Avatar
pascal913
le dernier écrit n'est pas toujours en dernière position et tu ne peux pas
partir sur ce shéma.


J'y suis obligé malheureusement...

il te faut donc placer ce numéro dans une table paramètres et aller le
chercher dans ta procédure.
dans l'événement afterupdate, tu iras replacer le numéro réel cr éé dans la
table paramètres.


Peux tu me préciser lol j'ai pas trop bien capté ce que tu m'as dis.
Si ce que tu dis fonctionne, cela fera-t-il ce que je souhaite faire ?

Merci d'avance.

Avatar
Raymond [mvp]
tu crées une table avec un seul champ (T_NUM) et un seul enregistrement .
dans ta procédure tu vas chercher ce numéro, si besoin, par un DLookup et tu
lui rajoutes 1.
lorsque tu as mis à jour, tu vas réécrire le champ avec la valeur que tu as
choisie, par une requête ou un recordset.


--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://www.mpfa.info/ pour débuter sur le forum.
Découvrez le Jargonaute, le langage IT, tel que vous n'avez jamais osé le
parler:
http://www.microsoft.com/france/communautes/jargonaute/


"pascal913" a écrit dans le message de news:

le dernier écrit n'est pas toujours en dernière position et tu ne peux pas
partir sur ce shéma.


J'y suis obligé malheureusement...

il te faut donc placer ce numéro dans une table paramètres et aller le
chercher dans ta procédure.
dans l'événement afterupdate, tu iras replacer le numéro réel créé dans la
table paramètres.


Peux tu me préciser lol j'ai pas trop bien capté ce que tu m'as dis.
Si ce que tu dis fonctionne, cela fera-t-il ce que je souhaite faire ?

Merci d'avance.