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 :

Gérer les compteurs Auto Incrémentés sous firebird


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut Gérer les compteurs Auto Incrémentés sous firebird
    Bonjour à vous les amis,
    Encore merci pour le grand boulot et les précieuses aides que vous apportez à la communauté des développeurs. Je suis tombé sur l'article de Sylvain James et Kloo (Pascal Barnouin) intitulé : « Gérer les Compteurs Auto-Incrémentés avec Interbase »,

    J’ai reussi à à installer le composant et créer le trigger before insert de la Table. J’ai suivi la procédure malheureusement j’ai des problèmes car au lancement, j’ai ces messages d’erreur :

    [Erreur] AjoutBeneficiaireFrm.pas(75): Identificateur non déclaré : 'GetCpt'
    [Erreur] AjoutBeneficiaireFrm.pas(79): Identificateur non déclaré : 'Gen'
    [Erreur] AjoutBeneficiaireFrm.pas(80): Identificateur non déclaré : 'Result'
    [Erreur fatale] PrevoyanceExpert.dpr(57): Impossible de compiler l'unité utilisée 'Forms\AjoutBeneficiaireFrm.pas'
    Je vous serai gré de bien vouloir me fournir un code exemple qui puisse me permettre de mieux comprendre cette méthode.

    J'utilise D7/Firebird

    Cordialement à vous
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  2. #2
    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 ,

    il te manque tout simplement la déclaration , soit en private soit public
    de la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type TForm1 = class(TForm)
     ..
     ..
    private
    function GetCpt(Gen:String):LongInt;
    ..
    public 
    ..
    end;
    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 régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    J'ai en effet effectué la déclaration comme recommandé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function TForm1.GetCpt(Gen:String):LongInt;
          begin
            with DataModule1.IBGenerator1 do
            begin
              GeneratorName:=Gen;
              Result:=Increment;
            end;
        end;
    mais j'ai toujours l'erreur
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  4. #4
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    La situation se complique. Voici mon code
    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
     
    type
        TFrmAjoutBeneficiaire = class(TForm)
    ...
    ...
     private
        { Déclarations privées }
      function TFrmAjoutBeneficiaire.GetCpt(Gen:String):LongInt;
         begin
            with DataModule1.IBGenerator1 do
           begin
              GeneratorName:=Gen;
              Result:=Increment;
            end;
        end;  
     
      public
        { Déclarations publiques }
     
      end;
    J'ai toujours les erreurs suivantes:
    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
    [Erreur] AjoutBeneficiaireFrm.pas(63): Identificateur non déclaré : 'TFrmAjoutBeneficiaire'
    [Erreur] AjoutBeneficiaireFrm.pas(64): 'END' attendu(e) mais 'BEGIN' trouvé(e)
    [Erreur] AjoutBeneficiaireFrm.pas(65): Identificateur non déclaré : 'DataModule1'
    [Erreur] AjoutBeneficiaireFrm.pas(65): 'DO' attendu(e) mais identificateur 'IBGenerator1' trouvé(e)
    [Erreur] AjoutBeneficiaireFrm.pas(67): Identificateur non déclaré : 'GeneratorName'
    [Erreur] AjoutBeneficiaireFrm.pas(67): Identificateur non déclaré : 'Gen'
    [Erreur] AjoutBeneficiaireFrm.pas(68): Identificateur non déclaré : 'Result'
    [Erreur] AjoutBeneficiaireFrm.pas(72): Déclaration attendu(e) mais identificateur 'public' trouvé(e)
    [Erreur] AjoutBeneficiaireFrm.pas(75): 'IMPLEMENTATION' attendu(e) mais ';' trouvé(e)
    [Erreur] AjoutBeneficiaireFrm.pas(80): '.' attendu(e) mais 'IMPLEMENTATION' trouvé(e)
    [Erreur] AjoutBeneficiaireFrm.pas(52): Déclaration forward ou external non satisfaite : 'TFrmAjoutBeneficiaire.BitBtn2Click'
    [Erreur] AjoutBeneficiaireFrm.pas(53): Déclaration forward ou external non satisfaite : 'TFrmAjoutBeneficiaire.RemplirExecute'
    [Erreur] AjoutBeneficiaireFrm.pas(54): Déclaration forward ou external non satisfaite : 'TFrmAjoutBeneficiaire.FormCreate'
    [Erreur] AjoutBeneficiaireFrm.pas(55): Déclaration forward ou external non satisfaite : 'TFrmAjoutBeneficiaire.TypeBeneClick'
    [Erreur] AjoutBeneficiaireFrm.pas(56): Déclaration forward ou external non satisfaite : 'TFrmAjoutBeneficiaire.FormShow'
    [Erreur] AjoutBeneficiaireFrm.pas(57): Déclaration forward ou external non satisfaite : 'TFrmAjoutBeneficiaire.VerifExecute'
    [Erreur] AjoutBeneficiaireFrm.pas(58): Déclaration forward ou external non satisfaite : 'TFrmAjoutBeneficiaire.BitBtn1Click'
    [Erreur] AjoutBeneficiaireFrm.pas(59): Déclaration forward ou external non satisfaite : 'TFrmAjoutBeneficiaire.SpeedButton1Click'
    [Conseil] AjoutBeneficiaireFrm.pas(63): Le symbole privé 'TFrmAjoutBeneficiaire' est déclaré mais jamais utilisé
    [Erreur fatale] PrevoyanceExpert.dpr(57): Impossible de compiler l'unité utilisée 'Forms\AjoutBeneficiaireFrm.pas'
    Je suis obligé de mettre en commentaire la fonction pour que tout redevienne normale sauf que je n'ai pas toujours réussi à mettre en place ce que je souhaite ''Compteur auto-incrément"

    HELP ME PLEASE
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Sergio avait vu juste, ta fonction est mal déclarée.

    Dans la partie interface au niveau de ta classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    interface
     
    type
      TFrmAjoutBeneficiaire = class(TForm)
    ...
    ...
      private
        { Déclarations privées }
        function GetCpt(Gen: String): LongInt;
    ...
      end;
    puis le code dans la partie implémentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    implementation
     
    { TFrmAjoutBeneficiaire }
     
    function TFrmAjoutBeneficiaire.GetCpt(Gen: String): LongInt;
    begin
      with DataModule1.IBGenerator1 do
      begin
        GeneratorName := Gen;
        Result := Increment;
      end;
    end;
    @+ Claudius

  6. #6
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Le programme s'exécute mais avec ceci :
    [Conseil] AjoutBeneficiaireFrm.pas(66): Le symbole privé 'GetCpt' est déclaré mais jamais utilisé
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  7. #7
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Voici le code pour la procédure de l'insertion du compteur :
    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
    procedure TFrmAjoutBeneficiaire.CompteurExecute(Sender: TObject);
    var LeCpt:LongInt;
    begin
        with IBQuery1 do
          begin
            SQL.Text:='INSERT INTO BENEFICIAIRE (CPT_BENEFICIAIRE,COMPTEUR) VALUES 5:LeCpt,:COMPTEUR);';
            LeCpt:=GetCpt('G$_COMPTEUR');// Nom du generateur pour MATABLE
            ParamByName('COMPTEUR').AsString:='Ma valeur';
            try
          ExecSQL;
        except
              ShowMessage('Problème lors de l''insertion dans la TABLE');
        end;
       end;
     
    end;
    C'est le code de kloo que j'ai modifié. deux petites préoccupations :
    1.) au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ParamByName('COMPTEUR').AsString:='Ma valeur';
    Que faut-il mettre pour 'Ma valeur' ?
    2.) Au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     LeCpt:=GetCpt('G$_COMPTEUR');
    est que le nom ici c'est celui qui est déclaré dans la fonction ou celui de la propriété generatorName du composant IBGenerator ?
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  8. #8
    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
    1.) au niveau de :
    ParamByName('COMPTEUR').AsString:='Ma valeur';
    Que faut-il mettre pour 'Ma valeur' ?
    'Ma valeur' est égale à inttostr(Lecpt)
    pas très joli quand même de devoir transformer en string enfin c'est ta base

    2.) Au niveau de
    LeCpt:=GetCpt('G$_COMPTEUR');
    est que le nom ici c'est celui qui est déclaré dans la fonction ou celui de la propriété generatorName du composant IBGenerator ?
    le nom du générateur bien sur
    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

  9. #9
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    J'ai effectué les corrections, le programme se lance mais un problème lors de l'enregistrement. J'ai ce message de la base de données :



    J'ai remis à zéro le compteur mais rien n'y fait.
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  10. #10
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Cela veut dire que ta requête insert est bancale. Et plus précisément que le nombre de champs (INSERT INTO (F1, F2, ...)) n'est pas égal au nombre de valeurs (VALUES(V1, V2, ...)).

    Vérifie ta requête.

    @+ Claudius

  11. #11
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Voici la première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL.Text:='INSERT INTO BENEFICIAIRE (CPT_BENEFICIAIRE,COMPTEUR) VALUES (:LeCpt,:COMPTEUR);';
    Après modification voici ce que cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL.Text:='INSERT INTO BENEFICIAIRE (COMPTEUR) VALUES (:LeCpt,:COMPTEUR);';
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  12. #12
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    J'ai ajouté un champs CPT_BENEFICIAIRE à ma table et modifier le code sql ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO BENEFICIAIRE (CPT_BENEFICIAIRE,COMPTEUR) VALUES (:LeCpt,:COMPTEUR);
    . La sql me signale une autre erreur de ce type
    validation error for column CODEBENE, value "***null***"
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  13. #13
    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
    reprenons depuis le début
    1° fourni la description exacte de ta table
    2° le code
    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
     
    procedure TFrmAjoutBeneficiaire.CompteurExecute(Sender: TObject);
    var LeCpt:LongInt;
    begin
        with IBQuery1 do
          begin
            SQL.Text:='INSERT INTO BENEFICIAIRE (  CPT_BENEFICIAIRE,COMPTEUR) VALUES (:LeCpt,:COMPTEUR);';
            LeCpt:=GetCpt('G$_COMPTEUR');// Nom du generateur pour MATABLE
            ParamByName('COMPTEUR').AsString:='Ma valeur';
            try
          ExecSQL;
        except
              ShowMessage('Problème lors de l''insertion dans la TABLE');
        end;
       end;
    Quel est la différence entre lecpt et compteur ??????
    ou est l'assignation du paramètre lecpt de la requete ??
    c'est à dire : Parambyname('lecpt').Value:= xxxx;

    et enfin
    La sql me signale une autre erreur de ce type
    validation error for column CODEBENE, value "***null***"
    Si on pouvait deviner la structure de ta table on te répondrait
    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

  14. #14
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Quel est la différence entre lecpt et compteur ??????
    A mon avis, c'est la même chose. C'était pour règler le problème sql que j'ai créer ce paramètre. J'ai oublié l'assignation Je cherche à comprendre l'intérêt.
    Si on pouvait deviner la structure de ta table on te répondrait
    En fait voila, je vous explique j'ai une table avec plusieurs champs dont un nommé COMPTEUR de type auto incrément (INTEGER). j'essaie de mettre en place un code d'auto incrémentation avec la méthode de Kloo pour remplir le champs COMPTEUR à chaque enregistrement. Voila, J'espère que je me suis bien expliqué. Je crois que je patauge un peu Quoi. Un coup de main de votre part me sera d'un grand secours.
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  15. #15
    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
    Donnes la structure de ta table , complète ça doit pas être compliqué et certainement pas confidentiel .

    Ppour ce qui est de CodeBene , il est évident que tu as du l'indiquer NOT NULL
    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

  16. #16
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Marci SergioMaster !
    Voici le code sql de ma table :
    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
    /* Table: BENEFICIAIRE, Owner: SYSDBA */
    CREATE TABLE "BENEFICIAIRE"
    (
      "COMPTEUR"	INTEGER NOT NULL,
      "NOM"	"NOM$",
      "PRENOMS"	"PRENOMS$",
      "DTNAISS"	"DTNAISS$",
      "LIEUNAISS"	"LIEUNAISS$",
      "CODE_AP"	"CODE_AP$",
      "CODE_FAMILLE"	"CODE_FAMILLE$",
      "PROFESSION"	"PROFESSION$",
      "TYPE_BENE"	"TYPE_BENE$",
      "SEXE"	"SEXE$",
      "DT_ENREGISTRE"	"DT_ENREGISTRE$",
      "H_ENREGISTRE"	"H_ENREGISTRE$",
      "NUM_CARTE_BENE"	"NUM_CARTE_BENE$",
      "PHOTO"	"PHOTO$",
      "VIE"	"VIE$",
      "CODEBENE"	"CODEBENE$",
     PRIMARY KEY ("COMPTEUR")
    );
    Un exemple me sortira des pétrins car c'est une appli qui fonctionnera en réseau voici pourquoi j'ai décidé de mettre en place le compteur auto incrément.
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  17. #17
    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
    ça s'arrange pas car apparemment tous les champs sauf le compteur sont en domaines ! et qu'aucune définition de domaine n'est donnée.

    Enfin , autre question , pourquoi programmer le compteur alors que les triggers peuvent se charger de le mettre en place ? cette question me titillait vraiment beaucoup

    le trigger indiqué par kloo fait ça tout seul pas besoin de programmer en delphi quelque chose fait par firebird
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER BEFORE_INSERT_MATABLE FOR MATABLE
    ACTIVE BEFORE INSERT AS
    BEGIN
    IF ( NEW.CPT_MATABLE IS NULL ) THEN
    BEGIN
    NEW.CPT_MATABLE=GEN_ID(GEN_MATABLE,1);
    END
    toutes les questions que tu te poses sur les générateurs sont ici
    la seule chose qui me ferait utiliser la 'méthode kloo' serait de vouloir voir le compteur et de pouvoir à l'occasion le modifier (ce qui n'est vraiment pas l'idée que je me fait d'un champ auto incrémenté )
    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

  18. #18
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    J'ai peut-être pas très bien compris cette méthode. Est-ce possible de me un tout petit exemple de programme pour me guider ?
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  19. #19
    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
    une explication rapide oui, un tout petit programme non !

    Pour la BDD
    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
     
    CREATE GENERATOR GEN_NUMCLIENT;
    SET GENERATOR GEN_NUMCLIENT TO 0;
     
    CREATE TABLE CLIENTS(
     NUM INTEGER NOT NULL,
     NOM VARCHAR(30),
     
     CONTRAINT PK_CLIENT PRIMARY KEY(NUM)
    );
     
    CREATE TRIGGER BEFORE_INSERT_CLIENT FOR CLIENTS
    ACTIVE BEFORE INSERT AS
    BEGIN
    IF ( NEW.NUM IS NULL ) THEN
    BEGIN
    NEW.NUM=GEN_ID(GEN_NUMCLIENT,1);
    END

    soit une forme avec
    une connexion à la BDD, une Query
    une zone Edit , par exemple NOMCLIENT
    un bouton Plus;

    voici la query pour ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure Form1.PlusClick(Sender : TObject);
    begin
    Query.SQL.Text:='INSERT INTO CLIENT (NOM) VALUES (:NOM)';
    Query.ParamByName('NOM').asString:=Nomclient.Text;
    Query.execSQL;
    end;
    et voilà , non testé mais de mémoire ça doit fonctionner sans soucis
    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

  20. #20
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    Encore merci SergioMaster,
    Avec l'explication que tu m'as donnée j'ai mis en place un petit programme et fonctionne. voici la procédure que j'utilise
    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
    procedure TFrmAjoutBeneficiaire.BitBtn1Click(Sender: TObject);
    var
        dh : TDateTime;
    begin
          Verif.Execute;
    //La table est positionnée en mode ajout
          DataModule1.IBTableBeneficiaire.Append;
    //La table est positionnée en mode edition
          DataModule1.IBTableBeneficiaire.Edit;
         // Compteur.Execute;//
    //Recupération des données pour les positionner dans la table des bénéficiaires
          //DataModule1.IBTableBeneficiaire.FieldByName('COMPTEUR').Value:=OrdreBene.Caption;
          DataModule1.IBTableBeneficiaire.FieldByName('NOM').Value:=EditNom.Text;
          DataModule1.IBTableBeneficiaire.FieldByName('PRENOMS').Value:=EditPrenoms.Text;
          DataModule1.IBTableBeneficiaire.FieldByName('DTNAISS').Value:=MaskEditDate.Text;
          DataModule1.IBTableBeneficiaire.FieldByName('LIEUNAISS').Value:=EditLieuNaiss.Text;
          DataModule1.IBTableBeneficiaire.FieldByName('SEXE').Value:=ComboSexe.Text;
          DataModule1.IBTableBeneficiaire.FieldByName('PROFESSION').Value:=EditProfession.Text;
          DataModule1.IBTableBeneficiaire.FieldByName('TYPE_BENE').Value:=TypeBene.Text;
    //Pour déterminer si l'individu est en vie
          DataModule1.IBTableBeneficiaire.FieldByName('VIE').Value:='O';
    //Enrégistrement des index générées
          DataModule1.IBTableBeneficiaire.FieldByName('CODE_AP').Value:=CodeAP.Caption;
          DataModule1.IBTableBeneficiaire.FieldByName('CODEBENE').Value:=CodeBene.Caption;
          DataModule1.IBTableBeneficiaire.FieldByName('NUM_CARTE_BENE').Value:=NumCarte.Caption;
          DataModule1.IBTableBeneficiaire.FieldByName('CODE_FAMILLE').Value:=CodeFamille.Caption;      
    //Date d'enrégistrement
          dh := Now;
          DataModule1.IBTableBeneficiaire.FieldByName('DT_ENREGISTRE').Value:=DateToStr(dh);
          DataModule1.IBTableBeneficiaire.FieldByName('H_ENREGISTRE').Value:=DateToStr(dh);
    //  Enrégistrement d'image dans le champs Blob
          DataModule1.IBTableBeneficiaire.FieldByName('PHOTO').Assign(Image1.Picture.Graphic);
     
    if (DataModule1.IBTableBeneficiaire.State = dsInsert)  then
     
    //Enrégistre les données dans la table
          DataModule1.IBTableBeneficiaire.Post;
           MessageBox(Handle,'Enrégistrement OK',
              'Enrégistrement',MB_OK or MB_ICONINFORMATION);      
    end;
    Ce sont de composant base de données. Comment l'adapter ? faut-il que je passe désormais par le code sql ?
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

Discussions similaires

  1. Gérer les ACL de subversion sous le protocole file://
    Par paissad dans le forum Administration système
    Réponses: 0
    Dernier message: 20/04/2011, 10h25
  2. gérer un champ auto-incrément ?
    Par SmileSoft dans le forum C++Builder
    Réponses: 9
    Dernier message: 01/01/2010, 22h19
  3. [FB 2.0] les USERS et ROLES sous FireBird 2.0
    Par juniorAl dans le forum Installation
    Réponses: 2
    Dernier message: 24/10/2008, 23h12
  4. Importer des données et compteur auto incrémenté
    Par lutecefalco dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/04/2007, 10h27
  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