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

Access Discussion :

Pb avec NumAuto


Sujet :

Access

  1. #1
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut Pb avec NumAuto
    Bonjour,
    je tente d'adapter cette fonction à mon projet existant (sous access 2003 + xp)
    Cette fonction (trouvé sur le forum) permet de reaffecter les "trous" de la numerotation auto de access, aux nouveaux enregistrements.

    Ma table se nomme "Factures" et mon champs numauto "No"

    Mais je ne vois vraiment pas comment faire pour que ma numauto fonctionne avec cette fonction ? (je suis loin d'etre un pro de vb ! Ca n'aide pas...)

    Pourriez vous m'aider svp ? Quelle syntaxe pour utiliser cette fonction svp ?
    Merci bcp !

    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
    29
    30
    31
    Function NextID(LeChamp As String, LaTable As String) As Long 
     '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
     'Fonction renvoyant le prochain Identifiant, en fonction des valeurs existantes dans une table. 
     'Arguments : 
     '    LeChamp => Nom du champ Identifiant numérique Long concerné 
     '    LaTable => Nom de la table contenant cet identifiant 
     'Retour    : 
     '    1 s'il n'y a rien dans la table 
     '    Le Nombre maximum +1 s'il y a une suite ininterrompue de nombres 
     '    La valeur du nombre manquant en cas de trou. 
     '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        Dim sSQL    As String 
        Dim rs      As DAO.Recordset 
        Dim n       As Long 
     
        'Chaîne SQL en fonction de LeChamp et de LaTable, retournant NULL ou le numéro du trou 
        sSQL = "Select Min([" & LECHAMP & "]-1) As NextID From " & LATABLE & " As T1 "
        sSQL = sSQL & "Where ((([" & LECHAMP & "]-1)>0) And (((Select [" & LECHAMP & "] "
        sSQL = sSQL & "From " & LATABLE & " T2 "
        sSQL = sSQL & "Where T2.[" & LECHAMP & "]=T1.[" & LECHAMP & "]-1)) Is Null));" 
        Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenSnapshot) 
        'Nbre d'enregistrements dans laTable 
        n = DCount("[" & LeChamp & "]", "[" & LaTable & "]") 
        If n = 0 Then               'S'il n'y a pas d'enregistrements, mettre 1 
            NextID = 1 
        ElseIf IsNull(rs(0)) Then   'Si la requête ne renvoie rien, incrémenter de 1 le maximum 
            NextID = DMax("[" & LeChamp & "]", "[" & LaTable & "]") + 1 
        Else 
            NextID = rs(0)          'Sinon, il y a un trou. Renvoyer la valeur du trou 
        End If 
    End Function

  2. #2
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    Mais je ne vois vraiment pas comment faire pour que ma numauto fonctionne avec cette fonction ?
    Pour utiliser cette fonction :
    le champs doit être numérique non auto.
    chaque formulaire succeptible d'ajouter un nouvel enregistrement à cette table doi faire appel à cette fonction pour déterminer l'id de l'enregistrement en question. (vba donc)

  3. #3
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par Demco
    Pour utiliser cette fonction :
    le champs doit être numérique non auto.
    chaque formulaire succeptible d'ajouter un nouvel enregistrement à cette table doi faire appel à cette fonction pour déterminer l'id de l'enregistrement en question. (vba donc)
    POur le point 1 : ok
    Pour le point 2 : c'est là que j'ai du mal, quelle syntaxe dois je utiliser stp ? Sachant que je vais placer ca a l'activation de mon forumlaire...

    Merci en tout cas !

  4. #4
    Membre du Club Avatar de PhRey
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 197
    Points : 67
    Points
    67
    Par défaut
    J'en rajoute une pêtite couche, je suis vraiment coincé avec ca...
    En plus j'ai beau tester les requetes de cette fonction, je trouve une erreur sur la clause "from" a un moment... impossible d'en sortir...

    A vot' bon coeur.

  5. #5
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    Citation Envoyé par PhRey
    En plus j'ai beau tester les requetes de cette fonction, je trouve une erreur sur la clause "from" a un moment... impossible d'en sortir...
    Regarde le tutoriel de débugage des requêtes écrites en VBA, il t'aidera à comprendre l'erreur.

  6. #6
    seb92400
    Invité(e)
    Par défaut
    Hi,

    Juste une petite remarque (rien à voir avec le code)... pour des factures ou des commandes, effectivement, le numéro auto n'est pas ce qu'il y a de mieux... Mais... vouloir boucher des trous dans une liste de facture, est-ce une bonne idée ??

    Si une facture a été effacée, ce qui est déjà assez "bizarre", il ne faut normalement pas mettre une autre facture avec le même numéro à la place... Normalement les numéros de facture se suivent.

    Avec un numéro de facture, j'utilise un DMax. Si tu as un formulaire avec des champs à remplir pour ta facture ça donne :

    1. Ouverture du formulaire
    2. Remplissage des champs concernés
    3. Validation
    4. Numéro Facture = DMax + 1
    5. Enregistrement

    Le DMax après la validation, car si deux personnes en réseau (ce qui est quand même rare normalement) créent deux factures à la fois, si le DMax est au début, elles vont se retrouver avec le même numéro de facture, et pour peu qu'il y ait un index unique, avec en prime une erreur d'écriture dans la table... Alors qu'à la fin, il y a beaucoup moins de chances que deux personnes cliquent au même moment sur le même bouton...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par noawsen
    Hi,

    Juste une petite remarque (rien à voir avec le code)... pour des factures ou des commandes, effectivement, le numéro auto n'est pas ce qu'il y a de mieux... Mais... vouloir boucher des trous dans une liste de facture, est-ce une bonne idée ??

    Si une facture a été effacée, ce qui est déjà assez "bizarre", il ne faut normalement pas mettre une autre facture avec le même numéro à la place... Normalement les numéros de facture se suivent.

    Avec un numéro de facture, j'utilise un DMax. Si tu as un formulaire avec des champs à remplir pour ta facture ça donne :

    1. Ouverture du formulaire
    2. Remplissage des champs concernés
    3. Validation
    4. Numéro Facture = DMax + 1
    5. Enregistrement

    Le DMax après la validation, car si deux personnes en réseau (ce qui est quand même rare normalement) créent deux factures à la fois, si le DMax est au début, elles vont se retrouver avec le même numéro de facture, et pour peu qu'il y ait un index unique, avec en prime une erreur d'écriture dans la table... Alors qu'à la fin, il y a beaucoup moins de chances que deux personnes cliquent au même moment sur le même bouton...

    Tout à fait d'accord, pour les factures et le Dmax.
    On ne peut reprendre un numéro de facture, et le DMax est l'idéal, je l'utilise tous les jours, dans mes recordset qui alimentent les tables, juste aprés le AddNew. Ainsi aucun soucis.

    Starec

  8. #8
    seb92400
    Invité(e)
    Par défaut
    On ne peut reprendre un numéro de facture, et le DMax est l'idéal, je l'utilise tous les jours, dans mes recordset qui alimentent les tables, juste aprés le AddNew. Ainsi aucun soucis.
    Je ne connait pas trop cette méthode... En fait, pour ma part, dès que je clique sur le bouton 'enregistrer' ou 'créer', j'utilise un DMax +1 afin de créer le numéro et ensuite un DoCmd........acCmdSaveRecord

    Question de débutant : Quel est l'avantage de créer des recordset, d'ajouter et ensuite de créer le numéro ?

    Merci à Toi !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Re

    En fait je travail uniquement avec des recordset, tous mes formulaires sont indépendants, ils ne sont liés à aucune table.

    Car je travaille aussi en VB6, et cela me permet de transposer plus facilement du code de VB6 à Access et inversement.

    Donc comme j'ajoute des données par recordset (couple AddNew - Update), je crée ma nouvelle clé dans le AddNew en prenant avec Dmax la dernière valeur +1).

    Starec

  10. #10
    seb92400
    Invité(e)
    Par défaut
    Ahhh !!!! Merci beaucoup m'sieur !

    Je comprends vite quand on m'explique longtemps !!!

Discussions similaires

  1. [AC-2007] Problème avec champ numauto
    Par brutus437 dans le forum IHM
    Réponses: 7
    Dernier message: 27/02/2010, 19h17
  2. Problème avec requete SQL/type NumAuto
    Par Mimisio dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/07/2007, 11h56
  3. probleme avec NumAuto
    Par phileas1789 dans le forum Access
    Réponses: 1
    Dernier message: 29/03/2006, 18h12
  4. Réponses: 2
    Dernier message: 27/10/2005, 19h26
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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