Numérotation personnalisée : variante 3
J’ai une table de personnes avec un identifiant (
Id
), un nom et un prénom. Et je voudrais que l’identifiant soit automatiquement du type :
- 3 premières lettres du nom
- 3 premières lettres du prénom
- 3 chiffres
Comment faire ?
Les épisodes précédents
Cet article fait suite à une série d’épisodes déjà diffusés sur cette chaîne. Pour le replay, consultez ces articles 🙂 :
- Numérotation personnalisée,
- Numérotation personnalisée : variante,
- Numérotation personnalisée : variante 2.
Avant de démarrer
Le principe, aujourd’hui, est donc de créer le numéro automatique à partir de champs du formulaire (et de la table sous-jacente). Comme je l’ai dit plus haut, j’ai une table de personnes avec un identifiant (Id
), un nom et un prénom. Et je voudrais que l’identifiant soit automatiquement du type :
- 3 premières lettres du nom
- 3 premières lettres du prénom
- 3 chiffres (par exemple)
… le tout en majuscules pour formater le résultat proprement.
Concrètement, si la personne s’appelle Inisan Hervé, le code devra être de la forme INIHER001
. Et si un deuxième « Inisan Hervé » est saisi dans la base – je suis effectivement saisi, mais ça doit être le froid en ce mois de Juin épique 😉 -, le code devrait être INIHER002
.
Si on y regarde bien, il suffit de reprendre la fonction de numérotation automatique des articles précédents, et d’adapter le « préfixe ».
Le code
- Reprenez la fonction
AutoNumber()
fournie dans le premier article de la série. - Remplacez l’événement
Avant MAJ
du formulaire par celui-ci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Private Sub Form_BeforeUpdate(Cancel As Integer) Dim strCode As String Dim strPrefixe As String ' Vérifier que le nom et le prénom ' sont renseignés, puisqu'ils servent ' dans le préfixe de numérotation If IsNull(Me.Nom) Or IsNull(Me.Prénom) Then MsgBox "Le nom et le prénom doivent être renseignés !", vbExclamation Cancel = True Exit Sub End If ' Préfixe à utiliser pour la numérotation strPrefixe = UCase(Left(Me.Nom, 3) & Left(Me.Prénom, 3)) ' Numérotation If IsNull(Me.Id) Then Me.Id = AutoNumber("tbl Personnes", "Id", strPrefixe, 3) End If End Sub |
Adaptez bien sûr les noms de tables et de champs à votre base de données.
C’est toujours tentant d’avoir un code qui reprend certaines données de l’enregistrement associé. Quand on lit le code, on identifie immédiatement la fiche (ici, la personne).
Maintenant, méfiez vous aussi du principe, parce que le code n’est plus un champ atomique (il contient plusieurs informations au lieu d’une seule).
D’autre part, dans cet exemple, on ne gère que l’attribution du code. Si le nom et le prénom sont modifiés, le code ne changera pas ; d’ailleurs, ça pourrait créer des ruptures dans la numérotation. Si le sujet vous tente, déposez un commentaire sur l’article, on en reparle… 🙂
Bonjour,
J’ai tout t’enter je ne trouve pas la solution à mon problème, j’ai écrit sur de nombreux forum mais sans réponse… alors svp aidez moi !
Je créer une BDD pour ma société et je voudrai créer des codes produits qui suivent la logique suivante :
Code famille + numérotation automatique
afin d’avoir pour résultat :
1001, 1002, 2001, 2002,….
Dans l’attente d’une réponse.
Merci d’avance.
Dans l’exemple 1001, la famille est 10, et la numérotation 01. Ou 1 et 001 ?
Bonjour,
Comment je pourrait avoir le système de numérotation comme ceci : « BRU / 002356 1116 » SVP ?
-Le BRU correspond au 3 premières lettre du champ « Nom » d’une autre table qui est en relation 1/1.
-Les 6 chiffres regroupé correspond au N° ID (NuméroAuto) de la table Principal.
-Les 4 chiffres suivant correspond au mois et année.
Merci d’avance
Dans cet exemple, il n’y a pas de numérotation réelle (au sens : « calcul d’un numéro »). Une concaténation d’informations devrait faire l’affaire. Du style, dans l’événement
BeforeUpdate
:Je suppose que la table liée (qui fournit
Me.Nom
) figure dans la requête sous-jacente.bonjour a tous,
Dans une table, je souhaite avoir une numérotation automatique de la forme [yy][mm][dd][ici 3 chiffre automatiquement commence par 1 chaque jour] 150617001, 150617002,150618001… Et surtout faire en sorte que cette numérotation reprenne à 1 chaque jour suivante : 150617001, 150618001, etc. Comment faire ?
Le premier article de la série est plus détaillé que celui-ci. Il donne notamment des exemples de formats pour la fonction
AutoNumber()
. Un format comme « [YY][MM][DD] » devrait convenir.Salut,
ce programme marche parfaitement, mais pour ce qui est de la partie numérique, comment faire pour que la numérotation avance par 1 après chaque enregistrement ?
pour ce prog: nom: pr1-> code: pr1001, et nom: pr2 -> code: pr2001
ce que je veux: nom: pr1 -> code: pr1001 et nom: pr2 -> code: pr2002
Normalement, la séquence devrait automatiquement augmenter de 1 à chaque fois.
Quel est le préfixe utilisé ?
C’est super ton blog sur la création de tel formule car je travaille présentement sur un projet de base de données.
Comment fait-on pour avoir les 3 derniers chiffres dans un préfixe?
strPrefixe = UCase(Left(Me.Nom, 3) & Left(Me.Prénom, 3) & Left(Me.NumAss, 3)) «— Exemple, j’ai ajouté, Left(me.NumAss,3) pour assurance social. Présentement, il utilise les 3 premiers chiffres mais je voudrai avoir les 3 derniers chiffre du numéro d’assurance social. Le numéro d’assurance social compose 9 caractères (en chiffre).
Si l’idée est d’extraire les 3 derniers chiffres à droite du numéro, quelque chose comme ça devrait convenir :
(à incorporer dans le reste de la formule, j’imagine).
Ouala !
T’es le meilleur!!!! C’est en plein cela!
Merci Beaucoup!
Une dernière chose 😀
strPrefixe = UCase(Left(Me.Nom, 3) & Left(Me.Prénom, 3) & right[me.NumAss, 3))
Si je dois inclure la date de naissance dans ma table. Comment on procède? Je peux pas mettre right ou left.. je voulais faire un:
(me.Date_naiss, [MM][DD])
Il me manque surement quelque chose avant le ( ou je m’y prend mal.
C’est correct, je viens de le trouver pour inclure une date (Mois, jour) dans la saisie automatique. Peut-être que tu pourrais faire une article sur cela.
Format(Me.Date_Naiss, « MMDD »)
Merci pour ton blog, une grande aide!
Content que ça puisse aider ! 🙂
Deux fois que je poste un commentaire pour demander de l’aide sur ce sujet, et deux fois mon commentaire a été viré, j’imagine qu’il déplait au modérateur. Je pourrais savoir ce que j’ai mal fait? Merci!
Ton message ne pose pas de problème, mais simplement :
J’ai plus de vie autour depuis qu’on m’a mis sur Access 😀
En fait, je commence à penser à un bug d’affichage: un message disait que c’était en modération, et 20 min plus tard, tout avait disparu, je me suis dit que j’avais du enfreindre une règle du forum.
Merci, en tout cas 🙂
Non, c’est normal : c’est le délai par défaut d’affichage du message.
Salut à tous!
Merci beaucoup pour ces codes! Étant débutant, j’en aurais été incapable, et c’est exactement ce que je cherchais!
Par contre, j’ai un léger souci. J’ai une liste déroulante sur deux colonnes, indiquant des marques d’Auto et un code en 3 lettres (Ex: Audi ! AUD; Renault | REN…) d’un champ nommé Car_Type.
Je bloque sur cette partie-là:
‘ Préfixe à utiliser pour la numérotation
strPrefixe =Me.Car_Type (?)
‘ Numérotation
If IsNull(Me.IDCar) Then
Me.Id = AutoNumber(« Tbl_Car », « IDCar », strPrefixe, 3)
End If
End Sub
Et ça ne marche pas :/. Dans mon formulaire, la selection dans la liste déroulante me donne bien le code en 3 lettres dans la case IDCar, mais Access ne m’ajoute pas de numero ensuite, et je ne peux pas sortir de l’enregistrement, il me dit qu’une clé primaire ne peut avoir de valeur Null.
Un avis d’expert sur la question? Merci! 🙂
Ton If porte sur IDCar qui est en principe renseigné, donc le code n’est pas exécuté. Il faudrait appliquer la condition sur la clef primaire (Id si j’ai suivi). Du coup, est-ce que ça ne serait pas plutôt quelque chose comme ceci :
Ah, ça marche déjà mieux :).
Mais un souci inexplicable persiste. Dans mon formulaire, je sélectionne ma marque. J’ai une boite IDCar dans le formulaire: quand je sélectionne par exemple l’Audi. ça n’apparait pas immédiatement dans la boite IDCar, je dois essayer de sauver l’enregistrement (Petit message d’erreur: » Un index ou une clé principale ne peut contenir une valeur Null ») maislà, AUD004 apparait. Donc disons que ce n’est pas mal du tout, on y est presque, IDCar est rempli.
Mais quand je veux enregistrer ou changer d’enregistrement, Access me met le même message d’erreur » Un index ou une clé principale ne peut contenir une valeur Null ». Sachant que ledit index est IDCar, Access ne semble pas voir que le champ a été automatiquement rempli. Une idée du souci?
Merci encore 🙂
J’ai l’impression qu’il y a confusion entre Id et
IdCar
. Dans le message d’Access, la clef principale est la clef primaire de ta table. Si j’ai suivi les messages précédents, ce seraitId
, parIdCar
. (?)Sinon, quelle est la structure exacte de ta table ?
Phil1262 > C’est sans doute parce que la relation entre les tables est correcte que le phénomène se produit (c’est plutôt une bonne nouvelle, en fait, concernant la structure des tables !).
La liste déroulante
DevCom
affiche peut-être le nom du commercial, mais ce n’est pas sa valeur réelle. Le champDevCom
est une clef étrangère faisant référence à la clef primaire de la table Commerciaux (qui est numérique, si j’ai suivi). Donc la valeur réelle deDevCom
est le numéro de commercial, pas son nom.A cet endroit du code, j’ai peur que la formule ne voie pas autre chose que la valeur de
DevCom
. Mais il y a peut-être moyen de faire autrement…Bonsoir M. Inisan
Je débute avec Accès 2010…
Sur le même sujet, j’ai créé une table contenant des devis et une autre contenant les noms des commerciaux. Dans la table devis figure un champ contenant le nom du commercial [DevCom] ayant rédigé le devis. Ce champ est une liste de choix reposant sur la table « Commerciaux ». Je voudrais remplir le champ RefDevis de la table devis avec un format du style: 2 premières lettres du nom du commercial puis l’année, le mois et enfin le N°auto du devis. J’ai tenté de faire cela avec un champ calculé et dans le paramètre « Expression » du champ, j’ai entré : Gauche$([DevCom];2) & Année([DevDate]) & « – » & Mois([DevDate]) & « – » & [NumDev]. C’est presque bon mais au lieu des deux premières lettres du nom du commercial, j’obtiens l’index du commercial dans la BD « commerciaux ». La liaison entre DB Devis et Commerciaux me semble correcte, je ne vois pas ce qui cloche mais pourtant …
Merci d’avance de toute l’aide que vous pourrez m’apporter.
mel > C’est sans doute faisable, avec plusieurs tests, vu l’irrégularité de la série. Par exemple :
Merci, donc mettre en place une telle numeration est dificile?
mel > La numérotation que tu mets en place est trop spécifique, vu les différentes règles à respecter. Tu ne pourras pas utiliser ma fonction de numérotation générique, il faut que tu en écrives une sur-mesure. 😉
Pourquoi une numérotation avec des exceptions de ce genre (ça me semble compliqué à suivre, donc à maintenir) ?
Slt Hervé, je voudrais une numerotation du type « 00001A; 00002B… » jusqu’à Z et revient en donnant « 00024A »sauf « I et O » ne faisant pas partie Comment faire ? Merci d’avance
Lbns > Dans ce cas, il faudrait modifier la fonction
AutoNumber()
. A vue de nez :"MM"
de la variablevarMarkers
pour que le mois ne soit pas injecté automatiquement.Each varMark
… un traitement spécifique pour remplacer le marqueur[MM]
manuellement, avec unIf
(ouSelect Case
) pour traiter les cas particuliers des mois 10, 11 et 12.Bonjour,
Merci Hervé Inisan,
C’est un numéro d’enregistrement journalier des Attachements factures, pour le besoin d’une autre application sous ORACLE
Pour le jour où il faudra traiter spécifiquement les 0, N, D , c’est le premier jour de chaque mois.
Lbns > Ce serait plus simple de formater le mois sur 2 chiffres (01, 02 puis 09, 10, 11, 12).
AutoNumber
. Il suffirait d’utiliser un format du type « LLMM ». Si on souhaite des mois de type O, N, D, il faut intervenir dansAutoNumber
pour ajouter des conditions spécifiques, et ça alourdit le système.je cherche un code de numérotation auto de type
LL1001 ; LL2050 ; LL3090 ; … LL9500 ;… LLN900
Deux première lettre (LL) fixe, Troisième positions représente le mois (Janvier ici);(Pour Octobre la Lettre O, Novembre la lettre N et Décembre la lettre D) et les dernières trois positions Représentes le Numéro Auto.
Merci
Nanille > Thumbs up!
Erreur trouvée, mes champs sont en [2_mots] et j’avais écris [2 mots]
Ca marche parfaitement !! Merci 🙂
Nanille > Ça voudrait dire que mon propre code est ok. 🙂 Dans ton cas, est-ce que le code ne « perturbe » pas les données ? Du genre : ajouter des espaces dans le champ ?
Il doit y avoir un problème avec le reste de mon code parce que je viens de reprendre une version où il n’y a que mes tables et j’ai recréé un formulaire pour tester ton code et il marche parfaitement.
Maintenant pour savoir d’où vient le problème exactement…
Oui elles l’étaient (enfin il mesemble) mais comme je les avais rentrées à la main, j’ai tout effacer pour réessayer, mais même en supprimant tout et en recommençant à entrer des données, il me fait parfaitement le 001 mais il ne veut pas passer à 002
Nanille > Est-ce que les données déjà existantes sont correctes (au niveau de la clef notamment) ?
Merci, merci,
Alors cela fonctionne presque pour moi, mais il ne me trouve pas la valeur max déjà présente dans ma table, du coup je ne peux pas enregistrer mon nouvel échantillon car il y a un doublon.
D’où peut venir le problème ?
Merci pour ton aide