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 :

Insertion : Num Auto : @@IDENTITY ou Id du RecordSet ?


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2017
    Messages : 47
    Points : 40
    Points
    40
    Par défaut Insertion : Num Auto : @@IDENTITY ou Id du RecordSet ?
    Bonjour

    Je souhaite insérer un nouvel enregistrement dans une table et récupérer le numéro de l'identifiant (numéro auto) de l'enregistrement créé.

    Je précise que les données sont dans une table liée qui est une liste SharePoint.

    Apparemment il y a deux solutions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim lastID As Long
        With CurrentDb
            With .CreateQueryDef("", _
                "INSERT INTO MaTable " & _
                    "( Mon_champ ) " & _
                "VALUES " & _
                    "( '999' )")
                .Execute dbFailOnError
                .Close
            End With
            lastID = .OpenRecordset("SELECT @@IDENTITY").Fields(0)
            Debug.Print lastID
        End With
    Ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim rst As Recordset
    Dim dbl_a as Double
    Set rst = CurrentDb.OpenRecordset("MaTable")
    rst.AddNew
    dbl_a = rst("Id")
    rst.update
    rst.close
    Quelle est la manière méthode pour bien récupérer l'ID de l'enregistrement inséré même si plusieurs utilisateurs insèrent des données de manière concurrente ?

    Merci pour vos réponses

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 264
    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 264
    Points : 19 430
    Points
    19 430
    Billets dans le blog
    63
    Par défaut
    Bonsoir,

    Dans la seconde méthode apparemment vous n'ajoutez rien dans votre table : pas de mise à jour entre rst.addnew et rst.update.

    Donc, dans ce cas le numéro auto n'est pas généré.

    Il faudrait faire :

    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
    Dim rst As Recordset
    Dim num as long
     
    Set rst = CurrentDb.OpenRecordset("MaTable")
     
    rst.AddNew
    rst!Mon_champ = 999
    '...
    rst.update
     
    rst.MoveLast ' on va au dernier enrg
     
    num = rst("Id") ' copie du dernier numéro-auto 
     
    '...
     
    rst.close
    set rst = Nothing
    En mode multi-utilisateurs, si un autre utilisateur ajoute un enrg. dans cette table dans le m^me temps, il pourrait générer le même numéro-auto (il faudrait peut être mettre des verrous sur les enrg. de cette table).

    Idéalement, il faudrait créer une table compteur indépendante pour enregistrer le dernier numéro-auto qui serait mise à jour uniquement quand on crée un nouveau numéro-auto, il y aurait moins de risque de conflits.

    Sinon, utiliser une gestion d'erreur en cas de doublon sur ce champ en clé primaire.

    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

  3. #3
    Membre éprouvé Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 842
    Points : 983
    Points
    983
    Par défaut
    Bonjour,
    Essaye quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Form_AfterInsert()
        Debug.Print "Recuperer de la base de donnees le numero d'ordre de l'enregistrement nouvellement insere"
    End Sub
    .
    Diviser c'est régner : United we stand, Divided we fall
    .

  4. #4
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 422
    Points : 2 181
    Points
    2 181
    Par défaut
    Bonjour,
    Par définition on ne peut pas fournir 999 a un autoincrement.

    Ta deuxième solution celle avec le recordset me paraît la plus appropriée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL="select* from [mytable] where [champ1]='toto'"
    Set RS= CurrentDb.OpenRecordset(SQL)
    If RS.eof then
       RS.addnew
       Rd("champ1")="toto"
       RS.update
    End if
    Debug.print RS.id
    RS.close

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 644
    Points
    1 644
    Par défaut
    Hello,

    J'aurais tendance à privilégier la requête @@IDENTITY,
    l'ouverture d'un recordset sur une table, selon son volume, peut être coûteux.

  6. #6
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 422
    Points : 2 181
    Points
    2 181
    Par défaut
    Access ne reconnaît pas la @@IDENTITY d'une table lié
    sql="SELECT DMax('[ID]', '[NomDeLaTableLiée]') AS DernierID FROM [NomDeLaTableLiée];"Merci pour le -1 anonyme

  7. #7
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2017
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    Merci pour vos réponses!

    Mon problème est bien celui de récupérer le numéro auto de l'enregistrement généré par mon insertion de données.
    En faisant DoCmd.RunSQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO MaTAble ...
    Puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    New_id = Dmax("[num_Auto]","[MaTable]","[num_Auto] > 0")
    NewID ne correspond pas forcément au NumAuto de l'enregistrement qui vient d'être effectué dans le cas où deux utilisateurs travaille en même temps.

    Je vais surveiller si cette méthode fonctione

  8. #8
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 422
    Points : 2 181
    Points
    2 181
    Par défaut
    Si plusieurs utilisateurs sont susceptibles de faire de insertion plus ou moins simultané alors je t'invite à ajouter, si tu en as le pouvoir, un champ user qui permettra de signer son travail.

    Ainsi le maxID du user concerné ne posera plus de problème.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 644
    Points
    1 644
    Par défaut
    Petit points d'attention:
    Numéro automatique n'est pas forcément synonyme d'incrémentation automatique, tout dépend comment sont configuré les tables.
    Sous Access, il y a incrémentation automatique ou valeur aléatoire, et si l'on a choisit numéro de réplication comme type de données, c'est un GUID aléatoire.

    Selon la BDD en back-end, DMax()+1 ne garantie pas non plus de retourner la N° de la prochaine clef primaire, en effet, les SGBD robustes garantissent la non réutilisation des clefs primaire (AddNew + Cancel ==> une clef primaire "mangée"), ce qu'Access ne fait pas initialement (il est possible d'enforcer ce comportement avec les triggers), il suffit de compacter une BDD pour re-initialiser les clefs primaires a DMax()+1.

    Même si on ne se soucis pas de ces détails dans 99% des cas, c'est bon à savoir.

  10. #10
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 422
    Points : 2 181
    Points
    2 181
    Par défaut
    Le demandeur précise dans ça première question
    récupérer le numéro de l'identifiant (numéro auto)

  11. #11
    Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juillet 2017
    Messages : 47
    Points : 40
    Points
    40
    Par défaut
    C'est une bonne idée. Je vais tester!

    Citation Envoyé par Thumb down Voir le message
    Si plusieurs utilisateurs sont susceptibles de faire de insertion plus ou moins simultané alors je t'invite à ajouter, si tu en as le pouvoir, un champ user qui permettra de signer son travail.

    Ainsi le maxID du user concerné ne posera plus de problème.

Discussions similaires

  1. recup num auto
    Par kikilevrai dans le forum Access
    Réponses: 3
    Dernier message: 10/07/2006, 12h00
  2. Créer un Num Auto par requête pour Access
    Par Driyo dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 29/06/2006, 14h23
  3. Créer un Num Auto par requête pour Acces & SQL2k
    Par Driyo dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 29/06/2006, 14h06
  4. [Access 2003] forcer num auto pour 6 requetes
    Par dakoyaz dans le forum Access
    Réponses: 19
    Dernier message: 19/05/2006, 16h08
  5. PGSQL et les num auto
    Par Tragnee dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 08/05/2006, 10h39

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