Access numeros auto

TRAX44 Messages postés 93 Date d'inscription mercredi 18 septembre 2002 Statut Membre Dernière intervention 20 juillet 2006 - 20 oct. 2003 à 18:05
inthecorner Messages postés 48 Date d'inscription mardi 10 décembre 2002 Statut Membre Dernière intervention 22 novembre 2004 - 21 oct. 2003 à 08:19
salut,
je cherchre a savoir comment on fait pour creer une bdd une table avec un champ en cler primaire et numéro auto qui s'incremente de 1 en 1
@+++
merci
trax44

1 réponse

inthecorner Messages postés 48 Date d'inscription mardi 10 décembre 2002 Statut Membre Dernière intervention 22 novembre 2004
21 oct. 2003 à 08:19
avec ca tu dois t'en sortir
Incrémentation automatique sans rubrique AutoNumérique

Les rubriques de type AutoNumérique présentent l'inconvénient d'incrémenter le compteur même si le processus d'ajout d'enregistrement est interrompu. Ainsi, un No de commande ou un No de facture peut avoir une valeur supérieure de 2 par rapport au précédent.

Dans une bdd mono-utilisateur, une solution simple à ce problème est d'utiliser le type de donnée Entier Long et de définir la valeur par défaut de la zone de texte NoCommande du formulaire comme suit:

=DLast("[NoCommande]", "Commande") + 1

La fonction intrinsèque DLast() retourne la valeur de la rubrique NoCommande de l'enregistrement précédent, et on y ajoute 1. Mais, la valeur de NoCommande sera incrémentée seulement quand l'enregistrement sera écrit dans la table sous-jacente. Pour tester au niveau de l'objet formulaire, on écrira par exemple ceci:

If NewRecord Then

txtNoCompte=DLast("[NoCompte]","tblClients") + 1

Pour une bdd accédée simultanément par plusieurs usagers, il est préférable d'utiliser l'algorithme suivant:

If NewRecord Then

txtNoCompte=1 + Nz(DMax("[NoCompte]","tblClients"), 0)

Bien entendu, dans les deux cas, la rubrique à incrémenter automatiquement sera de type Indexé sans doublon.

En réseau, on utilisera de préférence un module standard comprenant une fonction pour incrémenter automatiquement le compteur selon l'incrément désiré (unitaire dans l'exemple) et une fonction de reséquencement après suppressions.
Il est toutefois recommandé d'utiliser le type NumériqueAuto pour des numéros de comptes bancaires!!!

Public Function NumAuto(strNomTable, strNomFormulaire, strNomCompteur)
'Objectif: Incrémente automatiquement une rubrique de type numérique
'pour faire office de compteur autonumérique sans en avoir les inconvénients.
Dim rst As Recordset, lngNoEnreg As Long
lngNoEnreg = 0
If Forms(strNomFormulaire).Controls(strNomCompteur) = 0 Then

Set rst = CurrentDb.OpenRecordset(strNomTable, dbOpenDynaset)
With rst
If Not .BOF Then
.MoveLast
lngNoEnreg = .Fields(strNomCompteur)
End If
End With
Forms(strNomFormulaire).Controls(strNomCompteur) = lngNoEnreg + 1
End If
End Function

Public Function MajNumAuto(strNomTable As String, strNomCompteur As String)
'Objectif: Reséquencement unitaire de la rubrique faisant office de compteur autonumérique
'après des suppressions d'enregistrements.
'Attention ! Cette fonction ne devrait pas être appliquée à des numéros de compte bancaires.
Dim rst As Recordset, lngNbreEnreg As Long, lngNumAuto As Long, lngTmpNumAuto As Long
Set rst = CurrentDb.OpenRecordset(strNomTable, dbOpenDynaset)
With rst

If Not .BOF Then
.MoveLast
lngNumAuto = .Fields(strNomCompteur)
lngNbreEnreg = .RecordCount
If lngNumAuto = lngNbreEnreg Then Exit Function
.MoveFirst
lngTmpNumAuto = 0
Do Until .EOF
lngNumAuto = .Fields(strNomCompteur)
If lngNumAuto > lngTmpNumAuto + 1 Then
.Edit
.Fields(strNomCompteur) = lngTmpNumAuto + 1
.Update
End If lngTmpNumAuto = lngTmpNumAuto + 1
.MoveNext
Loop
End If
End With
End Function

Au niveau du formulaire de saisie on aura par exemple le code intégré suivant pour appeler les fonctions:

Private Sub Form_BeforeUpdate(Cancel As Integer)

Call NumAuto("tblClubs", "frmSaisieClubs", "CodeClub")
End Sub

Private Sub Form_Close()

Call MajNumAuto("tblClubs", "CodeClub")
End Sub
0
Rejoignez-nous