TRAX44
Messages postés93Date d'inscriptionmercredi 18 septembre 2002StatutMembreDernière intervention20 juillet 2006
-
20 oct. 2003 à 18:05
inthecorner
Messages postés48Date d'inscriptionmardi 10 décembre 2002StatutMembreDernière intervention22 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
inthecorner
Messages postés48Date d'inscriptionmardi 10 décembre 2002StatutMembreDernière intervention22 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:
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