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

Bases de données Delphi Discussion :

[ACCESS] Connaitre l'autoincrement lors d'un INSERT


Sujet :

Bases de données Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut [ACCESS] Connaitre l'autoincrement lors d'un INSERT
    Bonjour,

    je réalise actuellement un logiciel multi-postes.
    Dans une procedure, je dois remplir deux tables dont l'une doit récupérer l'identifiant (en AutoIncrement) de l'autre.

    ex :
    Soit les Tables Stock et Gestion :
    Stock : {StockID, Label, Qualite, Reference}
    Gestion : {GestionID, ClientID, StockID, Date}

    Lors d'une nouvelle demande, ma procedure doit :
    - faire un INSERT INTO Stock (pour rajouter le produit non existant)
    - faire un INSERT INTO Gestion en renseignant StockID avec l'enregistrement précédent.

    Il est toujour possible de faire un SELECT intermédiaire pour récupérer StockID, mais cela me parrait assez lourd.

    Existe-il une autre solution ?

    Merci
    CV :
    - LinkedIn
    - Viadeo

  2. #2
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Points : 120
    Points
    120
    Par défaut
    Salut,

    ne pas fermer la table après le post et lire le champ qui te sert d'index (ou de clé, ou de liaison...)... Bref le champ autoincrémenter

    ne ferme la table qu'après cette lecture

    @+
    Ce n'est pas parce qu'on pédale dans la semoule, qu'on est sûr de manger du couscous... (anonyme)

  3. #3
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Excuse-moi, mais je ne comprends pas vraiment ce que tu veux dire

    voici les deux requetes actuel qu'il faut lier :
    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
     
    sql1 := 'INSERT INTO Stock (Label, Qualite, Reference) VALUES ('''+
        EditLabel.text+''','''+
        EditQualite.text+''','''+
        EditRef.text+''');';
     
    sql2 := 'INSERT INTO Gestion (ClientID, StockID, Date) VALUES ('+
        IntToStr(fIdClient)+','+
        IntToStr( ????? pour le stockID)+',#'+
        MyDateToStr(DateDeCommande)+'#);';
     
      with DM.Query1 do  // Query1 est de type ADOQuery
      begin
        SQL.Clear;
        SQL.Add(sql1);
     
        ExecSQL;
     
        Close;
      end;
     
      with DM.Query1 do
      begin
        SQL.Clear;
        SQL.Add(sql2);
     
        ExecSQL;
     
        Close;
      end;
    Comment ferais-tu pour récupérer l'autoincrement de sql1 ?
    CV :
    - LinkedIn
    - Viadeo

  4. #4
    Membre du Club Avatar de samlerouge
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    hello,



    http://nepomiachty.developpez.com/in...cess/index.php

    Je pense que cela pourra t'aider

    Bonne continuation
    Windev-Webdev - Oracle- PLSQL
    est l'ami de tout le monde

  5. #5
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Points : 120
    Points
    120
    Par défaut
    Salut,

    Citation Envoyé par yobenzen
    Excuse-moi, mais je ne comprends pas vraiment ce que tu veux dire
    ce que je veux dire c'est que plutôt que de passer par une requête pour alimenter la table tu passes de façon plus "simple" et natrurelle ( : ) par une structure du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    With Table1 do
       begin 
       Open;
       Append;
       Field....
       Post;
       Close;
       End;
    et que le close du bout de code plus haut, tu le fasses après lecture de l'index...

    mais chacun fait comme il veut....

    @+ 8)
    Ce n'est pas parce qu'on pédale dans la semoule, qu'on est sûr de manger du couscous... (anonyme)

  6. #6
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    samlerouge -> J'ai vu ce tutoriel, mais il ne correspond pas à mon prolème. En effet, c'est un champs autoincrement que j'utilise et je ne peux modifier sa valeur. La référence est lié à une autre table et les deux autres champs permettent les doublons.

    amenofis -> Je n'ai jamais utilisé ce composant (mais j'ai vu qu'il pouvait récupérer l'autoincrement de l'enregistrement effectué), est-il facile à comprendre, permet-il le multipostes ?
    CV :
    - LinkedIn
    - Viadeo

  7. #7
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Salut !
    La meilleur solution que j'ai trouvé pour ce problème de récuperation d'autoincrément est la suivante :

    Tu créé dans chacune de tes tables une colonne GUID_ID. Lors de l'INSERT, tu génére un GUID (c'est super simple regarde dans l'aide). Ce GUID est un numéri unique générer par Windows et qui tiens compte de l'adresse mac de la carte réseau, de la nano seconde en cours etc... . Tu es donc sur que ce GUID est unique au monde.
    Une fois l'insert effectué, tu fais un SELECT ID FROM maTable WHERE GUID_ID=GuidInsérer et tu récupère ton Id Autoincrémenter.
    Je trouve ca plus propre que la modification des valeurs expliqué dans le tutoriel.

    Si cette méthode te conviens et que tu as des questions, n'hésite pas.

    A+
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

  8. #8
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Ta solution est très intéressante, cependant cela nécessite la modification de la structure de ma base de donnée (chose que je préfèrerai éviter).
    Je la garde donc de coté pour les prochains développements ainsi que, si je ne trouve mieux, pour celui-ci.
    Merci

    Existe-t-il encore d'autres possibilités ? surtout au niveau du code Delphi.
    CV :
    - LinkedIn
    - Viadeo

  9. #9
    Membre du Club Avatar de samlerouge
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    samlerouge -> J'ai vu ce tutoriel, mais il ne correspond pas à mon prolème. En effet, c'est un champs autoincrement que j'utilise et je ne peux modifier sa valeur. La référence est lié à une autre table et les deux autres champs permettent les doublons.
    Hello,

    Ca marche car j'ai utilisé c'est methode avec un table contenant un numéro reliée à une autres qui contient aussi le numéro mais comme clef étrangère.
    En prenant ton cas:
    Stock : {StockID, Label, Qualite, Reference} Ici StockId c'est la clé primaire:

    Gestion : {GestionID, ClientID, StockID, Date} Ici StockId c'est la clé étrangere.

    Donc après l'insertion d'un nouveau stockID, tu fais simplement un select MAX du style


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT MAX(StockId) AS max
       FROM stock
    puis tu récupères le résultat de la requete dans une variable par exemple iNewStock et tu fais l'insertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     INSERT INTO
       gestion(GestionID, ClientID, StockID, Date)
       VALUES('2', '2', iNewStock, 10.10.2003);
    Et voila c'est tout simple et ca marche comme il est expliquer dans le tutoriel, donc je ne vois pas trop le problème. Ce tutoriel traite de récupération de l'identifiant auto-incrémenté dans une base Access . Ce n'est pas ce que tu veux faire ? :

    Windev-Webdev - Oracle- PLSQL
    est l'ami de tout le monde

  10. #10
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    J'avais bien vu cela dans le tutoriel. Mais comment gérer les accès concurrentiels ?

    en effet si deux personnes font une insertion dans sotck puis dans gestion simultanément, cela ne risquerait pas de créer un décalage comme expliqué dans le tutoriel.
    je crois que c'est pour cela qu'ils expliquent qu'il faut affecter une valeur aléatoire dans la première table.

    Mais je me trompe peut-être (enfin j'espère )
    CV :
    - LinkedIn
    - Viadeo

  11. #11
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Bon, pour compléter réellement ce que je fais :

    Je ne fais jamais d'INSERT de valeur dans une table access, je ne fais que des UPDATE. En fait, j'ai une procedure qui s'appelle GetNewId, et qui :
    insert une ligne vide avec juste un valeur unique (que ce soit un GUID ou autre... )
    Fait un select dans la table pour retrouver l'ID qui a la valeur unique dans la table
    Enfin, la fonction renvoie l'ID

    Une fois l'ID récuperer, tu fait un UPDATE de ta ligne et le tours est jouer !!


    Si tu ne veux pas creer une nouvelle colonne dans tes tables, tu peux tres bien utiliser n'importe quel colonne dans laquelle tu insert une valeur unique.
    La valeur peux etre un GUID ou si les utilateurs ont un login, ca peut etre le login+un nombre aléatoire...

    Voila... Normalement, avec tout ca, tu dois pouvoir t'en sortir !!
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

  12. #12
    Membre du Club Avatar de samlerouge
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    Normalement il faut voir cela avec les transactions.

    Dans ACCES, il y différent type de verrouillage (menu Outils/options, onglet Avancé).

    Mais normalement, il y a un verouillage sur les accès concurentiels.
    Ce poste confirme ta question:
    en effet si deux personnes font une insertion dans sotck puis dans gestion simultanément, cela ne risquerait pas de créer un décalage comme expliqué dans le tutoriel.


    http://www.developpez.net/forums/vie...t=verrouillage

    Il ne faut pas avoir une variable aléatoire, car tu récupéres le plus grand numéros du stock (c'est le dernier entré, si ton incrémentation est de type x=x+1 et non aléatoire ou personnalisée).


    Bonne continuation
    Windev-Webdev - Oracle- PLSQL
    est l'ami de tout le monde

  13. #13
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    NoisetteProd
    Je ne fais jamais d'INSERT de valeur dans une table access, je ne fais que des UPDATE. En fait, j'ai une procedure qui s'appelle GetNewId
    Je n'y avais pas pensé, mais voila comment mon problème d'insertion vis à vis des acces concurentiels est réglé !
    Merci beaucoup, c'est parfait !

    a bientot
    Ben
    CV :
    - LinkedIn
    - Viadeo

  14. #14
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    De rien !!

    SamLeRouge : je ne suis pas sur que tu ai tout compris... relis tout depuis le debut, y compris tes posts et les liens que tu fournis.... ... sinon, c'est moi qui comprend rien !
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

  15. #15
    Membre du Club Avatar de samlerouge
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    hello NoisetteProd

    ce que j'ai compris c'est qui a deux tables qui sont reliés comme ca :

    Stock : {StockID, Label, Qualite, Reference} Ici StockId c'est la clé primaire:

    Gestion : {GestionID, ClientID, StockID, Date} Ici StockId c'est la clé étrangere.

    Le stock contient la clé primaire du Stock, donc dans gestion Stock ID est la clé étranger referencée par le champs StockID de la table STOCK.

    Pour ma part, il veut insérer un new stock, puis insérer une Gestion pour ce new stock.
    Donc si'il prend la valeur Max StockID de la table Stock, c'est la valeur du stock qui a été le dernier insérer! Donc il la reprend pour reference les tupples gestion concernant le stock.

    Voici ca c'est ce que j'ai compris et ca marche car je l'ai déjà utilisée.

    Mes réponses aux sujets des accès concurentielles sont correctes !!!
    Depuis je suis allé voir sur le forum ACCESS pour confirmer mes dires!

    SamLeRouge : je ne suis pas sur que tu ai tout compris... relis tout depuis le debut, y compris tes posts et les liens que tu fournis.... ... sinon, c'est moi qui comprend rien !
    Les deux liens, un sur le tutoriel et un sur un post , je ne vois pas ce qu'il y a ? Et sur le sujet non plus?
    Peux tu m'éclairer SVP, quel est pour toi le sujet du post de yobenzen

    Sinon je pense que ta méthode doit aussi fonctionner car tu l'utilises aussi.
    Bon, le but de mon post est de pouvoir aider quelqu'un qui à un problème.

    Merci d'avance de ta compréhension
    Windev-Webdev - Oracle- PLSQL
    est l'ami de tout le monde

  16. #16
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Citation Envoyé par samlerouge
    Donc si'il prend la valeur Max StockID de la table Stock, c'est la valeur du stock qui a été le dernier insérer! Donc il la reprend pour reference les tupples gestion concernant le stock.
    or , YobenZen nous dis :
    permet-il le multipostes
    Maintenant, imagine deux secondes que tu as x utilisteurs, la valeur Max de StockID n'est pas forcement celle de l'utilisateur y si l'utilisateur z a juste apres fait un insert... Donc, ton raisonnement n'est valable que pour un seul acces simultané à la base...

    Donc, je ne suis pas sur que cela pouvait aider YobenZen.

    Quand à ton lien sur les accès concurentielles, soit, la base est verouillée lors de ton insert, mais libérer juste apres ! Et heureusement pour les autres utilisateurs !

    Qu'en penses-tu ??
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

  17. #17
    Membre du Club Avatar de samlerouge
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    Je suis assez d'accord avec toi, pour le mutli utilisateur, par ailleur ACCES n'est pas la meilleur base pour une application multi utilisateur mais bon.

    Je ne sais pas comment est fais son application, mais si tu penses que tu peux insérer un new stock et puis des gestion et que le Post se fait à la fin.

    Il n'y a pas de problèmes, car les insértions se font à la suite donc la base est toujours verouilée.

    Bref mais bon quand a dire que les liens ne servent a rien, c'est comme pas trop correct sur ce forum . J'ai juste mis ce lien pour répondre à la question sur les accès concurentiel posée et sur le thème du post.

    Si jamais ton astuces avec GUID est très intéréssante, je vais la tester bientot.

    a+
    Windev-Webdev - Oracle- PLSQL
    est l'ami de tout le monde

  18. #18
    Membre émérite
    Avatar de NoisetteProd
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    1 905
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 905
    Points : 2 614
    Points
    2 614
    Par défaut
    Je n'ai pas dis que le lien ne servait a rien, je t'ai juste proposé de les relire pour te rendre compte que ce que tu proposait ne convenais pas à la demande.... Et puisque tu parles de la déonthologie de ce forum : Pierre CASTELAIN dis :
    Mais postez des réponses justes et testées, ou alors dites "Je pense que..."......
    .

    C'est donc juste dans ce soucis de clarté et puisque je trouvais que ta reponse n'etais pas la plus approprié que je me suis permis cette remarque !!
    Mais je ne souhaitais pas t'offensé ! Si c'est le cas, escusse moi ! Et arrétons la avans que ce post deviennetnt un troll !!

    P.S. : Quand à l'utilisation d'access pour le multi utilisateur, c'est sur que ce n'est pas forcement la meillleur chose, mais on ne choisis pas toujours !!
    Fais cogiter ta Noisette !!

    Participez à la page SOURCES Delphi !

    Découvrez le Défi Delphi

    Mon Mail

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

Discussions similaires

  1. Récupérer la clé autoincrement lors d'un insert
    Par jejeman dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 23/07/2007, 19h47
  2. [BDE] Echec de contrôle lors d'une insertion
    Par rbag dans le forum Bases de données
    Réponses: 2
    Dernier message: 26/11/2004, 09h57
  3. PB date lors d'une insertion en Base.
    Par NATHW dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/09/2004, 17h53
  4. Réponses: 4
    Dernier message: 24/06/2004, 12h13
  5. maj d'1 colonne avec la date du jour lors de l'INSERT
    Par Celina dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/12/2003, 15h03

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