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éroAuto qui crée des doublons!


Sujet :

VBA Access

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut NuméroAuto qui crée des doublons!
    Tout d'abord salut à tous ceux qui passent beaucoup de temps à résoudre nos imperfections
    Voilà, j'ajoute des données en VBA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set rst = CurrentDb.OpenRecordset("T_PlanNPO", dbOpenDynaset, dbInconsistent)
    rst.AddNew
    For I = 0 To rst.Fields.Count - 1
    On Error Resume Next
    rst(I) = Me(rst(I).Name)
    Next I
    rst.Update
    rst.Close
    Jusqu'à maintenant, tout se passait bien! Puis, plus rien qui s'enregistre! En allant directement pour tester la table, je m'aperçois que le NuméroAuto crée des doublons, il repart par exemple depuis 7, alors qu'il devrait créer 92. Je ne sais pas si je me suis bien exprimé, mais j'avoue ne pas avoir le moindre soupçon de solution Si Maxence ne m'entend pas, un de ses disciples ...

    Merci de votre attention.

  2. #2
    Membre habitué Avatar de berti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 239
    Points : 175
    Points
    175
    Par défaut
    change ton numeroauto en numérique, puis implante ce petit bout de code dans ton code c'est beaucoup mieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim num
     
        If IsNull(DMax("NUMERO", "T_PlanNPO")) Then
                num= 1
        Else
                num= DMax("NUMERO", "T_PlanNPO") + 1
        End If

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut NuméroAuto qui crée des doublons! ...
    Salut, je te remercie de cette solution que j'ai déjà envisagée, mais qui ne résout en rien la gestion d'une base partagée en client-serveur de fichiers. Je vais certainement me diriger vers Access en frontal et SQL server. Le pb c'est la migration qui va me demander beaucoup de travail sur les différents programmes qui sont en activités chez plusieurs clients. Je vais réfléchir pour une "moulinette". Puisqu'il n'y a aucun de ces Grands pourfendeurs de la défense d' Access qui apportent une solution de protection du NuméroAuto. Je dois être le seul à avoir ce problème. Encore merci de ta réponse.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Si ton numéro Auto a des doublons, ce n'est pas un vrai numéro Auto gérer par Access, c'est toi qui doit le gérer.

    Pour cela quand tu ajoutes un enregistrement dans un table, il faut que tu incrémentes ton numéro en prenant la dernière valeur (avec la fonction de domaine DMax par exemple), comme te l'indiques Berti.

    Starec

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut
    Salut! Je te remercie de ta réponse mais qui par d'une affirmation ! je t'envoie une image qui saura mieux expliquer. Merci. Je suis développeur Access depuis 98.

  6. #6
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Salut,

    Je vais partir d'un autre principe, pourquoi cherché le dernier enregistrement en comptant, etc. tu peux utiliser du SQL qui te place directement en fin de table ou bien par DAO avec Move... de plus tu peux également tester si tu es en fin EOF.
    Pourtant la méthode AddNew insère et ne met pas à jour

    je ne comprends pas ton problème.


    Dolphy

  7. #7
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut NuméroAuto qui crée des doublons! ... ... ...
    Encore merci pour ta réponse immédiate. Je dois avoir à peu près 43 clients qui ont des programmes installés qui fonctionnaient très bien jusqu'à présent! Chaque programme a environ 50 tables liées par relation qui se font par la clé primaire, principalement représentées en clé unique, donnée par le principe de la numérotation automatique. Je crois que jusque là, je n'ai rien inventé dans l'utilisation rationnelle d'Access. Donc, et afin de ne pas avoir à prendre ma retraite trop tôt, il est pour moi, primordial de rétablir le fonctionnement du système prévu par Microsoft. Je n'ose imaginer le temps qu'il me faudra(it) pour effectuer ce changement.
    Et ma question est:
    Comment rétablir le fonctionnement naturel de la Numérotation Automatique, et comment sécuriser, afin que ça ne se reproduise plus?
    Merci de ton écoute.

  8. #8
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    Ce problème n'est constaté que dans une base ?

    Ou chez plusieurs clients ?

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  9. #9
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut NuméroAuto qui crée des doublons! ... ... ... ...
    Salut! J'ai pu le constater sur 3 clients que j'ai en VNC. Le programme continue, mais il y a des doublons relationnels: le même dossier attaché à 2 clients! (Je vais aller sur place en visiter quelques uns!) Heureusement, il recompte à partir des premiers chiffres alors qu'il y a plus de 4000 enregistrements. Après un rapprochement avec différentes sauvegardes j'arrive à reconstituer l'historique, mais le pb c'est que ça continue. Est-ce que le "suivi de lignes" y est pour quelque chose? Je ne sais pas à quoi ça sert!
    Merci de votre réponse.

  10. #10
    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 524
    Points
    14 524
    Par défaut
    Bonjour

    C'est normal, il ne faut pas mettre à jour le numéro automatique, il faut laisser access le générer tout seul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Set rst = CurrentDb.OpenRecordset("T_PlanNPO", dbOpenDynaset, dbInconsistent)
    rst.AddNew
    For I = 0 To rst.Fields.Count - 1
    On Error Resume Next
    If rst(I).Name <> "NNPO" then
        rst(I) = Me(rst(I).Name)
    End If
    Next I
    rst.Update
    rst.Close
    Pour empêcher la création de doublons, il faudrait indexer sans doublons le champ NNPO.
    A noter que le "on error resume next" ne facilite pas le débogage.

  11. #11
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut NuméroAuto qui crée des doublons! ... ... ... ...
    Salut! En réponse, voici l'image que j'aurai du aussi mettre la 1ère fois, ça aurait évité ce dernier post:

    Merci de vous occuper de mon problème, mais j'ose à peine vous répéter que je développe depuis déjà un certain temps, et que ce programme fonctionnait depuis déjà pas mal de temps. La 1ère image vous montre un ajout direct dans la table, donc sans programmation, et il génère un doublon! En ce qui concerne le "on error resume next", c'est une formule qui me permet d'utiliser un formulaire de saisie sans RecordSource, et donc , de n'enregistrer les modifs ou les ajouts qu'après confirmation.

  12. #12
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Bonjour à tous.

    Je remonte ce post car je viens de rencontrer le même problème sur une table de ma base, que j'utilise sans problème depuis plus d'un an et qui en est déjà à plus de 2000 enregistrements.
    Le champ "ID_truc", défini depuis la création de la base sur NuméroAuto indéxé sans doublon, s'est subitement mis à numéroter un nouvel enregistrement en revenant plus de 50 numéros en arrière, créant le message d'erreur "Risque de doublon, etc." Impossible, donc, de créer de nouveaux enregistrements.
    J'ai vu marot_r () dire que ce cas de bégaiement du NuméroAuto était très rare... super ! Il propose aussi un code à exécuter pour ramener le NuméroAuto à n+1, mais je ne sais pas comment le lancer. Quelqu'un pourrait-il m'aider ?

    Merci

  13. #13
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Re bonjour.

    J'ai fait une batterie de tests pour essayer de mieux cerner mon problème de doublons dans un champ NuméroAuto, et j'ai identifié un truc : il revient au numéro auto d'avant que je crée une série d'enregistrements grâce à une macro. Je m'explique.

    Structure de la base :
    - une table T_truc avec notamment le champ ID_truc (NuméroAuto, dernier numéro créé : 2046), un champ famille (Texte indexé avec doublons) et un champ numero (Entier indexé avec doublons). L'utilisateur utilise ces deux derniers champs pour se repérer.
    - une requête R_truc
    - un formulaire F_truc

    Via un bouton sur le formulaire, l'utilisateur peut créer autant d'enregistrements qu'il souhaite d'un coup. Une InputBox lui demande combien il veut en créer, puis deux autres lui permettent de préremplir les champs famille et numero pour tous les futurs enregistrements. Le coeur du code VBA de ce bouton est ceci :

    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
     
    Dim NombreTrucs As Variant
    Dim Famille As Variant
    Dim PremierNumero As Variant
    Dim Base As dao.Database : Set Base= CurrentDb
    Dim TrucACreer As dao.Recordset : Set TrucACreer= Base.OpenRecordset("T_truc")
     
    NombreTrucs = InputBox("Combien de nouveaux trucs voulez-vous créer ?")
    Famille = InputBox("À quelle famille appartiendront ces trucs ?")
    PremierNumero = InputBox("Quel sera le premier numéro de truc dans cette famille ?")
     
        For i = 1 To NombreTrucs   
            TrucACreer.AddNew
            TrucACreer!famille = Famille
            TrucACreer!numero = PremierNumero - 1 + i 'Chaque numéro est incrémenté de 1
            TrucACreer.Update
        Next i
    Le code fonctionne très bien.
    Par exemple, si je veux créer 53 enregistrements (de 1 à 53) dans la famille Machin, ça marche. À la fin de la procédure, j'ai bien 53 nouveaux enregistrements dans la table, avec le champ ID_truc rempli automatiquement de 2047 à 2099, le champ famille prérempli par "Machin" et le champ numero prérempli de 1 à 53.
    Nickel.
    Si ensuite je veux créer mécaniquement un nouvel enregistrement dans la table, le champ ID_truc passe bien à 2100.
    Si par contre je compacte la base, PATATRA : le champ ID_truc d'un nouvel enregistrement est à... 2047 ! Comme s'il n'avait pas pris en compte les 53 enregistrements que je viens de créer via le VBA.

    Est-ce mon code VBA qui a une faille ?

    Au secours

  14. #14
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut Une possible réponse
    Je ne me souviens plus de ce que j'avais fait, mais juste une question, est-ce que tu remplis un champs autre que celui généré dans le NuméroAuto?
    Si c'était le cas, "il" ( Billou?) effacerait les enregistrements superfétatoires (je me fais plaisir!). Tiens nous au courant.

    PS.: Je viens de lire la réponse de marot_r: il a la bonne solution, c'était celle que j'avais employée, ne créer que des index uniques composés.

  15. #15
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Bonjour tout le monde.

    Je précise que, comme le suggérait marot_r, j'ai depuis le début une clef index composée.

    Mais ce matin, inexplicablement, LE PROBLÈME A DISPARU. Je n'ai pourtant pas touché la base entre temps, mais en refaisant le test (créer des enregistrements via mon VBA, puis compacter la base et recréer de nouveaux enregistrements), les NuméroAuto sont bien à la suite !

    Access est certes plein de possibilités, mais ce genre d'incongruité est pesant, à la longue...

  16. #16
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Rebonjour

    Encore une fois, exactement le même problème.
    Le création d'un nouvel enregistrement dans la table T_truc met un NuméroAuto déjà existant dans le champ ID_truc, champ pourtant défini dès la conception de la base sur NuméroAuto indéxé sans doublon.
    Comme je l'ai signalé, j'ai remarqué que le NuméroAuto en doublon est le même que celui du premier enregistrement créé via le VBA cité trois posts plus haut, comme si Access n'avait pas remarqué qu'une série d'enregistrements avait créé par ce moyen.
    Ce que je comprends encore moins, c'est que ce problème réapparaît alors qu'il avait disparu de lui-même la dernière fois, sans que je n'y fasse rien.

    Est-ce que les grands maîtres qui peuplent ce forum ont une explication ?

    AU SECOURS !

  17. #17
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 257
    Points : 19 409
    Points
    19 409
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    C'est un problème qui peut survenir avec les numéro-auto.

    Une solution serait de compacter la base et si ce n'est pas suffisant, utiliser une requête pour mettre à jour le champ numéro-auto avec le dernier numéro :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE T_Truc ALTER COLUMN ID_Truc COUNTER(1000,1)

    1000 indique le dernier numéro-auto et 1 l'incrément.

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  18. #18
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut Réouverture du dossier.
    Est-ce que tu as fermé le recordset par TrucACreer.Close après la création des enregistrements par vba? Je viens de replonger (8 ans) dans la BDD qui faisait problème - elle fonctionne toujours chez mes clients -, et je ne vois pas ce que j'ai fait à l'époque pour la stabiliser. En quelle version de MSAccess tu es? As-tu créé la table dans cette version? Bref, je ne suis pas et de loin un Grand-Chef, mais je veux bien continuer à t'aider.

  19. #19
    Membre régulier
    Homme Profil pro
    Administrateur (improvisé) de base de données
    Inscrit en
    Décembre 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Administrateur (improvisé) de base de données
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2014
    Messages : 102
    Points : 72
    Points
    72
    Par défaut
    Ah aaaah !

    Effectivement, Chrysostome, je n'ai à aucun moment fermé mon recordset après l'avoir ouvert. Tu viens de lancer là une piste intéressante qui pourrait être la cause de ce problème récurent. Je teste ça.
    Sinon, dans l'immédiat, il faut que je force quand même une fois le bon NuméroAuto. J'ai lu qu'il fallait utiliser une requête pour mettre à jour le champ NuméroAuto :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE T_truc ALTER COLUMN ID_truc COUNTER(DernierNumAuto,1)
    avec un Docmd.RunSQL pour l'exécuter.
    Mais je ne sais pas comment mettre ça en œuvre. Faut-il créer une "requête mise à jour" et mettre cette ligne dedans ? Et si oui, comment utiliser le Docmd.RunSQL pour l'exécuter ? Je suis autodidacte complet et dès que je dois sortir des clous je galère...

    Merci de votre aide.

  20. #20
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut Suite
    Bonjour, je ne vois pas comment on peut mettre à jour un NuméroAuto! Autrement, il ne serait plus "auto". Après sauvegarde de la table, tu peux afin de mettre à jour, créer un champs provisoire d'ordre choisi, "temp_NumAuto", le mettre à jour par requête, une fois fait, supprimer le champs NuméroAuto, enregistrer la table, puis remettre le champs NuméroAuto, à ce moment là la numérotation sera bonne (j'espère, non je suis sûr!). Si tu n'y arrive pas, envoie ta table en privé, s'il n'y a pas de "secrets". Il y a d'autres façons de faire. Courage tu y es presque. Tu vas voir qu'Access est plein de ressources afin de corriger ses manques, et heureusement qu'il y a nos chers Grands-Maîtres, dont je ne suis pas, et de loin.

Discussions similaires

  1. saveOrUpdate() qui crée des doublons lors de l'update
    Par tamiii dans le forum Hibernate
    Réponses: 1
    Dernier message: 21/04/2009, 15h44
  2. Un EDIT/UPDATE me crée des doublons
    Par apprenti46 dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/09/2008, 13h58
  3. Logiciel qui crée des PDF "propres"
    Par al85 dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 23/02/2008, 16h35
  4. script qui crée des fichiers
    Par Emcy dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 09h28
  5. Réponses: 5
    Dernier message: 07/05/2007, 08h16

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