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

Contribuez Discussion :

Récupérer l'Auto incrément généré par un ajout


Sujet :

Contribuez

  1. #1
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut Récupérer l'Auto incrément généré par un ajout
    Bonjour,

    A la suite d'une demande de SQLPro, voici une méthode pour récupérer le numéro ID généré par l'ajout d'un enregistrement, ce dernier étant un champ NuméroAuto.

    N.B. En cas d'utilisation sous une version antérieure à 2000, se référer à la FAQ pour obtenir l'équivalent de la fonction Split().

    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
    32
    33
    34
    35
    36
    37
    38
    39
     
    Private Function AddNewCustomer(ByVal NewData As String, Optional ByRef LastIdentity As Long, Optional ByRef ErrNumber As Long) As Boolean
    Dim oDB                       As DAO.Database
    Dim oRS                       As DAO.Recordset
    Dim SQL                       As String
    Dim straCustomerData()        As String
     
        On Error GoTo Err_AddNewCustomer
     
        straCustomerData = Split(NewData, ";")
        Set oDB = CurrentDb()
        With oDB
            SQL = "SELECT * FROM TBLCustomers;"
            Set oRS = oDB.OpenRecordset(SQL, dbOpenDynaset)
            With oRS
                .AddNew
                For R = 0 To UBound(straCustomerData())
                    .Fields(R + 1) = straCustomerData(R)
                Next
                .Update
                .MoveLast
                 LastIdentity = .Fields(0).Value
                .Close
            End With
            .Close
        End With
        AddNewCustomer = True
        On Error GoTo 0
     
    Ex_AddNewCustomer:
        Set oRS = Nothing
        Set oDB = Nothing
        Exit Function
     
    Err_AddNewCustomer:
        ErrNumber = Err.Number
        AddNewCustomer = False
        Resume Ex_AddNewCustomer
    End Function
    Voici un exemple d'utilisation...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub TestPourVoir()
    Dim lngLastIdentity           As Long
    Dim lngErrNumber              As Long
     
        If AddNewCustomer("La Société Matik;Henri Cochet;12 rue Diment;98765;LA VILLE IEGIATURE;0130934519;hcochet@free.fr", lngLastIdentity, lngErrNumber) Then
            MsgBox "L'ID de l'ajout est : " & lngLastIdentity
        Else
            MsgBox "L'erreur " & lngErrNumber & " a été levée durant l'ajout du client !", vbExclamation, "Ajout échoué"
        End If
    End Sub
    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Salut Argy,

    Pourquoi ne pas récupérer l'id directement entre le addnew et l'update ?

    Dans le cas où un des champs est de type NuméroAuto, il est impossible d'affecter une valeur à ce champ. La numérotation automatique est gérée par le moteur Jet. Toutefois, pour des raisons diverses et variées, vous pouvez avoir le besoin de connaitre la nouvelle valeur du NuméroAuto créé. La valeur d'un tel champ est disponible avant l'appel de la méthode Update. Prenons l'exemple d'une table client dont le champ NumClient est auto-incrémenté :


    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
     
    Dim oRst as DAO.Recordset
    Dim oDb as DAO.Database
    Dim LngNouvelleValeur as Long
    Set oDb=CurrentDb
    Set oRst=oDb.OpenRecordset("TblClient",dbOpenTable)
    'Passe en mode Ajout
    oRst.AddNew
    'Affecte les différents champs
    oRst.Fields("NomClient").Value="DUPONT"
    oRst.Fields("PrenomClient").Value="Martin"  
    'Récupère le nouvel identifiant
    LngNouvelleValeur=oRst.Fields("NumClient").Value
    'Met à Jour
    oRst.Update
    'Affiche le numéro client de 
     'l'enregistrement nouvellement créé
    Msgbox "Le client " & NouvelleValeur & " a été créé"
     
    'Libération des objets
    oRst.Close
    oDb.Close
    Set oRst=Nothing
    Set oDb=Nothing

  3. #3
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Salut Tof,

    Parce que selon la version d'Access et le mode d'exploitation des tables (le plus souvent dans des config ADP ou avec des tables liées) et pour des raisons obscures auxquelles j'ai été confrontées, l'@@ID n'eut été connu qu'après l'Update...
    D'ailleurs dans ma tite contribution, SQLPro l'a été tout autant... d'où mon post.

    Donc effectivement, ton intervention anéantie nos propositions respectives mais je pense que la version d'Access y est pour beaucoup... (2003 et >)
    J'essayerais ce soir avec un 2000 ne serait-ce que pour me confirmer que je ne suis pas encore sénile...

    Merci.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    C'est le cas pour les tables Sql Server. L'id auto n'est connu qu'après l'update.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Parce que selon la version d'Access et le mode d'exploitation des tables (le plus souvent dans des config ADP ou avec des tables liées) et pour des raisons obscures auxquelles j'ai été confrontées, l'@@ID n'eut été connu qu'après l'Update...
    Salut Argy,

    Dans un projet ADP, logiquement, on préfère ADO à DAO. Et dans le cas des recordset ADO, l'ID est connu après l'update mais sans recours à Movelast puisque le curseur reste normalement sur l'enregistrement qui vient d'être créé.

    Il faudrait testé avec du DAO via ODBC, il se peut qu'effectivement dans ce cas, rien ne fonctionne

  6. #6
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Bonjour, Argy

    Puis-je te suggérer un détail ?

    Dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With oRS
         .AddNew
         For R = 0 To UBound(straCustomerData())
             .Fields(R + 1) = straCustomerData(R)
         Next
        .Update
        .MoveLast
        LastIdentity = .Fields(0).Value
        .Close
    End With
    peux-tu remplacer .MoveLast par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Bookmark = .LastModified
    Si tu utilises .MoveLast, tu vas bien sûr en fin de table, ce qui est correct avec un index autoincrémenté NON aléatoire. Avec un index aléatoire (rare, mais utile pour des architectures distribuées...), ton nouvel index ne sera PAS le plus grand.

    Avec .LastUpdated, tu es sûr d'atteindre l'enregistrement qui vient d'être modifié, quel que soit le type d'index.
    Développement Office, support technique, assistance, sur place (Loire atlantique, Vendée, Maine et Loire) ou à distance.

  7. #7
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Avec .LastUpdated, tu es sûr d'atteindre l'enregistrement qui vient d'être modifié, quel que soit le type d'index.
    Salut


    Attention à ne pas confondre LastUpdated avec LastModified

  8. #8
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 006
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 006
    Points : 24 598
    Points
    24 598
    Par défaut
    Citation Envoyé par Tofalu Voir le message
    Salut


    Attention à ne pas confondre LastUpdated avec LastModified
    ça me rappelle quelqu'un ça...
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  9. #9
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Ok, ok...
    Merci pour ces suggestions...
    Il est vrai que ma source initiale était impliquée dans un contexte
    "un index autoincrémenté NON aléatoire"... Merci Papy.

    Bon, toutes ces propositions seront à adapter selon les cas.

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/04/2011, 15h20
  2. [MySQL] Récupérer valeur auto-incrément après requête DELETE
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/01/2011, 12h36
  3. comment récupérer le flux xml généré par le ws
    Par didine6393 dans le forum Services Web
    Réponses: 1
    Dernier message: 25/10/2009, 19h15
  4. Réponses: 6
    Dernier message: 01/01/2009, 19h23
  5. Réponses: 11
    Dernier message: 23/11/2007, 09h38

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