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 ?

Numérotation personnalisée

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 🙂 :

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

  1. Reprenez la fonction AutoNumber() fournie dans le premier article de la série.
  2. Remplacez l’événement Avant MAJ du formulaire par celui-ci :

Adaptez bien sûr les noms de tables et de champs à votre base de données.

Attention

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… 🙂

Vous aimerez aussi...

39 réponses

  1. Lisa dit :

    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.

  2. Jerome dit :

    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

    • Hervé Inisan dit :

      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.

  3. maral dit :

    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 ?

    • Hervé Inisan dit :

      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.

  4. cmr dit :

    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

  5. Shpin dit :

    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).

    • Hervé Inisan dit :

      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 !

      • Shpin dit :

        T’es le meilleur!!!! C’est en plein cela!

        Merci Beaucoup!

      • Shpin dit :

        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.

    • Shpin dit :

      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!

  6. Julien dit :

    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!

    • Hervé Inisan dit :

      Ton message ne pose pas de problème, mais simplement :

      1. Les messages sont modérés avant publication pour éviter de laisser passer du spam sur le site.
      2. Je ne suis pas forcément derrière l’écran, à l’instant exact où les visiteurs postent, pour valider. Il y a ausi la vraie vie autour ! 🙂
      • Julien dit :

        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 🙂

  7. Trantsyx dit :

    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! 🙂

    • Hervé Inisan dit :

      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 :

      • Julien dit :

        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 🙂

        • Hervé Inisan dit :

          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 serait Id, par IdCar. (?)
          Sinon, quelle est la structure exacte de ta table ?

  8. Hervé Inisan dit :

    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 champ DevCom 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 de DevCom 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…

  9. Phil1262 dit :

    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.

  10. Hervé Inisan dit :

    mel > C’est sans doute faisable, avec plusieurs tests, vu l’irrégularité de la série. Par exemple :

    • Pourquoi pas de I ni de O ? A cause de la confusion visuelle sur 1 et 0 ?
    • Pourquoi une numérotation 1A, 2B (donc j’imagine 3C… et 26Z) ?
  11. mel dit :

    Merci, donc mettre en place une telle numeration est dificile?

  12. Hervé Inisan dit :

    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) ?

  13. mel dit :

    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

  14. Hervé Inisan dit :

    Lbns > Dans ce cas, il faudrait modifier la fonction AutoNumber(). A vue de nez :

    • Enlever "MM" de la variable varMarkers pour que le mois ne soit pas injecté automatiquement.
    • Ajouter après la boucle For Each varMark… un traitement spécifique pour remplacer le marqueur [MM] manuellement, avec un If (ou Select Case) pour traiter les cas particuliers des mois 10, 11 et 12.
  15. Lbns dit :

    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.

  16. Hervé Inisan dit :

    Lbns > Ce serait plus simple de formater le mois sur 2 chiffres (01, 02 puis 09, 10, 11, 12).

    • D’une part parce que ça ne nécessiterait aucune retouche particulière sur le code de la fonction AutoNumber. Il suffirait d’utiliser un format du type « LLMM ». Si on souhaite des mois de type O, N, D, il faut intervenir dans AutoNumber pour ajouter des conditions spécifiques, et ça alourdit le système.
    • D’autre part parce que ça serait plus cohérent à mon avis : si on part sur du numérique pour le début d’année (1, 2, 3…), ça va poser d’autres problèmes le jour où il faudra traiter spécifiquement les 0, N, D.
  17. Lbns dit :

    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

  18. Hervé Inisan dit :

    Nanille > Thumbs up!

  19. Nanille dit :

    Erreur trouvée, mes champs sont en [2_mots] et j’avais écris [2 mots]
    Ca marche parfaitement !! Merci 🙂

  20. Hervé Inisan dit :

    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 ?

  21. Nanille dit :

    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…

  22. Nanille dit :

    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

  23. Hervé Inisan dit :

    Nanille > Est-ce que les données déjà existantes sont correctes (au niveau de la clef notamment) ?

  24. Nanille dit :

    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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *