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 :

[Firebird] Comment créer un champ auto incrémenté ?


Sujet :

Bases de données Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut [Firebird] Comment créer un champ auto incrémenté ?
    Bonjour, j'ai trouvé un sujet qui m'interesse, mais je ne comprend pas tout...
    Ce sujet par d'auto incrementer un champ d'une table voici le lien :
    http://www.developpez.net/forums/sho...d.php?t=182982

    Je créer une table "toto" avec un champ num en integer et un autre en vachar...

    Dans l'autre sujet, William_58 dit qu'il faut créer un generateur... Je ne sais pas ou coller ce code, dois-je l'integrer dans une requete sql???
    Voici la partie du code que je ne sais pas ou mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE generator inc_num
    SET TERM !! ;
    CREATE TRIGGER inc_num_auto FOR toto
    BEFORE INSERT AS
    BEGIN
        new.num = gen_id(inc_num, 1);
    END !!
    Je ne sais pas ou mettre ce code alors pour essayé j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    IBQuery.SQL.Add('CREATE generator inc_num'+
                          'SET TERM !! ;'+
    'CREATE TRIGGER inc_num_auto FOR toto'+
    'BEFORE INSERT AS'+
    'BEGIN'+
        'new.num = gen_id(inc_num, 1);'+
    'END !!'+
    'INSERT INTO  toto (nom,...) VALUES (myname,...);');
    Quand j'éxecute, je vous raconte pas le basard...

    S'il vous plais, indiquez moi où Mettre ce code. Merci beaucoup !

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 902
    Points : 6 026
    Points
    6 026
    Par défaut
    Certainement que la FAQ Interbase te rendrait service....
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Certainement que la FAQ Interbase te rendrait service....
    Non ça ne m'aide pas du tout, car si dans delphi je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE GENERATOR GEN_MON_GENERATEUR;
    J'ai un message d'erreur à l'execution qui me dit que l'identificateur n'est pas déclaré ou quelque chose comme ça...

    Ou alors c'est qu'il faut mettre la creation du generateur hors d'une procedure?
    Moi j'avais essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Tform1.Button1.CLick...
    begin
    CREATE GENERATOR GEN_MON_GENERATEUR;
    end;
    Mais peut être qu'il faut que je place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE GENERATOR GEN_MON_GENERATEUR;
    Hors d'une procedure non????

    Merci de votre aide !!!

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Je pense que tu te mélanges les pinceaux là
    En fait:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE GENERATOR GEN_MON_GENERATEUR;
    est une requête SQL que tu dois exécuter sur ta base Ce n'est pas du code Delphi.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  5. #5
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Oui, et bien quand je le fais, j'ai un message d'erreur...

    Je n'y arrive pas...

  6. #6
    Membre habitué Avatar de Archibald29
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 112
    Points : 131
    Points
    131
    Par défaut [FireBird] et générateur
    Bonjour,

    Pour séparer (dans un premier temps) la partie "Delphi" et la partie "Base de données" tu pourrais par exemple utiliser un outil tel que IBEasy :
    http://www.marc-grange.net/telecharger.htm

    - possibilité d'exécuter directement les sql
    - possibilité de visualiser directement les générateurs créés/existant sur la base
    etc...

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par jojo86 Voir le message
    Oui, et bien quand je le fais, j'ai un message d'erreur...
    Et quel est-il ce message?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  8. #8
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    J'arrive à créer le generator mais je n'arrive pas à le créer lors de la création de la base de donnée... je le créer après avec un bouton...

    Voici le code avec lequel j'ai essayé de créer le gererator lors de la création de la base :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    var
      IBDataBase: TIBDatabase;
      IBQuery: TIBQuery;
      IBTransaction: TIBTransaction;
      cheminbase:string;
    begin
      IBDataBase := TIBDatabase.Create(nil);
      IBQuery := TIBQuery.Create(nil);
      IBTransaction := TIBTransaction.Create(nil);
      try
        IBDataBase.DatabaseName := 'D:\base\FireBird\geneprog.gdb';
        IBDataBase.SQLDialect := 3;
        IBDataBase.Params.Clear;
        IBDataBase.Params.Add('USER "SYSDBA"');
        IBDataBase.Params.Add('PASSWORD "masterkey"');
        IBDataBase.Params.Add('PAGE_SIZE 4096');
        IBDataBase.CreateDatabase;
        IBDatabase.Connected := true;
        IBTransaction.DefaultDatabase := IBDataBase;
        IBQuery.Database := IBDatabase;
        IBQuery.Transaction := IBTransaction;
        try
    
          IBQuery.SQL.Add('CREATE GENERATOR "autonum";'); 
          IBQuery.SQL.Add('create table Utilisateur(Id integer not null,Utilisateur VarChar(30),'+
                                        'Pass VarChar(50));');
          IBQuery.ExecSQL;
          IBTransaction.Commit;
    
        except
          IBTransaction.Rollback;
        end;
        IBDataBase.Connected := false;
      finally
        FreeAndNil(IBQuery);
        FreeAndNil(IBTransaction);
        FreeAndNil(IBDataBase);
      end;
    end;
    Si je fais ça avec ce code j'obtiens le message :
    "Le projet Project1.exe a provoqué une classe d'exception EIBInterBaseError avec le message 'Dynamic SQL Error SQL error code = -104
    Token unknown -line 2, column1 create.Processus stoppé...."


    Sympathique non???!!

    J'avance un peu... mais bon j'éspère que vous pourrez m'aider pour mon souci.

    Merci !

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    parce que tu as deux SQL différents , ExecSQL ne peut executer qu'une seule "phrase" à la fois , pas un script

    essaies
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          IBQuery.SQL.Add('CREATE GENERATOR "autonum"');
          IBQuery.ExecSQL;
          IBQuery.SQL.Clear;
          IBQuery.SQL.Add('create table Utilisateur(Id integer not null,Utilisateur VarChar(30),'+
                                        'Pass VarChar(50));');
          IBQuery.ExecSQL;
    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

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 147
    Points : 184
    Points
    184
    Par défaut
    bonjour

    D'abord télécharge la version gratuite de IBExpert
    Sers toi d'IBexpert pour gérer ta base
    Coté Interbase
    1. CREATION DU GENERATEUR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE GENERATOR MON_GENERATEUR;
    2.CREATION DU DECLENCHEUR OU TRIGGER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER MON_TRIGGER FOR MA_TABLE
    ACTIVE BEFORE INSERT POSITION 0
    AS
    begin
      IF (NEW.MON_CHAMP IS NULL) THEN
        NEW.MON_CHAMP= GEN_ID(MON_GENERATEUR,1);
    C'est tout pour Firebird

    Coté Delphi


    Tu met les composants habituels.
    Tu te connectes à ta base et tu ouvres l'éditeur de champ :
    tu dois impérativment mettre la propriété required à false si MON_CHAMP est NOT NULL sinon tu auras un message d'erreur de Delphi qui vérifie l'existence de donné avant de passer la main à Firebird.

    voilà tout doit marcher

    Mirmillon
    Au royaume des aveugles, les borgnes sont rois.

  11. #11
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    tu dois impérativment mettre la propriété required à false si MON_CHAMP est NOT NULL
    Je ne trouve pas cette propriété...

  12. #12
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Je voudrais créer un triger par prog, voici ce que j'ai fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    begin
    IBDataBase2.Params.Clear;
    IBDataBase2.Params.Add('User_Name=SYSDBA');
    IBDataBase2.Params.Add('Password=masterkey');
    IBQuery2.SQL.clear;
    IBQuery2.SQL.Add('CREATE TRIGGER TEST FOR Utilisateur ACTIVE BEFORE INSERT POSITION 0 AS begin IF (NEW.MON_CHAMP IS NULL) THEN NEW.Id= GEN_ID(autonum,1);');
    IBQuery2.ExecSQL;
    IBQuery2.Close;
    IBDataBase2.close;
    Quand j'execute j'ai le message "Dynamic sql error sql error code = -102"

    Ca vous dit quelque chose?

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 147
    Points : 184
    Points
    184
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Je ne trouve pas cette propriété...
    Tu vas dans l'éditeur de champ, tu sélectionnes le champ clé et tu vois la propriété.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (NEW.MON_CHAMP IS NULL) THEN NEW.Id= GEN_ID(autonum,1);
    Non c"est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (NEW.autonum IS NULL) THEN NEW.autonum = GEN_ID( nom du trigger ,1);
    Mirmillon
    Au royaume des aveugles, les borgnes sont rois.

  14. #14
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci de ton aide, mais je voudrais créer une bdd dynamique, pourquoi mon code ne fonctionne pas pour créer le triger???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IBQuery2.SQL.Add('CREATE TRIGGER TEST FOR Utilisateur ACTIVE BEFORE INSERT POSITION 0 AS begin IF (NEW.MON_CHAMP IS NULL) THEN NEW.Id= GEN_ID(autonum,1);');
    IBQuery2.ExecSQL;
    Personne ne créer de triger par programation???

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 147
    Points : 184
    Points
    184
    Par défaut
    Bonjour,

    Pour que ton code marche, il faut que le composant IBquery soit fermé lorsque tu ajoutes des lignes SQL. J'ai essayé d'ajouter un trigger via un IBQuery et Tbouton et ça marche. Je te montre le code peut être en le comparant avec le tien tu trouveras ton problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    IBQuery1.Active:= False;
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add('ICI TON CODE');
    IBQuery1.ExecSQL;
    end;
    Mirmillon
    Au royaume des aveugles, les borgnes sont rois.

  16. #16
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Je crois que je viens de trouver le soucis...

    J'ai juste mis un TIBDatabase et dans Database name, j'ai été chercher ma base de donnée, je passe la propriétée Connected à "True" je rentre mon nom d'utilisateur et mon mot de pass et là j'ai un message d'erreur :"Unavailable database"...

    J'en conclu que delphi ne peut se connecter à ma base de donnée... j'utilise firebird embeded, y à t'il une manipulation que je n'ai pas faite lors de l'installation?

    C'est bizard, car la base de donnée est corectement créer... et avec IBEasy+, j'arrive à l'ouvrire, et la modifier etc...

    Merci de votre aide !

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 147
    Points : 184
    Points
    184
    Par défaut
    bonjour,

    je n'utilise pas firebird Embedded. Peut être sur le forum de Firebird tu aurais la solution.

    Mirmillon
    Au royaume des aveugles, les borgnes sont rois.

  18. #18
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Nikel, j'ai trouvé !!!!!

    Voici mon erreur... toute bete, voici la requete que j'envoyais et qui ne fonctionait pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Query2.SQL.Add('CREATE TRIGGER EEEEEEEEEE FOR UTILISATEUR ACTIVE '
    +'BEFORE INSERT POSITION 0 AS begin IF (NEW.Id IS NULL) THEN '+
    'NEW.Id= GEN_ID(AUTONUM,1);');
    IBQuery2.ExecSQL;
    Et voici la requete qui fonctione :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Query2.SQL.Add('CREATE TRIGGER EEEEEEEEEE FOR UTILISATEUR ACTIVE '+
    'BEFORE INSERT POSITION 0 AS begin IF (NEW.Id IS NULL) THEN '+
    NEW.Id= GEN_ID(AUTONUM,1);END;');
    IBQuery2.ExecSQL;
    Vous ne remarquez rien????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Query2.SQL.Add('CREATE TRIGGER EEEEEEEEEE FOR UTILISATEUR ACTIVE '+
    'BEFORE INSERT POSITION 0 AS begin IF (NEW.Id IS NULL) THEN '+
    'NEW.Id= GEN_ID(AUTONUM,1);END;');
    Tout ça pour un END; Pffffff !!!

    Ouf, enfin !!!

    Merci de vos renseignement !!!

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

Discussions similaires

  1. comment remettre à 1 un champ auto-incrémental
    Par jakol dans le forum Bases de données
    Réponses: 5
    Dernier message: 16/08/2010, 06h00
  2. Créer un champ Auto incrémenté en alphanumérique
    Par convertch dans le forum Modélisation
    Réponses: 1
    Dernier message: 03/06/2008, 12h13
  3. Comment créer un champ auto increment avec netbeans
    Par une_tite_question dans le forum NetBeans
    Réponses: 4
    Dernier message: 25/04/2008, 17h17
  4. Comment obtenir un champs auto incrémenté dans une table DBase IV ?
    Par souminet dans le forum Bases de données
    Réponses: 1
    Dernier message: 11/12/2007, 13h55
  5. Réponses: 6
    Dernier message: 18/11/2007, 17h30

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