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 :

[IB/DBGrid] Clé primaire


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut [IB/DBGrid] Clé primaire
    Salut tout le monde,

    Je suis en train de créer une application sous Delphi utilisant une base de données "Interbase". J'ai choisi ce type de BD afin d'avoir un fichier unique et non pas un fichier pour chaque table.

    Une de mes tables se nomme "typesDocument" et comporte des types de document. J'ai créé une fiche avec une simple "DBGrid" afin que l'utilisateur puisse ajouter, modifier et supprimer des types de document de façon très simple.

    Voici le script de création 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
      With BD_typesDocument Do
      Begin
        Transaction.Active:=true;
        With FieldDefs Do
        Begin
          Clear;
          With AddFieldDef Do Begin
            Name:='ID'; DataType:=ftInteger; Required:=true;
          End;
          With AddFieldDef Do Begin
            Name:='LIBELLE'; DataType:=ftString; Size:=155;
          End;
        End;
        With IndexDefs Do
        Begin
          Clear;
          With AddIndexDef Do Begin
            Name:=''; Fields:='ID'; Options:=[ixPrimary];
          End;
        End;
        CreateTable;
      End;
      BD_SQL.Transaction.Active:=true;
      With BD_SQL.SQL do begin
        Clear;
        Add('CREATE GENERATOR TYPESDOCUMENT_GenId;');
      end;
      BD_SQL.ExecQuery;
      With BD_SQL.SQL do begin
        Clear;
        Add('CREATE TRIGGER TRIG_TYPESDOCUMENT_GenId FOR TYPESDOCUMENT');
        Add('ACTIVE BEFORE INSERT AS');
        Add('BEGIN');
        Add('  IF ( NEW.ID IS NULL ) THEN');
        Add('    NEW.ID = GEN_ID(TYPESDOCUMENT_GenId,1);');
        Add('END');
      end;
      BD_SQL.ExecQuery;
    Sur mon DBGrid je masque la première colonne afin que l'utilisateur n'ai a saisir que l'intitulé du type.

    Mon problème est que :

    1. Utilisé ainsi, lorsque l'utilisateur saisir une ligne sur le DBGride et la valide, le programme indique que le champ ID est obligatoire
    2. Si je supprime "Required:=true" et que je ne créé pas de clé primaire : le programme ne me demande rien et créé bien mon enregistrement en affectant bien l'ID comme je le veux


    Donc le second cas correspond à ce que je veux faire. Le seul HIC c'est que dans ma table je ne défini pas de clé primaire et cela me gène !

    Comment puis-je faire pour à la fois définir une clé primaire, et en même temps mettre une valeur par défaut (NULL) à ma colonne masquée ?

    Merci pour toute aide

  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
    Ne soit pas gêné de ne pas renseigner la PK, puisque c'est le trigger qui s'en charge !

    De fait, une PK auto-incrémentée ne doit et ne peut pas porter de valeur fonctionnelle. Un auto-incrément sert uniquement à assurer l'unicité.
    Ici ça semble bien être le cas

    Donc, tout va bien
    "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 régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Bon et bien : plus de gêne alors !

    Un grand merci à toi et à tes explications

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

Discussions similaires

  1. DBLookupComboBox dans DBGrid
    Par KThrax dans le forum Bases de données
    Réponses: 7
    Dernier message: 24/08/2004, 15h18
  2. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18
  3. Couleur des lignes dans DBGrid
    Par eddie dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/06/2002, 18h15
  4. associer une base de données(access) a un dbgrid
    Par ange1708 dans le forum MFC
    Réponses: 3
    Dernier message: 11/06/2002, 12h18
  5. [Kylix] Contrôle DBGrid
    Par KThrax dans le forum EDI
    Réponses: 1
    Dernier message: 10/05/2002, 14h18

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