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 :

champ auto incrément sous interbase


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    agent de fisc(les impots)
    Inscrit en
    Juillet 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : agent de fisc(les impots)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 427
    Points : 111
    Points
    111
    Par défaut champ auto incrément sous interbase
    salut a tous
    j’utilise delphi7 est interbase
    pour créer un champ de type entier sous interbase en fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    le du champ integer
    j'aimerais creer un champ de type auto incrément.
    est se que vous pouvez m'aider svp
    merci.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par kroma23 Voir le message
    salut a tous
    j’utilise delphi7 est interbase
    pour créer un champ de type entier sous interbase en fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    le du champ integer
    j'aimerais creer un champ de type auto incrément.
    est se que vous pouvez m'aider svp
    merci.
    ça n'existe pas sous Interbase qui propose des Generator pour obtenir un nouveau numéro unique.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    un simple tour dans la FAQ Interbase/Firebird donne la réponse à beaucoup de vos questons sur les générateurs (ou champ auto incrément) .
    De fait pour avoir un réel auto-incrément il faut conjuguer un Générateur et un Trigger

    Démonstration rapide (génération du trigger fait par Flamerobin)
    Code SQL : 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
     
     
    CREATE TABLE TEST
    (
      NUMERO Numeric(15,0) NOT NULL, -- je vais me servir de ce champ en auto incrément
      NOM Varchar(30)
    );
     
    CREATE GENERATOR GEN_TEST_ID;
     
     
    /******************** TRIGGERS ********************/
     
    SET TERM ^ ;
    CREATE TRIGGER TEST_BI FOR TEST ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.NUMERO IS NULL) THEN
        NEW.NUMERO = GEN_ID(GEN_TEST_ID, 1);    -- Numéro=null auto incrément "normal"
      ELSE
      BEGIN     -- Dans le cas contraire , si le numero est supérieur , mémorise la nouvelle valeur
        tmp = GEN_ID(GEN_TEST_ID, 0);
        if (tmp < new.NUMERO) then
          tmp = GEN_ID(GEN_TEST_ID, new.NUMERO-tmp);
      END
    END^
    SET TERM ; ^
    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

  4. #4
    Membre régulier
    Homme Profil pro
    agent de fisc(les impots)
    Inscrit en
    Juillet 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : agent de fisc(les impots)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 427
    Points : 111
    Points
    111
    Par défaut
    re,
    je m’excuse mais je vais expliquer mon problème
    jai une table etudiant(num,nom,prenom,adresse)
    a l'insertion des donnée insert tout sauf le numéro je le laisse null, est se qu'il est possible de parcourir cette table et remplir le champ numéro
    par un numéro séquentiel jusque le dernier enregistrement.
    jai essai avec ca mais sa ne marche pas
    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
    with ibquery1 do
    begin
    close;
    sql.clear;
    sql.add('select * from etudiant')
    open;
    end;
     
    i:=1:
    ibquery1.first;
    while not ibquery1.eof do
    begin
    ibquery1.edit;
    ibquery1.fieldvalues['num'].asinteger:=i;
    ibquery1.post
    i:=i+1
    ibquery1.next
    end;
    en exécution un message d'erreur qui me dit que en peut pas modifier sur un ensemble de donnée fermer
    jai rien compris
    merci

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Votre code doit être corrigé

    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
    with ibquery1 do
    begin
    close;
    sql.clear;
    sql.add('select * from etudiant')
    open;
    //end;  <- Ce end; est en trop
     
    i:=1:
    //ibquery1.first; <- Ce first  est inutile après un open
    while not ibquery1.eof do
    begin
    ibquery1.edit;
    ibquery1.fieldvalues['num'].asinteger:=i;
    ibquery1.post
    i:=i+1
    ibquery1.next
    end;
    IBQuery cela veut dire que vous utilisez les IBXXXXX , selon mes souvenirs il faut également un IBUPdateSQL dans ce cas
    dans cet IBUpdateSQL , le UPDATE devrait avoir cette forme

    UPDATE ETUDIANT SET NUM=:NUM WHERE <CLE1=OLD.CLE1 <AND CLE2=OLD.CLE2>>
    où clé est l'ensemble des champs servant de clé , bien sur , si vous n'avez pas indexé par clé unique la table , cela va se compliquer !
    heureusement il existe un champ caché RDB$DB_KEY (à vérifier plus finement avec interbase, via iBConsole par exemple)
    il faudrait dans ce cas modifier votre SQL
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *,RDB$KEY FROM ETUDIANT
    pour pouvoir faire le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE ETUDIANT SET NUM=:NUM WHERE RDB$KEY=OLD.RDB$KEY
    Donc :
    • le plus simple dans votre cas serait de passer par un IBTable
    • le plus sur dans le cas d'un programme multi-utilisateur serait en plus d'utiliser une transaction
    • le plus efficace , de récréer la table avec un générateur et un trigger et des contraintes (clé primaire, index)



    il doit y avoir également un moyen de faire cela (du moins est-ce possible avec Firebird le frère d'interbase) directement via SQL ou par procédure
    mais ces dernières possibilités dépassent le cadre de Delphi , et auraient plus leur place dans le forum SGBD&SQL\Autres\Interbase et en donnant la description exacte de la table (tous les champs , les index etc..
    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

Discussions similaires

  1. [EJB2.1 Entity] [Débutant] Champs auto-incrémenté (identity)et EJB
    Par Houbbba dans le forum Java EE
    Réponses: 9
    Dernier message: 04/04/2006, 19h15
  2. champ auto incrémenté
    Par Kerod dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/09/2005, 17h29
  3. [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
  4. [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
  5. Pb d'auto incrémentation sous interbase !!!
    Par le.clown dans le forum InterBase
    Réponses: 2
    Dernier message: 26/02/2004, 14h11

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