IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Numéro personnel automatique


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut Numéro personnel automatique
    Bonjour,
    Sous Access 2003, dans un formulaire,je possède un champ "date survenance" (pour la date de réalisation d'un fait).

    Je possède aussi un champ "numéro de dossier".

    Je souhaiterais que le champ "numéro de dossier" soit complété automatiquement au format AAAAxxxxx (où AAAA doit correspondre à l'année de survenance et xxxxx est un nombre incrémenté de 1 à chaque ajout de dossier de la même année).

    Ex : 1er dossier avec survenance le 03/01/2007 donne un numéro de dossier 200700001.

    Si après cela je rentre un nouveau dossier survenu le 16/12/2006, le champ "numéro de dossier" doit chercher le plus grand numéro
    affecté à 2006 et ajouter 1.

    J'ai fait de nombreuses tentatives avec la doc du site mais je n'y arrive pas. Merci pour votre aide.

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Bonjour

    J'ai un truc tout fait dans une appli. Le voici, à adapter à ton cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Function getNouveauNumero(DateNcs As Date, Optional Longueur As Integer = 4) As String
        Dim Chaine As Variant
        Dim Annee As String
        Dim Retour As String
        Dim Valeur As Integer
     
     
        Annee = Format(Year(DateNcs), "0000")
        Chaine = CurrentDb.OpenRecordset("select max(ncside) as Numero from tncs where left(ncside,4) = '" & Annee & "'")!Numero
        If IsNull(Chaine) Then
            Retour = Annee & "/" & Format(1, String(Longueur, "0"))
            Else
            Valeur = Right(Chaine, Longueur) + 1
            Retour = Annee & "/" & Format(Valeur, String(Longueur, "0"))
        End If
        getNouveauNumero = Retour
    End Function
    C'est une fonction qui renvoie un identifiant sur base d'un format YYYYXXXX. Le nombre de X est déterminé par la valeur optionnelle. Dans le cas présent, la longueur par défaut est 4, mais tu peux adapter. Tu dois aussi adapter les noms de champ et de table de la base de données.

    Tu dois passer comme argument la date de survenance du fait, optionnellement une longueur si différente de celle par défaut

    Ok?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Bonjour Pierre,

    Merci pour ta réponse.

    J'ai examiné ta fonction, mais je ne suis pas un spécialiste de VBA. Soit, peux-tu m'en dire un peu plus?

    - "DateNcs" représente t il bien le champ de ta table reprenant la date que tu introduis?
    - A quoi correspond "ncside"

    De plus, j'ai un problème avec les apostrophes dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chaine = CurrentDb.OpenRecordset("select max(ncside) as Numero from tncs where left(ncside,4) = '" & Annee & "'")!Numero
    Ensuite, en supposant que je parvienne à rédiger correctement le code, j'imagine que je dois lancer cette fonction à partir d'une procédure.

    Comment puis-je appeler cette fonction? En indiquant "Numéro de dossier=getNouveauNumero()" entre Sub et End Sub?

    Bien merci.

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Pierre,
    Je préfère déclarer lorsque c'est possible les objet dans leur propre type

    Ainsi, pour chaîne, je ferais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim chaîne as DAO.Recordset
    , c'est plus joli.

    Une autre piste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub testNumMax()
     
    Dim Nmax As Integer
    Dim Ann As String
     
     
    Ann = InputBox("Année")
    Nmax = DMax("num", "table1", "[Annee] = '" & Ann & "'")
    Debug.Print Nmax
    Nmax = Nmax +1
     
     
    End Sub
    Ann j'ai mis un imput box pour entrer la valeur, mais elle peut venir de n'importe où.
    num : c'est le nom de mon champ qui contient ma valeur à incrémenter.
    table1 : c'est ma table
    Annee : c'est le champ qui contient l'année et pour lequel j'ai un critère.
    Nmax : c'est ma valeur Maximum à laquelle j'ajoute 1

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Bonsoir Heureux-oli,

    Merci de ta réponse.
    Je me suis basé sur ta proposition et j'ai écri:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Command9_Click()
     
    Sub testNumMax()
     
    Dim Nmax As Integer
    Dim Ann As String
     
    Ann = CLng(Year(DateSurv))
    Nmax = DMax("NumDossier","TblDossier","Clng(Year(DateSurv))" = '" &Ann "'")
     
    Debug.Print Nmax
    Nmax = Nmax + 1
     
    End Sub
    Je rencontre un problème avec les quotes... dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nmax = DMax("NumDossier","TblDossier","Clng(Year(DateSurv))" = '" &Ann "'")
    Qu'en penses-tu?

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nmax = DMax("NumDossier","TblDossier","CInt(Year([DateSurv])) =" & Ann )
    Essaie comme ça.

  7. #7
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Désolé,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ann = CInt(Year(DateSurv))
    Pour la seconde, pas besoin d'un Long, un integer suffit, je pense !

  8. #8
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Bjr,

    Pour le numéro maxi je préfère un Variant.
    Pourquoi? Ben pour gérer le premier numéro : vu que DMax renvoit Null s'il ne trouve rien, ça ne rentrera pas dans un Integer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim Nmax as Variant
    Nmax = DMax("NumDossier","TblDossier","CInt(Year([DateSurv])) =" & Ann )
    If IsNull(Nmax) then 
      NMax = 1
    Else
      NMax = NMax +1
    End If
    Ou alors on utilise Nz si on peut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim Nmax as Integer
    Nmax = Nz(DMax("NumDossier","TblDossier","CInt(Year([DateSurv])) =" & Ann ),0)
    NMax = NMax +1
    Bien penser à tester le code avec une année sans dossier pour vérifier que le premier numéro est bien gérer.

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Heureux-oli Voir le message
    Pierre,
    Je préfère déclarer lorsque c'est possible les objet dans leur propre type

    Ainsi, pour chaîne, je ferais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim chaîne as DAO.Recordset
    , c'est plus joli.

    Bonjour

    Je serais d'accord avec toi, si Chaine renvoyait effectivement un Recordset, mais regarde mon code et tu verras que ce n'est pas le cas... Chaine renvoie l'identifiant ou NULL si aucun identifiant n'est trouvé,c'est-à-dire une chaine de caractères ou la valeur NULL. Comme je ne peux pas affecter la valeur NULL à un variable typée string, je suis obligé de la typer en Variant.


    Cela étant, je n'utilise pas souvent les fonctions intrinsèques d'Access, et je devrais peut-être. En cela, ton exemple est profitable pour moi.

    Bonne journée

  10. #10
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Bonjour

    Je serais d'accord avec toi, si Chaine renvoyait effectivement un Recordset, mais regarde mon code et tu verras que ce n'est pas le cas... Chaine renvoie l'identifiant ou NULL si aucun identifiant n'est trouvé,c'est-à-dire une chaine de caractères ou la valeur NULL. Comme je ne peux pas affecter la valeur NULL à un variable typée string, je suis obligé de la typer en Variant.


    Cela étant, je n'utilise pas souvent les fonctions intrinsèques d'Access, et je devrais peut-être. En cela, ton exemple est profitable pour moi.

    Bonne journée
    Toute mes excuses, j'ai pas scrollé vers la droite.

    Pour les fonction d'Access, j'ai le même problème, mais Arkham et Random veillent.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Bien, J'ai modifié le code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Command9_Click()
     
    Dim Nmax As Integer
    Dim Ann As Integer
     
    Ann = CInt(Year(DateSurv))
    Nmax = DMax("NumDossier", "TblDossier", "CInt(Year([DateSurv])) =" & Ann)
    If IsNull(Nmax) Then
        Nmax = 1
    Else
        Nmax = Nmax + 1
    End If
     
    End Sub
    Mais ça coince tjs au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nmax = DMax("NumDossier", "TblDossier", "CInt(Year([DateSurv])) =" & Ann)
    Problème identique si j'utilise Nz.

    Bonne journée.

  12. #12
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Voilà aux grands maux les grands remèdes.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Merci Heureux-oli. Ca marche.
    C'est en ces moments que je me dois d'être humble...

    Pour finaliser ce procédé, j'aimerais aussi que ma référence de dossier s'affiche sous le format AAAA00000 (ex: 200700024). Me conseilles-tu d'ajouter un champs "NumDos" dans la table et d'ajouter une ligne de code telle "Me.NumDos = An & Num"? Ou vois-tu une meilleure solution?

    Quant au format AAAA00000, je pense qu'il ne sera pas respecté.

    D'autre part, n'existera-t-il pas un conflit si 2 utilisateurs rentrent un nouveau dossier au même moment?

  14. #14
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Non tu peux le garder comme simple affichage et comme tu le souligne, la concaténation fonctionnera.

    Pour respecter le format, dans l'exemple que j'ai mis sur le forum, les numéro sont 000001

    Le tout est de définir un format comprenant au moins 6 (0)
    Pour les deux dossier au même moment, c'est un souci que tu peux régler en faisant une sauvegarde de l'enregistrement en cours dès que le numéro est obtenu.
    Une fois dans la table, il est pris en compte lors du DMax suivant.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Bon, j'ai ajouté un champs NumDos dans la table et j'ai repris 0000000000 comme format. J'ai ajouté la ligne et le résultat n'est pas celui attendu car au lieu d'afficher 2007000024, il m'affiche 0000200724...

  16. #16
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Dans ce cas, il faut faire un select case et compléter avec les 0 qui manquent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Selct Case NMax
    Case < 10
      An & "00000" & Num
    Case < 100
      An & "0000" & Num
    End select

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Un Tout Grand Merci. Ca fonctionne!
    Bonne soirée.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    C'était trop beau. J'ai été trop vite. Ca fonctionne jusqu'à 99 et puis ça coince.
    Voici le code que j'ai ajouté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Select Case NMax
     
    Case Is < 10
      Me.NumDos = An & "00000" & Num
    Case Is < 100
      Me.NumDos = An & "0000" & Num
    Case Is < 1000
      Me.NumDos = An & "000" & Num
    Case Is < 10000
      Me.NumDos = An & "00" & Num
     
    End Select
    Je comprends pas.

  19. #19
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Citation Envoyé par ToFind Voir le message
    C'était trop beau. J'ai été trop vite.
    Pour un Namurois

    Je ne sais pas pourquoi au delà de 99 ça ne fonctionne plus ??

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    Comme quoi tout arrive Les escargots vont trop vite!

    Voici le code complet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Option Compare Database
    Option Explicit
     
    Private Sub DteStart_AfterUpdate()
    Dim intAn As Integer
    Dim NMax As Integer
     
    intAn = CInt(Year(Me.DteStart))
    NMax = Nz(DMax("num", "tbl1", "CInt(Year([DteStart])) =" & intAn), 0)
    Debug.Print NMax + 1
    Me.Num = NMax + 1
     
    Me.An = CInt(Year(Me.DteStart))
     
    Select Case NMax
     
    Case Is < 10
      Me.NumDos = An & "00000" & Num
    Case Is < 100
      Me.NumDos = An & "0000" & Num
    Case Is < 1000
      Me.NumDos = An & "000" & Num
    Case Is < 10000
      Me.NumDos = An & "00" & Num
     
    End Select
     
    End Sub
    J'ai tout de même pas fait le ... ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2003] utilisation du numéro personnel d'un utilisateur ?
    Par fonfek24 dans le forum Modélisation
    Réponses: 2
    Dernier message: 09/06/2011, 11h09
  2. Réponses: 6
    Dernier message: 19/01/2010, 16h30
  3. Composition numéro téléphone automatique
    Par dubitoph dans le forum Applets
    Réponses: 0
    Dernier message: 04/11/2009, 15h06
  4. Débutant - Création d'un numéro chrono automatique
    Par Bersek67 dans le forum VBA Access
    Réponses: 11
    Dernier message: 07/01/2009, 21h39
  5. pb de numéro automatique
    Par Little-Freud dans le forum Access
    Réponses: 1
    Dernier message: 26/10/2004, 22h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo