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 :

[VBA]INSERT INTO et récupération d'id auto


Sujet :

Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut [VBA]INSERT INTO et récupération d'id auto
    Bonjour,

    Voilà j'effectue une requête d'insertion dans une table avec une clé primaire id qui est un numéroAuto. J'ai ensuite besoin de récupérer l'id qui vient d'être crée par Access pour une autre requête.
    Jusqu'a maintenant je crée un recordset juste derrière ma requête INSERT INTO qui contient l'ensemble des id de la table (Select id from table) et je fais un recorset.moveLast pour récupérer le dernier id
    Seulement je trouve que cette solution est très "sale". Par exemple il suffit que ma table contienne des trous dans les id et mon algo ne fonctionnerai plus...

    Je pense qu'il doit exister une façon de faire plus propre pour récupérer l'id que Access vient de créer... Comment faites vous ou feriez vous?

    Merci!!

  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
    Seulement je trouve que cette solution est très "sale". Par exemple il suffit que ma table contienne des trous dans les id et mon algo ne fonctionnerai plus...
    Peu importe les trous, le dernier numero auto insere sera toujours le plus grand.

    Je pense qu'il doit exister une façon de faire plus propre pour récupérer l'id que Access vient de créer... Comment faites vous ou feriez vous?
    En effet.

    En espérant t'aider.
    J'aime les gâteaux.

  3. #3
    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 522
    Points
    14 522
    Par défaut
    slt,

    Par exemple il suffit que ma table contienne des trous dans les id et mon algo ne fonctionnerai plus...
    les trous de numéro auto ne sont pas bouchés

    la FAQ donne d'autres méthodes

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    J'ai fait un tour dans la FAQ avant de poster j'ai du louper le paragraphe qui donne d'autres méthodes... J'y retourne alors

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Ok d'après ce que je comprends il faut que j'utilise directement un recordset pour faire mon insertion et non l'execution d'une requête SQL sur ma database.

    J'essaie donc ça...
    Merci et désolé d'avoir posté alors que la solution est dans la FAQ

  6. #6
    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 Demco
    Peu importe les trous, le dernier numero auto insere sera toujours le plus grand.

    En effet.

    En espérant t'aider.
    Il fallait cliquer sur le petit bonhomme FAQ, je mettrais des liens plus explicites a l'avenir c'est vrai qu'il est un peu caché ...
    http://access.developpez.com/faq/?re...er+numero+auto

    En esperant t'aider.
    J'aime les gâteaux.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Solution propre
    Bonjour à tous !
    Après avoir galéré avec cette bêtise.
    Voici une solution simple pour régler le problème.
    Utiliser ("SELECT @@Identity").Collect(0).
    Ceci permet de récupérer le dernier enregistrement effectué.

    Voici comment je l'utilise dans un commitTrans :
    ------------------
    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
    Dim id as Integer
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    With cn
            .connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                                       "Data Source=C:\db.accdb "<-Path de la connection,ici db access
            .CursorLocation = adUseClient
            .Properties("Jet OLEDB:Database Password") = mdbpass <- mot de passe
            .Open
    End With
    cn.BeginTrans
    cn.Execute ("INSERT INTO X (champ) VALUES("y")",dbFailOnError)
    id=cn.Execute (("SELECT @@Identity").Collect(0))
    cn.CommitTrans
    cn.Close
    Debug.print id
    --------------------------------
    Voili voilou


  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2010
    Messages : 32
    Points : 15
    Points
    15
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    id=cn.Execute (("SELECT @@Identity").Collect(0))
    Cette ligne ne fonctionne pas et elle est interprété comme une erreur dans mon VBA... Bizarre non ?

  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 Une autre possibilité
    Une autre possibilité que j'utilise toujours:
    Dim rst As Recordset
    Dim dbl_a as Double
    Set rst = CurrentDb.OpenRecordset("Ta_Table")
    rst.AddNew
    dbl_a = rst("Id")
    rst.update
    rst.close
    dbl_a= Id créée.

    Voili, voilou, voilà!

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

Discussions similaires

  1. [AC-2010] Query SQL VBA (Insert INTO) avec Conditions en variable (Date)
    Par Deustalos dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 12/03/2015, 22h15
  2. insert into via un select soucis auto increment
    Par maysa dans le forum Requêtes
    Réponses: 6
    Dernier message: 07/03/2011, 21h41
  3. Réponses: 13
    Dernier message: 14/05/2008, 17h22
  4. [Requête + VBA] INSERT INTO autre base
    Par Zartak dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/05/2007, 15h29
  5. INSERT INTO numéro auto.
    Par Pfeffer dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/02/2005, 20h04

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