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 :

Mauvaise valeur sur insert pour une colonne numéroAuto


Sujet :

Access

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut Mauvaise valeur sur insert pour une colonne numéroAuto
    Bonjour,

    Je suis confronté à un problème assez surprenant.

    Développement en VBA dans une application frontale utilisant les données d'une base "dorsale" dont les tables sont attachées.
    Dans le cas présent j'exécute une suite d'instructions SQL à partir des commandes VBA "DataBase.execute()". L'ensemble des commandes est encadré par une transaction déclarée au niveau du WorkSpace.

    Pour résumer (je vous fournirai ultérieurement un code plus précis si nécessaire) voici le schéma d'exécution des actions sous forme d'un exemple.

    Soit ma table Lignes(IdLigne numéroAuto, Intitulé string(50), Valeur long)
    Cette table comporte des lignes dont la dernière à la valeur IdLigne = 50.

    -1-
    Je copie dans une table temporaire (TMP) les lignes IdLigne = 10,11 et 12 .
    -2-
    j'ouvre la transaction
    -3-
    Je supprime les lignes que j'ai copiées dans ma table temporaire
    -4-
    J'insère les lignes de la table temporaire qui ont conservé leur identifiant IdLigne initial avec une instruction de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into Lignes(IdLigne, Intitulé , valeur) select IdLigne, Intitulé, valeur from TMP where IdLigne is not null;
    -5-
    J'insère de nouvelles lignes qui ont été saisie sur la table temporaire et dont la colonne IdLigne n'est pas définie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into Lignes(Intitulé , valeur) select Intitulé, valeur from TMP where IdLigne is null;
    Cette instruction Insert provoque une erreur de doublons.

    Plus étonnant, je constate que si j'essaie de saisir directement dans la table Lignes une nouvelle ligne, le numéro Idligne prend la valeur 13, soit la prochaine valeur suivant l'insertion -4- des lignes qui avaient un numéro forcé!

    Bon, bien sûr, je n'ai qu'à faire un update pour - à priori - résoudre le problème; mais quand-même il ne me semble pas normal que le numéro auto de la table soit déterminé par la valeur de la dernière ligne introduite comportant une valeur pour cette colonne…

    Je précise que j'ai compacté plusieurs fois ma base avant de tirer mes conclusions.

    Si vous avez une explication sur ce problème, voir mieux une solution, je suis preneur car il n'est pas impossible que j'ai utilisé une méthode similaire dans plusieurs de mes applications.

    Merci.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Les numéros automatiques sont là pour fournir un identifiant unique À CHAQUE ajout donc la valeur que tu essayes de forcer est simplement ignorée par le système et remplacée par celle que lui calcule.
    Note aussi qu'ils ne sont pas là pour te garantir une numérotation séquentielle sans trou, juste te fournir un numéro unique dans la table.

    Pour ton problème, il faut que tu remplaces le champ numéro automatique par un champ entier long et que tu gères toi-même la séquence de numéro.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut
    Bonjour Marot_r,

    Je ne me suis peut-être pas bien exprimé car ce n'est pas l'insertion des lignes comportant une valeur pour les numéros automatiques qui pose problème, les numéros sont correctement réinsérés et c'est un des avantages de la numérotation automatique d'Access qui, contrairement à SQL, permet l'insertion de valeurs dans une colonne AutoNumber sans activation d'option particulière du moment que les valeurs introduites ne figurent pas déjà dans la table.
    Ce qui pose vraiment problème c'est que le prochain numéro automatique soit calculé à partir de la dernière instruction INSERT et non pas sur l'ensemble des valeurs de la table ou à partir d'un indicateur indépendant.
    D'après la documentation de Microsoft, le compteur autonumber ne devrait se redéfinir que lorsqu'on effectue un compactage de la base de données. En réalité force est de constater qu'il est aussi redéfini lors d'une insertion de ligne mais en considérant que le dernier numéro inséré (qu'il soit calculé automatiquement ou imposé) sera augmenté de 1 pour constituer le prochain.

    Ceci dit, il s'agit essentiellement de prose de ma part qui éclairera peut-être un autre membre confronté à la surprise de voir un risque de doublons dans le champ d'une table autonumber.

    La meilleure parade - si on a une bonne raison de réintroduire des valeurs qui ont été précédemment supprimées - consiste sans doute à insérer une ligne fictive dans la table en lui attribuant la valeur maximum actuelle de la colonne +1 puis de la supprimer avant de reprendre des insertions avec calcul automatique de la valeur; cette méthode présente toutefois l'inconvénient de constituer autant de "trous" dans la numérotation.

    Attention aussi à l'usage multi-utilisateurs, la valeur du dernier numéro automatique doit impérativement être acquise dans une transaction incluant l'insertion de la ligne fictive.

    Bonne journée.

  4. #4
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    bonsoir Depite,
    Ce qui pose vraiment problème c'est que le prochain numéro automatique soit calculé à partir de la dernière instruction INSERT et non pas sur l'ensemble des valeurs de la table ou à partir d'un indicateur indépendant.
    ce "bug" est connu depuis la nuit des temps du moins le temps d'existence d'Access.
    Mais peut-on vraiment parler de bug quand cette "anomalie" n'a toujours pas été corrigée par Microsoft ?
    L'avantage est que cela permet de combler un "trou" dans une numérotation, même si cela n'a pas forcément un sens de vouloir récupérer un numéro auto perdu ...

    Oui, il est effectivement possible lors d'une requête INSERT de forcer le numéro auto pour autant qu'il n'existe pas déjà.
    MAIS, comme tu l'as constaté, cela aura pour conséquence de faire redémarrer le numéro auto à cette dernière valeur, d'où le problème de doublon dans l'index lors de l'insertion suivante.
    Pour revenir à une situation "normale" il suffit de faire un insert avec la plus grande valeur du numéro auto +1, puis de supprimer cet enregistrement et de compacter la base. J'ai souvent utilisé cette manipulation dans le passé pour des situations bien précises.

    Cependant, il est plus que recommandé de ne JAMAIS attribuer de valeur à un numéro auto lors de la création d'une requête INSERT.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci tee_grandbois de cette très claire explication.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-MAC 2011] Valeur clignote pour une colonne
    Par Gogia dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 08/09/2011, 09h14
  2. Réponses: 1
    Dernier message: 07/12/2010, 10h57
  3. Insertion d'une valeur null pour une colonne
    Par bigggalll dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 24/03/2010, 15h01
  4. [XL-2007] Probléme pour séléctionner une ligne sur trois dans une colonne
    Par ro31hg dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2010, 20h48
  5. [EJB3 Entity] Valeur par défaut pour une colonne
    Par moha1984 dans le forum Java EE
    Réponses: 1
    Dernier message: 18/05/2009, 18h42

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