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 :

[Delphi 7][Dbase4] Comment récupérer le DataType des champs d'une table ?


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut [Delphi 7][Dbase4] Comment récupérer le DataType des champs d'une table ?
    Bonjour à tous.
    J'ai bien cherché, pas trouvé, donc je craque et fais à vous (d'avance merci).
    Quand je crée une structure de table, je fais appel à AddFieldDef. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ....
    with AddFieldDef do
       begin
          Name := 'Espece';
          DataType := ftString;
          Size := 25;
       end;
    ....
    Pas de problème.
    En revanche, je cherche la fonction réciproque, c'est à dire le moyen de connaître les propriétés des champs d'une table. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ....
    ShowMessage(Table1.Fields[0].FieldName); // là, ça marche
    ShowMessage(Table1.Fields[0].DataType); // là, ça ne marche pas : TDataType <> TString
    ShowMessage(IntToStr(Table1.Fields[0].DataSize)); // là, ça marche 
    ....
    En fait, il me trouver un remplaçant à mon invention : TypeToStr

    Amicalement.
    Alain
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    Peut-être dois-je tester tous les types existants de la manière suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    if Table1.Fields[i].DataType=ftString then ShowMessage('String');
    if Table1.Fields[i].DataType=ftInteger then ShowMessage('Integer');
    if Table1.Fields[i].DataType=ftDate then ShowMessage('Date');
    ...
    En fait, je cherche donc une méthode plus élégante que celle que je propose ci-dessus.
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  3. #3
    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

    Citation Envoyé par alainvh Voir le message
    En fait, je cherche donc une méthode plus élégante que celle que je propose ci-dessus.
    Alors peut-être comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    uses TypInfo;
     
    // ...
     
    ShowMessage(GetEnumName(TypeInfo(TFieldType), Ord(Table1.Fields[i].DataType)));
    @+ Claudius

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    Bonjour Claudius,
    Une fois de plus merci, et surtout bravo : ça, c'est du code, et non de la bidouille (il n'y a que ça que je sache faire !).
    Si je comprends bien, GetEnumName (dont je ne soupçonnais pas l'existence) va chercher dans TFieldType le nom (ex : ftString) qui correspond au code ordinal du Datatype du champ i (TFieldType serait donc un genre de tableau associant à chaque type un code numérique, par exemple : ftString->0, ftInteger->1,...).
    J'en ai encore, du chemin à parcourir, n'est-ce pas ?
    Amicalement,
    Alain
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

  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

    TFieldType est un type énuméré (ou énumération) qui définit un ensemble ordonné de valeurs, en énumérant les identificateurs désignant ces valeurs. Les valeurs n'ont pas de signification propre. (extrait de l'aide de Delphi).

    TFieldType étant définit ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ...);
    ftUnknown possède la valeur ordinale 0, ftString 1, etc...

    GetEnumName renvoit donc le nom correspondant à la valeur ordinale que tu lui transmet.
    Il existe la fonction inverse GetEnumValue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     I := GetEnumValue(TypeInfo(TFieldType), 'ftString');
     // I est égal à 1
    Tout ceci fait appel aux RTTI. sjrd ou Laurent Dardenne (je ne sais plus) a écrit un tuto très complet à ce sujet.

    @+ Claudius

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 176
    Points : 123
    Points
    123
    Par défaut
    Merci pour la leçon, Claudius.
    Bonne journée.

    A la prochaine,
    Alain
    Ce qui est simple et évident pour soi-même ne l'est pas forcément pour les autres... et réciproquement !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/09/2009, 03h03
  2. comment obtenir la liste des champs d'une table
    Par richard038 dans le forum SQL
    Réponses: 4
    Dernier message: 13/02/2009, 18h28
  3. Réponses: 4
    Dernier message: 05/12/2007, 19h06
  4. Récupérer la liste des champs d'une table
    Par mister3957 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 17/04/2007, 14h56
  5. récupérer le nom des champs d'une table d'une BDD-page web
    Par mathieu_r dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 09/06/2005, 14h02

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