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 :

Recuprer ID generer ZEOS+FIREBIRD


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut Recuprer ID generer ZEOS+FIREBIRD
    Bonjour à tous,

    mon problème est dans la récupération de id après une insertion.
    avant avec IBX j'utilise le composant IBGenerateur et LeCpt:=DM.GetCpt('table1'); pour récupérer id

    existe il un composant pareil avec Zeos ?

    j ai essayer avec :
    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
     
     dmm.ZConnection1.AutoCommit := true;
        dmm.ZConnection1.StartTransaction;
      try
         dmm.Zquery1.SQL.Text:='Insert Into TABLE_TEST2 (dossier)values('+after2.text+') returning ID_CPT_T';
         dmm.zquery1.ExecSQL;
     
         dmm.ZConnection1.Commit;
         ID_Result := dmm.zquery1.FieldByName('ID_CPT_T').AsInteger;
         ShowMessage('Le nouveau ID est : '+intToStr(ID_Result)+'');
      except
        on E: Exception do
        begin
     
          if dmm.ZConnection1.InTransaction then
            dmm.ZConnection1.Rollback;
            Application.ShowException(E);
        end;
    (avec generateur et trigger creer dans la base de donnees)

    mais la requete ne retourne rien !!


    WIN XP, Delphi 7, FireBird 2.1, Zeos 7.1.2-stable,

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    un execSQL ne renvoi rien , donc il faudrait essayer avec Open ou active:=True
    (je n'ai pas suivi les dernières évolutions de ZEOS , donc à vérifier)

    plus classiquement , il suffirait d'utiliser un
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT GEN_ID(GEN_MON_GENERATEUR,0) FROM 
    RDB$DATABASE;

    autre solution utiliser le TZSequence
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    J'ai déjà posé cette question qui est restée sans réponse.

    http://www.developpez.net/forums/d13...e-mise-oeuvre/

    Sur le forum de Zeoslib, j'avais trouvé une modification à réaliser sur la version 6.6.6 pour corriger cette anomalie
    http://zeoslib.sourceforge.net/viewt...hp?f=17&t=2604

    Cependant, elle ne fonctionne pas sur la version 7.0.4. Je n'ai fait aucun essai pour la version 7.1.2.

    Etant, dans l'immédiat, sans réponse, j'ai continué d'utiliser la version 6.6.6, modifiée suivant le schéma proposé dans le forum Zeoslib.

    Les applications développées, avec ce composant modifié, ne présentent aucun dysfonctionnement.

    Dès que je disposerai d'un peu de temps, je me plongerai dans les sources pour comprendre pourquoi la modification de 6.6.6 ne fonctionne pas sur 7.1.2.

    Après, il est possible d'utiliser le composant séquenceur pour traiter la création des Id. Mais dans d'une application réseau, je n'ai pas testé les risques de conflit. Pour ma part, je préfère le schéma que tu indiques

    (avec generateur et trigger creer dans la base de donnees)
    Il faudrait peut-être poser la question sur le forum Zeoslib à condition de rédiger la demande en anglais.

    A+

    @SergioMaster


    plus classiquement , il suffirait d'utiliser un
    Code :
    Sélectionner tout - Visualiser dans une fenêtre à part

    SELECT GEN_ID(GEN_MON_GENERATEUR,0) FROM
    RDB$DATABASE;
    Dans le cas de plusieurs intervenants n'y a-t-il pas un risque de récupérer Id qui n'est pas celui de ton enregistrement ? En effet, cette commande lit le compteur de la base qui peut-être modifié entre le moment de l'insertion et le moment de la lecture.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par seabs Voir le message
    Dans le cas de plusieurs intervenants n'y a-t-il pas un risque de récupérer Id qui n'est pas celui de ton enregistrement ? En effet, cette commande lit le compteur de la base qui peut-être modifié entre le moment de l'insertion et le moment de la lecture.
    Si , mais dans ce cas en général on n'utilise plus le trigger on récupére avant en incrémentant via un SELECT GEN_ID(GEN_MON_GENERATEUR,1) FROM
    RDB$DATABASE; et on initialise le champ id
    (la bonne vieille méthode à l'ancienne quoi, soit avant firebird 2.5)
    J'avais testé le TZSequence , mais j'ai toujours eu quelques problèmes avec ce dernier (incrément par 2 , comme si le trigger était 'fired' avant)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Avec le TZSequence, ça fonctionne bien à condition de désactiver le trigger !
    Sinon, le compteur est appelé 2 fois et, je crois, que c'est la valeur du trigger qui est prise en compte !

    En fait, moi, je fais appel au générateur sans passer par le trigger ni le TZSequence et je n'ai aucun souci même dans un environnement multi-utilisateurs !

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    bonjour,



    je pense que l’utilisation de
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT GEN_ID(GEN_MON_GENERATEUR,1) FROM
    RDB$DATABASE;
    est la meilleure solution.

    la fonction que j'utilise pour recuperer ID
    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
     
     function Get_ID_I(const gener:string):Integer;
       var  zquer:TZQuery;
       begin
           zquer:=TZQuery.Create(nil);
           zquer.Connection:=dmm.ZConnection1;
           try
              with zquer do
                begin
                   SQL.Text:='SELECT GEN_ID('+gener+',1) FROM RDB$DATABASE';
                   open;
                   Result := zquer.Fields[0].AsInteger;
                end;
           except
           end;
           zquer.free;
       end;
    utilisation dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    ......
     
     dmm.ZConnection1.StartTransaction;
      try
     ID_cpt:=Get_ID_I('TABLE_TEST2'); //TABLE_TEST2 est le nom de generateur
         dmm.Zquery1.SQL.Text:='Insert Into TABLE_TEST2 (ID_CPT_T,DOSSIER)values('+IntToStr(ID_cpt)+','+after2.text+')';
         dmm.zquery1.ExecSQL;
     
    ......
    encore une fois merci

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Afin de compléter ce dossier, il faut signaler que, parmi les composants UIB, UIBQuery permet la récupération de l'ID généré par un trigger lors d'une requête d'insertion.

    Il est dommage de ne pas obtenir le même avantage avec les composants ZeosLib. Il serait plus agréable d'utiliser les évolutions de Firebird sans être obligé de recourir à des astuces ou anciennes recettes pour traiter les requêtes d'insertion.

    A+

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

Discussions similaires

  1. ZEOS+Firebird 2.1 + UTF8 D2010
    Par SergioMaster dans le forum Bases de données
    Réponses: 53
    Dernier message: 20/07/2012, 11h54
  2. [Lazarus] Zeos + Firebird + TDBGrid et caractères étendus
    Par ddaime dans le forum Lazarus
    Réponses: 3
    Dernier message: 26/04/2011, 18h45
  3. Recupérer le résultat d'une requête sur une table Firebird
    Par defluc dans le forum Bases de données
    Réponses: 7
    Dernier message: 20/04/2007, 18h30
  4. Tutoriel Firebird - Zeos
    Par Raylemon dans le forum Bases de données
    Réponses: 9
    Dernier message: 22/12/2006, 08h51
  5. Réponses: 3
    Dernier message: 29/11/2006, 10h58

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