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

Lazarus Pascal Discussion :

Récupération d'un champ auto-incrémenté (PostgreSql) [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 47
    Points
    47
    Par défaut Récupération d'un champ auto-incrémenté (PostgreSql)
    Bonjour à toutes et tous...
    Nouveau sous Lazarus, j'ai un petit problème à vous soumettre :
    J'ai une table dont la clef primaire est de type INTEGER auto-incrémenté.
    Je souhaite récupérer la valeur de la clef primaire après insertion d'un nouvel enregistrement.
    Voici mon code SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    insert into topics 
    (id, code, label, parent_topic, description)
    values
    (DEFAULT, :pcode, :plabel, :pparent_topic, :pdescription)
    returning id
    Et le code Pascal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with zqAddTopic do
         begin
           paramByName('pcode').asString := Code;
           paramByName('plabel').asString := Lbl;
           paramByName('pparent_topic').asInteger := ParentTopic;
           paramByName('pdescription').asString := Description;
           ExecSQL;
           result := fieldByname('id').asInteger;
         end;
    Ce code fonctionne mais... id vaut toujours 0 alors que les lignes sont bien créées et que le compteur est bien incrémenté...
    J'ai également tenté un
    voire même
    en tentant de récupérer la valeur du paramètre...
    Sans succès...
    Quelqu'un a-t-il une piste à suggérer ?

    versions: Lazarus v 0.9.31 et Zeos Lib 6.51

    Merci d'avance,

    Michel

  2. #2
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Avec Zeos cela ne marche effectivement pas, et tu en apprendras plus avec cette discussion en anglais. C'est un problème indépendant de Lazarus.

    Il parait qu'on peut utiliser les séquences PostgreSql mais la syntaxe varie selon les versions et elle est différente d'autres SGBD. J'y ai renconcé pour rester plus portable.

    Sinon il suffit de rechercher la valeur max du champ autoincrémenté juste après l'insertion, à l'intérieur d'une transaction bien entendu.

    PS : essaie de passer en Zeos 6.6.6 qui est stable depuis plus d'un an.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 104
    Points : 395
    Points
    395
    Par défaut
    bonjour

    effectivement ça ne marche pas avec une requete. La solution que j'ai trouvé qq part sur le net

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    matable.Insert
    //mise à jour des champs
    matable.FieldByName('code').AsInteger = code;
    matable.FieldByName('label').AsString = label;
    matable.Post
    lastInsrtId = matable.FieldByName('id').AsInteger;
    lastInserId contient le dernier id ajouté
    cordialement
    Claude
    Lazarus 0.9.30-4 et FPC 2.4.4
    on
    debian Lenny i386
    debian Lenny amd64
    Ubuntu 10.04 i386
    Ubuntu 10.04 amd64
    MacOSX panther (10.5.8)
    Window 7 32 bits

  4. #4
    Membre du Club Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Tintinux, Pomalo

    L'utilisation d'un ZTable me semble tout-à-fait appropriée dans le cas présent.
    Et pour d'autre cas plus complexes, j'utiliserai la transaction.

    Merci pour votre aide active,

    Michel

  5. #5
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Hello

    Pour récupérer le dernier identifiant d'un Insert , la réponse se trouve ici dans la doc de PostGreSql.

    Il faut lire le résultat de la requete Insert en lui précisant le nom de la rubrique à renvoyer. (Utiliser RETURNING)

    INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
    RETURNING did;
    Cordialement,
    Chris

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Chris,

    Mais est-il envisageable de récupérer cette valeur avec le Zquery.ExecSQL nécessaire à l'exécution de la requête SQL d'insertion ? Je me suis longtemps enquiquiné avec ce problème... Je pensais qu'avec un ExecSQL, on ne pouvait "récupérer" autre chose qu'un try..except..end;. Si tel n'est pas le cas, hum....

    Cordialement. Gilles

  7. #7
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Citation Envoyé par chris37
    Pour récupérer le dernier identifiant d'un Insert , [...] Il faut lire le résultat de la requete Insert.
    Ce serait certainement plus efficace mais, comme Selzig, je n'ai jamais réussi à récupérer le paramètre en retour d'une telle requête.

    Comment fais-tu exactement ?
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  8. #8
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Hum, je n'ai pas de serveur PostgreSql sous la main et je viens de relire le fil de discussion et effectivement, c'est curieux...

    Que dit le code de zeos lors du execsql, Affecte t'il les variables ?

  9. #9
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Citation Envoyé par chris37
    je n'ai pas de serveur PostgreSql sous la main
    Moi non plus, mais à la prochaine occasion j'essaierai à nouveau.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2011, 17h50
  2. récupération du champ auto-incrément
    Par Fxg dans le forum Bases de données
    Réponses: 10
    Dernier message: 31/08/2010, 14h05
  3. champ auto incrémenté
    Par Kerod dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/09/2005, 17h29
  4. [BCB5][FB 1.5]IBDataSet et champ Auto-incrémenté
    Par Sitting Bull dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 21/07/2004, 15h37
  5. [JDO]Hibernate : Mapping d'un champ auto-incrémenté
    Par brice.antoine dans le forum Hibernate
    Réponses: 4
    Dernier message: 02/04/2004, 10h36

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