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

  1. #1
    Nouveau membre du Club
    Inscrit en
    décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : décembre 2010
    Messages : 30
    Points : 27
    Points
    27

    Par défaut Remplacer dans un DbGrid un ID d'une table par son équivalent string d'une autre table

    Bonjour à tous,
    Débutant en base de données, je vais peut-être poser une question triviale.

    J'ai une base de données comportant plusieurs tables.
    Dans la table 1 "OPERATION" , j'ai un champ ID_CATEGORIE (int)
    Dans la table 2 "CATEGORIE", j'ai deux champs ID_CATEGORIE (int) et NOM_CATEGORIE (string).

    J'affiche sans problème dans un DBGRID tous les champs de ma table 1 "OPERATION", mais je voudrais remplacer dans la colonne "ID_CATEGORIE" la valeur (integer) par son équivalent (string) contenue dans NOM_CATEGORIE de la table 2 "CATEGORIE".

    Est-ce possible sans passer par un autre affichage, par exemple avec un stringGrid ?

    Merci de vos réponses.

    Jean-Louis

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    9 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 9 485
    Points : 23 026
    Points
    23 026
    Billets dans le blog
    13

    Par défaut

    Bonsoir,
    Citation Envoyé par illuch Voir le message
    Est-ce possible sans passer par un autre affichage, par exemple avec un stringGrid ?
    Oui, mais pas par un StringGrid c'est un travail sur la source de données qu'il faut faire.

    Deux solutions : la meilleure utiliser une Requête (Query) comme source de données, moins bonne ajouter un champ (lookup) à la table
    1- La requête : SELECT O.*,C.NOM_CATEGORIE FROM OPERATION O JOIN CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE ;
    le O.* sera remplacé par O.colonne(s) voulue(s) de la table OPERATION
    inconvénient, si la requête doit être en mise à jour il faudra ajouter un UpdateSQL

    2- il suffit de déclarer tous les champs de la table1 puis de rajouter un champ de type lookup lié à table 2 :moinser:

    P.S.
    il aurait été judicieux d'indiquer la version de Delphi et les Composants de connexion et le SGBD utilisé
    une contrainte de clé étrangére (FOREIGN KEY) entre OPERATION et CATEGORIE améliorera sensiblement la vitesse
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Berlin, Tokyo) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Nouveau membre du Club
    Inscrit en
    décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : décembre 2010
    Messages : 30
    Points : 27
    Points
    27

    Par défaut

    Merci de la réponse

    Je vais étudier tout ça

    J'utilise Delphi XE2 avec interbase et les composants IBQuery, IBDatabase, IBTable ...

  4. #4
    Nouveau membre du Club
    Inscrit en
    décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : décembre 2010
    Messages : 30
    Points : 27
    Points
    27

    Par défaut

    =le O.* sera remplacé par O.colonne(s) voulue(s) de la table OPERATION
    voilà ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     Form3.IBQuery1.Close;      // Close the query,
     Form3.IBQuery1.SQL.Clear;
     Form3.IBQuery1.SQL.Add('SELECT O.ID_OPERATION,C.NOM_CATEGORIE FROM C_OPERATION O JOIN C_CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE ');
     Form3.IBQuery1.Open;
    end;
    Lorsque je clique sur le button1, je n'ai pas d'erreur. Dans mon DBgrid, j'ai toujours l'affichage de ma table C_OPERATION, mais je n'ai pas l'affichage de NOM_CATEGORIE qui se trouve dans la table C_CATEGORIE.

    Merci de votre aide

    Jean-Louis

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    9 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 9 485
    Points : 23 026
    Points
    23 026
    Billets dans le blog
    13

    Par défaut

    Bonjour,

    Plusieurs possiblités
    - vous avez déjà défini les colonnes de votre grille
    - vous avez défini les champs (mais je pense qu'il y aurait eu erreur)
    - il y a un problème dans les données/la structure de la base


    Note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Form3.IBQuery1.SQL.Clear;
    Form3.IBQuery1.SQL.Add('SELECT O.ID_OPERATION,C.NOM_CATEGORIE FROM C_OPERATION O JOIN C_CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE ');
    peut se remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form3.IBQuery1.SQL.Text:='SELECT O.ID_OPERATION,C.NOM_CATEGORIE FROM C_OPERATION O JOIN C_CATEGORIE C ON O.ID_CATEGORIE=C.ID_CATEGORIE';
    Note bis : j'ai corrigé les balises encadrant le code (bouton #)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Berlin, Tokyo) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Nouveau membre du Club
    Inscrit en
    décembre 2010
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : décembre 2010
    Messages : 30
    Points : 27
    Points
    27

    Par défaut

    Merci de votre réponse
    Je viens de trouver.
    La requête est correcte.
    Dans la config, j'avais mis " DataSource1.DataSet:=IBTable1" au lieu de " DataSource1.DataSet:=IBQuery1".

    JL

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/04/2017, 14h39
  2. [Toutes versions] Appel d'une variable par son nom (string)
    Par Wini29 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/02/2013, 20h43
  3. Réponses: 2
    Dernier message: 21/09/2008, 17h21
  4. Réponses: 42
    Dernier message: 19/06/2007, 09h40
  5. Réponses: 3
    Dernier message: 25/02/2007, 18h49

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