Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Numéros auto libres

23 réponses
Avatar
JulieH
Bonjour,

Bricoleuse sur Access, je consulte souvent le forum et ses archives qui
m'aident évidemment beaucoup. Cependant, cette fois-ci, je n'ai pas
trouvé ce que je cherche. Voici mon problème exposé de manière simplifié :

Je gère des troupeaux d'animaux qui ont des numéros de tatouage à 9
chiffres. Comme ce n'est pas très pratique à saisir sans erreur, je leur
affecte
un "numéro de travail" à 3 chiffres plus facile à utiliser.
Lorsque je démarre un cheptel, je crée mes animaux (par exemple 999
individus) et Access leur affecte un numéro de travail auto de 1 à 999.
Dans les semaines suivantes, certains sont vendus ou disparaissent, je
les enregistre et ainsi, leurs numéros se libèrent.
Le mois suivant par exemple, si j'entre d'autres animaux dans le
cheptel, je souhaite qu'Access leur affecte les numéros libérés.

Est-ce possible ? Merci par avance pour vos idées.

Julie

10 réponses

1 2 3
Avatar
JulieH
Bonsoir,

Je ne m'en sort pas malgré la fonction que tu m'as proposée. J'ai fait
un petit essai en créant une table avec 4 individus et 4 numéros de
travail sans utliser des chiffres à suivre (1 - 2 - 4 - 6)

J'ai modifié la fonction de la manière suivante pour prendre en compte
mes champs (Tbl_Cheptel pour la table, NumTrav et Date_sortie pour les
deux champs de la table) :

Public fctNumTravail As Integer
Dim db As DAO.Database, rst As DAO.Recordset, i As Integer

Set db = Application.CurrentDb
Set rst = db.OpenRecordset("Tbl_Cheptel", dbOpenDynaset)

For i = 1 To 6
rst.FindFirst "NumTrav = " & i
If rst.NoMatch Then Exit For
rst.FindFirst "NumTrav = " & i & " AND Not IsNull(Date_sortie)"
If rst.NoMatch Then Exit For
Next i

rst.Close
Set rst = Nothing
Set db = Nothing

If i = 6 Then
MsgBox "Pb d’attribution du Numéro de travail : plus de 6."
i = 0
End If

fctNumTravail = i

End Function

En revanche, comme je ne suis pas sùre pour les guillements, j'ai
réalisé plusieurs essais.
J'ai crée un petit formulaire, j'ai placé une zone de texte dans
laquelle j'ai mis : =[fctNumTravail].
Le résultat est : #Nom ?

Y-a-t-il quelque chose que je n'ai pas compris ?

Julie

Bonjour;

à 3stones : La demande de JulieH est d'utiliser comme un nom les nombres
entre 1 et 999, en réutilisant ceux qui se libèrent. Mais quand un nombre se
libère, il ne disparait pas : ce n'est donc pas la clé de la table.
C'est pourquoi je crains que ce que tu proposes ne conviennes pas. Enfin, si
ce n'est pas moi qui ai mal compris...

Cordialement,


Avatar
3stone
Salut pgz,

"pgz"
| à 3stones : La demande de JulieH est d'utiliser comme un nom les nombres
| entre 1 et 999,


Tu as raison (en partie ;-)
J'ai lu le message d'origine (j'avais pris en cours de route...) et elle
demande bien à réutiliser un numéro libre <999


| en réutilisant ceux qui se libèrent. Mais quand un nombre se
| libère, il ne disparait pas : ce n'est donc pas la clé de la table.

Mais, là ou tu te trompe, c'est qu'elle parle bien de la clé primaire
qui plus est, est un numéroauto comme le dit l'objet du message !


JulieH :
Ce que tu cherche à faire n'est pas une bonne idée, du tout !!!

Tu dis:
"Lorsque je démarre un cheptel, je crée mes animaux (par exemple 999
individus) et Access leur affecte un numéro de travail auto de 1 à 999.
Dans les semaines suivantes, certains sont vendus ou disparaissent, je
les enregistre et ainsi, leurs numéros se libèrent."

Cela veut donc bien dire que Access attribue un numéroauto, qui se
libère lorsque l'animal est vendu, et que toi tu cherche à réutilser se
même numéro...

1) Un numéroauto est utiliser lorsque rien d'autre ne se prête à être
clé primaire !
2) Ce numéro ne doit (devrait) même pas apparaitre, puisqu'il ne sert
en principe qu'aux relations
3) Si un animal vendu portant le numéro 333 et que ce numéro est
réattribué à un autre animal - quel sera l"animal désigné par ce
numéro 333 ???

Tu vas sûrement me répondre que tu vérifie leur numéro de tatouage...
Si ce numéro est unique, comme je l'imagine, c'est donc bien celui-là
que tu DOIT utiliser comme clé primaire !

Pour faciliter les recherches et les manipulations, il existe les listes
et autres méthodes qui ne justifie pas cette double numérotation.

my2cent

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
MPFA: http://www.mpfa.info/ (infos générales)
Avatar
JulieH
Bonsoir,

Je me suis déjà aperçue de cette erreur (de language).

En fait j'utilise bien comme clé primaire le numéro de tatouage et je
vérifie quand j'entre un animal qu'il n'y a pas de double (formule
Dcount dans mon formulaire Entrée).

Pour le reste, j'utilise un numéro de travail et comme je ne souhaite
pas que ce numéro de travail soit trop long à saisir (risque d'erreur),
je veux limiter le nombre de caractères.
Par exemple, au départ je sais qu'il n'y aura jamais plus de 999 dans
mon cheptel car j'ai 999 places, je crée donc mes 999 animaux avec des
numéros de travail de 1 à 999. Lorsqu'il y a une vente, je saisis dans
mon formulaire Sortie : le numéro de travail (vérif pour dire qu'il est
bien là), la date et la cause de sortie. Dans la table, il se passe
alors la chose suivante (non encore réalisé) : effacement du numéro de
travail et enregistrement de la date de sortie (+ cause).
Comme j'ai réformé un animal (ou plusieurs), il y a de la place dans
mon bâtiment, je peux donc en introduire de nouveaux. C'est à ce
moment-là que je veux ré-utiliser les numéros de travail libérés (et si
possible ceux libérés depuis le plus longtemps).

J'espère que j'ai été plus claire.

Julie

Salut pgz,

"pgz"
| à 3stones : La demande de JulieH est d'utiliser comme un nom les nombres
| entre 1 et 999,


Tu as raison (en partie ;-)
J'ai lu le message d'origine (j'avais pris en cours de route...) et elle
demande bien à réutiliser un numéro libre <999


| en réutilisant ceux qui se libèrent. Mais quand un nombre se
| libère, il ne disparait pas : ce n'est donc pas la clé de la table.

Mais, là ou tu te trompe, c'est qu'elle parle bien de la clé primaire
qui plus est, est un numéroauto comme le dit l'objet du message !


JulieH :
Ce que tu cherche à faire n'est pas une bonne idée, du tout !!!

Tu dis:
"Lorsque je démarre un cheptel, je crée mes animaux (par exemple 999
individus) et Access leur affecte un numéro de travail auto de 1 à 999.
Dans les semaines suivantes, certains sont vendus ou disparaissent, je
les enregistre et ainsi, leurs numéros se libèrent."

Cela veut donc bien dire que Access attribue un numéroauto, qui se
libère lorsque l'animal est vendu, et que toi tu cherche à réutilser se
même numéro...

1) Un numéroauto est utiliser lorsque rien d'autre ne se prête à être
clé primaire !
2) Ce numéro ne doit (devrait) même pas apparaitre, puisqu'il ne sert
en principe qu'aux relations
3) Si un animal vendu portant le numéro 333 et que ce numéro est
réattribué à un autre animal - quel sera l"animal désigné par ce
numéro 333 ???

Tu vas sûrement me répondre que tu vérifie leur numéro de tatouage...
Si ce numéro est unique, comme je l'imagine, c'est donc bien celui-là
que tu DOIT utiliser comme clé primaire !

Pour faciliter les recherches et les manipulations, il existe les listes
et autres méthodes qui ne justifie pas cette double numérotation.

my2cent



Avatar
pgz
Bonjour.

Ton erreur est je pense dans la façon d'utiliser la fonction.
Je te propose de rédiger une procédure évenementielle après maj du contrôle
"tatouage"

sub tatouage_AfterUpdate

if isnull(me.tatouage.oldvalue) And Not Isnull(me.tatouage) Then
me.numtravail = fctnumtravail()
end sub

Ca devrait aller mieux.

Bon courage,

PGZ
--
pgz
_____________________________




Bonsoir,

Je ne m'en sort pas malgré la fonction que tu m'as proposée. J'ai fait
un petit essai en créant une table avec 4 individus et 4 numéros de
travail sans utliser des chiffres à suivre (1 - 2 - 4 - 6)

J'ai modifié la fonction de la manière suivante pour prendre en compte
mes champs (Tbl_Cheptel pour la table, NumTrav et Date_sortie pour les
deux champs de la table) :

Public fctNumTravail As Integer
Dim db As DAO.Database, rst As DAO.Recordset, i As Integer

Set db = Application.CurrentDb
Set rst = db.OpenRecordset("Tbl_Cheptel", dbOpenDynaset)

For i = 1 To 6
rst.FindFirst "NumTrav = " & i
If rst.NoMatch Then Exit For
rst.FindFirst "NumTrav = " & i & " AND Not IsNull(Date_sortie)"
If rst.NoMatch Then Exit For
Next i

rst.Close
Set rst = Nothing
Set db = Nothing

If i = 6 Then
MsgBox "Pb d’attribution du Numéro de travail : plus de 6."
i = 0
End If

fctNumTravail = i

End Function

En revanche, comme je ne suis pas sùre pour les guillements, j'ai
réalisé plusieurs essais.
J'ai crée un petit formulaire, j'ai placé une zone de texte dans
laquelle j'ai mis : =[fctNumTravail].
Le résultat est : #Nom ?

Y-a-t-il quelque chose que je n'ai pas compris ?

Julie

Bonjour;

à 3stones : La demande de JulieH est d'utiliser comme un nom les nombres
entre 1 et 999, en réutilisant ceux qui se libèrent. Mais quand un nombre se
libère, il ne disparait pas : ce n'est donc pas la clé de la table.
C'est pourquoi je crains que ce que tu proposes ne conviennes pas. Enfin, si
ce n'est pas moi qui ai mal compris...

Cordialement,





Avatar
JulieH
Merci encore pour ta patience,

Ton nouveau conseil semble aller dans le bon sens, mais il y a un
message d'erreur : "Erreur de compilation - Instruction incorrecte à
l'extérieur d'une procédure" - et le déboguage est sur la ligne "Set db
= ...".

Rappel de ce que j'ai fait :
- Tbl_Cheptel pour la table,
- N°_tatouage - NumTrav et Date_sortie pour les champs de la table.

Ma fonction :

Public fctNumTravail As Integer
Dim db As DAO.Database, rst As DAO.Recordset, i As Integer

Set db = Application.CurrentDb
Set rst = db.OpenRecordset("Tbl_Cheptel", dbOpenDynaset)

For i = 1 To 6
rst.FindFirst "NumTrav = " & i
If rst.NoMatch Then Exit For
rst.FindFirst "NumTrav = " & i & " AND Not IsNull(Date_sortie)"
If rst.NoMatch Then Exit For
Next i

rst.Close
Set rst = Nothing
Set db = Nothing

If i = 6 Then
MsgBox "Pb d’attribution du Numéro de travail : plus de 6."
i = 0
End If

fctNumTravail = i

End Function

Enfin création d'un formulaire avec 3 contrôles :
- "N°_tatouage" - "NumTrav" et "Date_sortie"
- Procédure après MAJ du contrôle "N°_tatouage".


Procédure modiifiée :

Private Sub Numéro_de_tatouage_AfterUpdate()

If IsNull(Me.N°_tatouage.OldValue) And Not IsNull(Me.N°_tatouage) Then
Me.NumTrav = fctNumTravail()
End Sub

Julie
Avatar
pgz
Normal, je t'ai donné un code non validé, donc bien sûr erronné.
Alors, au temps pour moi :
***********************
Public function fctNumTravail As Integer
Dim db As DAO.Database, rst As DAO.Recordset, i As Integer

Set db = Application.CurrentDb
Set rst = db.OpenRecordset("Tbl_Cheptel", dbOpenDynaset)

For i = 1 To 6
rst.FindFirst "NumTrav = " & i & " AND IsNull(Date_sortie)"
If rst.NoMatch Then Exit For
Next i

rst.Close
Set rst = Nothing
Set db = Nothing

If i = 6 Then
MsgBox "Pb d’attribution du Numéro de travail : plus de 6."
i = 0
End If

fctNumTravail = i

End Function
*********************


J'en ai profité pour corriger une autre erreur, dans la boucle For ... Next.
Le reste devrait convenir.
Tiens moi au courant.
--
pgz
_____________________________


Avatar
JulieH
J'ai changé la fonction avec la nouvelle version.

Dans mon formulaire, j'ai saisi un nouveau numéro de tatouage puis OK.

Nouveau message d'erreur :
"Erreur de compilation - Membre de méthode ou de données introuvable"
Déboguage sur ".OldValue".

Private Sub Numéro_de_tatouage_AfterUpdate()

If IsNull(Me.N°_tatouage.OldValue) And Not IsNull(Me.N°_tatouage) Then
Me.NumTrav = fctNumTravail()
End Sub

A quoi cela correspond-t-il ?

Julie




Normal, je t'ai donné un code non validé, donc bien sûr erronné.
Alors, au temps pour moi :
***********************
Public function fctNumTravail As Integer
Dim db As DAO.Database, rst As DAO.Recordset, i As Integer

Set db = Application.CurrentDb
Set rst = db.OpenRecordset("Tbl_Cheptel", dbOpenDynaset)

For i = 1 To 6
rst.FindFirst "NumTrav = " & i & " AND IsNull(Date_sortie)"
If rst.NoMatch Then Exit For
Next i

rst.Close
Set rst = Nothing
Set db = Nothing

If i = 6 Then
MsgBox "Pb d’attribution du Numéro de travail : plus de 6."
i = 0
End If

fctNumTravail = i

End Function
*********************


J'en ai profité pour corriger une autre erreur, dans la boucle For ... Next.
Le reste devrait convenir.
Tiens moi au courant.



Avatar
pgz
Il faudrait savoir comment tu as appelé le contrôle qui contient le num de
tatouage. D'après ton dernier mesage : N°_tatouage,
mais d'après ton message précédent : numéro_de_tatouage (voir procédure
évènementielle)

Il te suffit le mettre le même partout...

A ce sujet, il est très déconseillé de metre des espaces ou des "_" dans les
noms d'objets et variable. Dans le cas présent : Numtatouage, NuméroTatouage,
N°Tatouage ou même tatouage sont bien préférables...

Aplus
--
pgz
_____________________________

Avatar
JulieH
Je pense qu'on approche du but, il me reste quelques "détails" à régler :

Dans mon formulaire, j'ai 3 contrôles, dans l'ordre : tatouage - date -
numéro de travail.
- J'ai mis la procédure afterupdate sur le contrôle "Tatouage".
- Or la mise à jour ne se fait que lorsque j'ai cliqué deux fois dans
la zone "Numéro de travail". Ce serait plus logique si cela se faisait
avant. Lorsque je quitte la date d'entrée par exemple.

Second problème : le système pour gérer le dépassement de numéros ne
fonctionne pas. Dans mon exemple avec numéros de 1 à 6. Tout marche bien
si un ou plusieurs numéros entre 1 et 6 manquent. En revanche, si j'ai
tous les numéros entre 1 et 6, je ne vois pas apparaître la MsgBox, il
m'inscrit toujours 7.

Julie



Il faudrait savoir comment tu as appelé le contrôle qui contient le num de
tatouage. D'après ton dernier mesage : N°_tatouage,
mais d'après ton message précédent : numéro_de_tatouage (voir procédure
évènementielle)

Il te suffit le mettre le même partout...

A ce sujet, il est très déconseillé de metre des espaces ou des "_" dans les
noms d'objets et variable. Dans le cas présent : Numtatouage, NuméroTatouage,
N°Tatouage ou même tatouage sont bien préférables...

Aplus


Avatar
pgz
Bonjour.

------------------------ citation : -------------------------------
Or la mise à jour ne se fait que lorsque j'ai cliqué deux fois dans
la zone "Numéro de travail".
---------------------- fin de citation ---------------------------


Je n'ai aucune explication à cela. Faudrait voir ce que tu as fait.
L'information de num trav devrait bien sûr se fair après mise à jour de
tatouage...

------------------------ citation : -------------------------------
le système pour gérer le dépassement de numéros ne
fonctionne pas. Dans mon exemple avec numéros de 1 à 6. Tout marche bien
si un ou plusieurs numéros entre 1 et 6 manquent. En revanche, si j'ai
tous les numéros entre 1 et 6, je ne vois pas apparaître la MsgBox, il
m'inscrit toujours 7.
---------------------- fin de citation ---------------------------



Là c'est facile : encore une coquille de la fonction. Remède : remplacer
"if i = 6 ..."
par
"if i = 7 ..."

A plus et bon dimanche,
--
pgz
_____________________________


1 2 3