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

ASP Discussion :

recuperer la clé auto generee par un insert Access


Sujet :

ASP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 14
    Points
    14
    Par défaut [Résolu] recuperer la clé auto generee par un insert Access
    Bonjour,

    voila je travail sous asp javascript et acess, et je possede une table avec comme clé primaire un numero auto.

    j'aimerais savoir comment lors d'une requete d'insertion dans cette table, recuperer la clé primaire qui a été générée par access.

    merci d'avance.

  2. #2
    Membre actif Avatar de roots_man
    Inscrit en
    Août 2004
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 328
    Points : 282
    Points
    282
    Par défaut
    Apres l'insertion tu peux faire un pour aller au dernier enregistrement et ensuite mettre la valeur dans une variable comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Id = rst("IdDeTaTable")
    et avec ca tu récupère le dernier numéro auto de ta table
    A+
    powder skiing is not a crime

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    j'avais tenté cette solution mais voila l'erreur que je me prends avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E24)
    L'ensemble de lignes ne prend pas en charge les récupérations arrière.
    /ecommerce/enregistrerCommande.asp, line 5

    voila mon code pour ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    <%
    var Recordset2 = Server.CreateObject("ADODB.Recordset");
    Recordset2.ActiveConnection = MM_eCommerce_STRING;
    Recordset2.Source = "SELECT COM_NUM FROM TA_COMMANDE";
    Recordset2.CursorType = 0;
    Recordset2.CursorLocation = 2;
    Recordset2.LockType = 1;
    Recordset2.Open();
    var Recordset2_numRows = 0;
    %>
     
    <%Recordset2.MoveLast(); // pareil avec Recordset2.MoveLast;%>
    et la je suis completement perdu!

  4. #4
    Membre actif Avatar de roots_man
    Inscrit en
    Août 2004
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 328
    Points : 282
    Points
    282
    Par défaut
    en haut tu mettais ke tu faisait une insertion mais la je ne vois pas ou tu fait l'insertion !?!?
    powder skiing is not a crime

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    en fait j'ai ca exactement :

    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
     
    var CurentDate = ((new Date().getDate() < 10) ? "0" : "") + new Date().getDate() + "/" + (((new Date().getMonth() + 1 )< 10) ? "0" : "") + (new Date().getMonth() + 1) + "/" + new Date().getYear();
     
    var MM_editTable = "TA_COMMANDE";
     
    var MM_tableValues = "COM_TVA, COM_CLIENT, COM_CREATEUR, COM_DATE_CREATION, COM_MODIF, COM_DATE_MODIF";
     
    var MM_dbValues = "19.6," + (Recordset1.Fields.Item("CLI_NUM").Value) + ",'System','" + CurentDate + "', 'System', " + "'" + CurentDate + "'";
     
    var MM_editQuery = "insert into " + MM_editTable + " (" + MM_tableValues + ") values (" + MM_dbValues + ")";
     
    var MM_editCmd = Server.CreateObject('ADODB.Command');
     
    MM_editCmd.ActiveConnection = MM_eCommerce_STRING;
     
    MM_editCmd.CommandText = MM_editQuery;
     
    MM_editCmd.Execute();
    et comme j'arrivais pas a recuperer a partir de mon enregistrement, j'ai tenté par un recordset juste derriere pour recuperer la table avec les nouvelles valeurs.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 166
    Points : 189
    Points
    189
    Par défaut
    Pour un champ de type numauto mieux vaut utiliser @@identity.
    De la sorte on gère au moins les accès concurrentiels.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select @@identity from matable
    retourne le dernier identifiant créé par la connexion en cours, pas celle d'un autre.

    Sinon pour faire un movelast sur un recordset CursorType doit prendre une autre valeur il me semble.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    '---- CursorTypeEnum Values ----
    Const adOpenForwardOnly = 0
    Const adOpenKeyset = 1
    Const adOpenDynamic = 2
    Const adOpenStatic = 3

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    le @@identity n'est pas que pour du SQL Server?? moi je suis contraint a avoir une base de donnée access

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 166
    Points : 189
    Points
    189
    Par défaut
    C'est utilisable pour sqlserver comme pour access.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    ok, tu l'utilise comment?

    comme ca ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    var MM_editQuery = "insert into " + MM_editTable + " (" + MM_tableValues + ") values (" + MM_dbValues + "); Select @@identity from " + MM_editTable;
     
    var MM_editCmd = Server.CreateObject('ADODB.Command');
     
    MM_editCmd.ActiveConnection = MM_eCommerce_STRING;
     
    MM_editCmd.CommandText = MM_editQuery;
     
    MM_editCmd.Execute();
    ?

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 166
    Points : 189
    Points
    189
    Par défaut
    Sur le principe ça me semble correct.
    reste à tester, tiens nous au courant.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
    [Microsoft][Pilote ODBC Microsoft Access] Caractères trouvés après la fin de l'instruction SQL.
    grrrrrrr

  12. #12
    Membre actif Avatar de LineLe
    Inscrit en
    Septembre 2003
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2003
    Messages : 285
    Points : 246
    Points
    246
    Par défaut
    Hello!

    On m'avait proposé dernièrement cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    On error resume next
    dim  num_auto
    Set rs = server.CreateObject("ADODB.recordset")
    rs.open "MaBase", MaConnexion,1,3
    rs.AddNew
    rs("champ1") = champ1
    rs("champ2") = champ2
    rs.Update
    num_auto = rs("identifiant")
    rs.close
    set rs = nothing
    En espérant que ça puisse t'aider...

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 166
    Points : 189
    Points
    189
    Par défaut
    Peux-tu envoyer la requette générée par MM_editQuery stp?
    Et en ne concaténant pas les 2 requettes ça marche?

    Sinon la solution proposée par linele, est à fouiller.
    d'après mes connaissances il faut utiliser des options particulières pour gerer ainsi les accès concurrentiels.
    Mais avec acces là je suis pas sûr du tout.
    Un lien qui t'aidera peut-être :http://www.4guysfromrolla.com/webtec...122600-1.shtml

  14. #14
    Membre actif Avatar de LineLe
    Inscrit en
    Septembre 2003
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2003
    Messages : 285
    Points : 246
    Points
    246
    Par défaut
    sinon je viens de trouver ça sur le forum SQL (dans les premiers topics):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select last_insert_id from Table
    Et ceci c'est sûr, c'est pour Access

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    voila la requete generée :

    insert into TA_COMMANDE (COM_TVA, COM_CLIENT, COM_CREATEUR, COM_DATE_CREATION, COM_MODIF, COM_DATE_MODIF) values (19.6,21,'System','12/04/2005', 'System', '12/04/2005'); select @@identity from TA_COMMANDE

    et en concaténant pas les 2 ca ne marche pas non plus, je suis en train de fouiller sur les propositions de linele, je vous tiens au courant si je trouve quelque chose.

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 166
    Points : 189
    Points
    189
    Par défaut
    d'après le bout de code ci desous pêché sur internet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    Conn.Open "Provider=MICROSOFT.JET.OLEDB.4.0; " _
        & "DATA SOURCE=" & Server.MapPath("somedir\somedb.mdb"
    SQL = "INSERT INTO someTable (fld1, fld2) VALUES(123,'xyz');"
    conn.Execute SQL ' do the insert, and then...
    Set RS = Conn.Execute( "SELECT @@IDENTITY" ) 
    idOfNewlyAddedRecord = RS(0)
    RS.Close
    ...
    la bonne requete pour récupérer l'identifiant serait : SELECT @@IDENTITY et non SELECT @@IDENTITY FROM....

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    la solution de Linele un peu remaniée permet enfin de recuperer l'identifiant, voila comment je l'ai integré a mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var rs = Server.CreateObject("ADODB.RecordSet");
     
    rs.Open("TA_CATEGORIE", MM_eCommerce_STRING, 1, 3, 2);
    rs.AddNew();
    rs.Fields("CAT_DESIGNATION") = "TEST";
    rs.Fields("CAT_DESCRIPTION") = "TEST";
    rs.Fields("CAT_CREATEUR") = "TESTEUR";
    rs.Fields("CAT_DATE_CREATION") = String(CurentDate);
    rs.Fields("CAT_MODIF") = "TESTEUR";
    rs.Fields("CAT_DATE_MODIF") = String(CurentDate);
    rs.Update();
    var idOfAddedRecord = rs.Fields("CAT_NUM");

    ceci permet bien de gerer les connections grace aux lock donnés en parametre à Open.

    Merci bien!

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

Discussions similaires

  1. recuperer le numero auto apres l'insertion
    Par debutantasp dans le forum ASP
    Réponses: 1
    Dernier message: 05/03/2008, 16h38
  2. insertion dans un tree d'un objet genere par hibernate
    Par oussama127 dans le forum Hibernate
    Réponses: 7
    Dernier message: 26/03/2007, 09h42
  3. Réponses: 10
    Dernier message: 13/05/2005, 12h08
  4. [type MIME] css généré par php -> probleme
    Par prgasp77 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 23/09/2004, 21h13
  5. Accentuation - pages html générées par Java
    Par phoebe dans le forum Linux
    Réponses: 4
    Dernier message: 28/05/2004, 12h49

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