Réinitialisation de la numérotation automatique
Tout le monde connait cela un jour au l'autre. On utilise un champ index avec une numérotation automatique et bien sûr, on finit par effacer des enregistrements. La base de données se retrouve alors orpheline de quelques numéros. Cela n'empêche pas son utilisation, mais cela nous chagrine de voir cette numérotation discontinue
Or Access ne possède pas en natif d'une fonction qui permet de réinitialiser cela, il faut effacer la table. Bien sûr, il y a le fruit de nos encodages que l'on ne souhaite pas perdre. Alors ! Quelle solution ?
Une fois encore, nous allons leurrer Access. Cela se passe en 7 grosses étapes :
- Nous nous assurons que la table est bien fermée
- Nous créons une copie de notre table en lui donnant un autre nom
- Nous vidons la table originelle
- Nous créons une seconde copie de la table mais comme elle est SANS enregistrement, l'index est automatiquement réinitialisé à zéro
- Nous écrasons l'ancienne table en renommant cette seconde copie
- Nous réinjectons les enregistrements (SAUF le champ indexé) de la première copie vers notre nouvelle table (son champ numérotation automatique fait son travail, numérote sans "trou" et depuis le chiffre 1 ses nouveaux enregistrements
- Nous effaçons la table temporaire...
Ni vu, nu connu, je t'embrouille...
Sub reset()
'il faut personnaliser les mentions Table1 avec le nom de votre table,
'il faut complèter l'instruction insert Into
With DoCmd
Close acTable, "Table1", acSaveYes 'la table doit absolument être fermée
SetWarnings False 'pas de message système
CopyObject , "Table1Temp", acTable, "Table1" 'ceci crée une table temporaire qui contient les enregistrements
RunSQL "Delete * From Table1" 'on efface les enregistrements dans la table d'origine
Rename "Table1Old", acTable, "Table1" 'si vous ouvrez la table old,créez un enregistrement, vous verrez que la numérotation se poursuit
CopyObject , "Table1", acTable, "Table1Old" 'c'est ici que le miracle s'accomplit, la numérotation est réinitialisée
'en fait on a recréé la table en réutilisant l'ancien nom et elle est donc considérée comme une nouvelle table
DeleteObject acTable, "Table1Old" 'on efface cette table old qui ne sert plus à rien
RunSQL "INSERT INTO Table1( Nom,Prenom)SELECT Table1Temp.Nom,Table1Temp.Prenom FROM Table1Temp"
'à personnaliser suivant les champs, on réinjecte les enregistrements
DeleteObject acTable, "Table1Temp" 'on efface cette table qui ne sert plus
SetWarnings True 'on réactive les alertes du système
End With
End Sub
Suivant le nombre d'enregistrements dans votre table, cela peut prendre un certain temps.
Attention, ceci n'est pas valable sur des tables secondaires avec des relations sans examiner vos jointures. Faites toujours un test sur une copie de votre base de données avant de mettre cette fonction en production.
Cliquez ici pour télécharger le fichier ResetAutonumber
Fin