26
janvier
2005
A propos de la Numérotation Auto / Séquentielle
janvier
2005
Un article de Maxence HUBICHE
5 Commentaires
Les NuméroAuto servent de clé mais ils ne doivent en aucun cas véhiculer de l’information leur seul rôle étant d’être unique.
Lorsque des données sont ajoutées, puis supprimées, il risque donc d’y avoir des ‘trous’ dans votre numérotation.
Cependant, il est possible de combler les trous si on ne passe pas par un champ de numéro auto-incrémenté. La fonction suivante permet cela :
Function NextID(LeChamp As String, LaTable As String) As Long
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
'Fonction renvoyant le prochain Identifiant, en fonction des valeurs existantes dans une table.
'Arguments :
' LeChamp => Nom du champ Identifiant numérique Long concerné
' LaTable => Nom de la table contenant cet identifiant
'Retour :
' 1 s'il n'y a rien dans la table
' Le Nombre maximum +1 s'il y a une suite ininterrompue de nombres
' La valeur du nombre manquant en cas de trou.
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Dim sSQL As String
Dim rs As DAO.Recordset
Dim n As Long
'Chaîne SQL en fonction de LeChamp et de LaTable, retournant NULL ou le numéro du trou
sSQL = "SELECT Min([" & LeChamp & "]-1) AS NextID FROM " & LaTable & " AS T1 "
sSQL = sSQL & "WHERE ((([" & LeChamp & "]-1)>0) AND (((Select [" & LeChamp & "] "
sSQL = sSQL & "FROM " & LaTable & " T2 "
sSQL = sSQL & "Where T2.[" & LeChamp & "]=T1.[" & LeChamp & "]-1)) Is Null));"
Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenSnapshot)
'Nbre d'enregistrements dans laTable
n = DCount("[" & LeChamp & "]", "[" & LaTable & "]")
If n = 0 Then 'S'il n'y a pas d'enregistrements, mettre 1
NextID = 1
ElseIf IsNull(rs(0)) Then 'Si la requête ne renvoie rien, incrémenter de 1 le maximum
NextID = DMax("[" & LeChamp & "]", "[" & LaTable & "]") + 1
Else
NextID = rs(0) 'Sinon, il y a un trou. Renvoyer la valeur du trou
End If
End Function
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
'Fonction renvoyant le prochain Identifiant, en fonction des valeurs existantes dans une table.
'Arguments :
' LeChamp => Nom du champ Identifiant numérique Long concerné
' LaTable => Nom de la table contenant cet identifiant
'Retour :
' 1 s'il n'y a rien dans la table
' Le Nombre maximum +1 s'il y a une suite ininterrompue de nombres
' La valeur du nombre manquant en cas de trou.
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Dim sSQL As String
Dim rs As DAO.Recordset
Dim n As Long
'Chaîne SQL en fonction de LeChamp et de LaTable, retournant NULL ou le numéro du trou
sSQL = "SELECT Min([" & LeChamp & "]-1) AS NextID FROM " & LaTable & " AS T1 "
sSQL = sSQL & "WHERE ((([" & LeChamp & "]-1)>0) AND (((Select [" & LeChamp & "] "
sSQL = sSQL & "FROM " & LaTable & " T2 "
sSQL = sSQL & "Where T2.[" & LeChamp & "]=T1.[" & LeChamp & "]-1)) Is Null));"
Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenSnapshot)
'Nbre d'enregistrements dans laTable
n = DCount("[" & LeChamp & "]", "[" & LaTable & "]")
If n = 0 Then 'S'il n'y a pas d'enregistrements, mettre 1
NextID = 1
ElseIf IsNull(rs(0)) Then 'Si la requête ne renvoie rien, incrémenter de 1 le maximum
NextID = DMax("[" & LeChamp & "]", "[" & LaTable & "]") + 1
Else
NextID = rs(0) 'Sinon, il y a un trou. Renvoyer la valeur du trou
End If
End Function
Hello…
Bon, l’erreur de syntaxe provient peut-être du fait que le nom de la table contient des espaces.
Dans ce cas, il faut modifier la ligne suivante :
« FROM » & LaTable & » T2 »
par
« FROM [ » & LaTable & « ] T2 »
et cela devrait à nouveau fonctionner
Concernant le « comment ça se code »
Il suffit de créer un module, de copier-coller ce code adns le module, à enregistrer, et on a accès à une fonction.
Pour en savoir plus sur les généralités, je recommande d’aller jeter un oeil sur les tutoriels appropriés.
salut comment l’utilisez stp il y a toujours un message d’érreur erreur synthaxe
Bonjour,
C’est exactement ce que je recherche depuis plusieurs semaines mais je ne sais pas comment on code une fonction et comment on le gére réellement.
Dans mon cas j’ai en fait un formulaire où l’on rempli des informations et l’appui sur un bouton me permettrai en même temps d’enregistrer les données et de créer ce numéro automatique intélligent (si je peux me permettre) dans la table.
Merci pour votre aide et j’espére encore un peu.
Bonjour,
J’ai repris votre fonction « NextID » qui marche à merveille, mais je l’ai recopiée bêtement, sans en comprendre réellement le fonctionnement.
Cependant, dans certaines de mes tables, j’ai 2 clés primaires. Est-il possible d’adapter votre fontion en ce sens ?
Merci de votre aide
laurent
Après avoir intégrer ce code et lancer à l’exécution, j’ai un message d’erreur « erreur de syntaxe dans la clause FROM ». J’ai essayé de rajouter une parentèse fermante …mais cela n’a pas corrigé le problème.
Help me, please !