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

Lazarus Pascal Discussion :

Liens entre tables pour afficher une liste [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 753
    Points
    9 753
    Par défaut Liens entre tables pour afficher une liste
    Bonjour,

    J'ai une base de données (SQLite3) dans laquelle j'ai (entre autres) 3 tables liées.

    La première contient une liste d'Objet. Ces objets peuvent avoir plusieurs spécificités. T_Objets : obj_id, obj_nom, obj_prix, obj_tvaid, ...
    J'ai une table qui contient la liste des spécificités : T_Specifs : spe_id, spe_nom
    Et enfin, une table qui ne contient que 2 champs : T_Li_ObjSpe : obj_id, sp_id.

    Je voudrais, dans une fiche "Objet" avoir une liste des spécificités de l'objet.
    J'utilise la ZeosLib. J'ai mis une ZTable sur T_Objets, avec un datasource.
    Je voudrais que dans une dbListbox le programme affiche automatiquement la liste des spécificités.
    J'ai bien mis un ZSQL avec un datasource, mais là où je bloque, c'est sur comment, à partir de l'obj_id en cours, obtenir la liste des spe_nom associés...

    Je ne sais pas si je me suis bien fais comprendre...

    Merci d'avance
    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 421
    Points : 1 103
    Points
    1 103
    Par défaut
    Bonjour,

    Si tu peux travailler avec des requêtes SQL, utilises une requête avec les jointures qui vont bien ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.obj_id, a.obj_nom , c.spe_nom
       from t_objets a join t_li_objspe b on a.obj_id = b.obj_id
                       join t_specifs c on b.sp_id = c.spe_id
    NB Tu n'obtiendras avec cette requête que les objets qui ont des spécificités (avec autant de lignes que de spécificités). Si tu veux voir tous les objets utilises des jointures gauches
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.obj_id, a.obj_nom , c.spe_nom
       from t_objets a left join t_li_objspe b on a.obj_id = b.obj_id
                       left join t_specifs c on b.sp_id = c.spe_id
    Cordialement

  3. #3
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 753
    Points
    9 753
    Par défaut
    Merci d'avoir répondu.

    Ce que je veux, c'est la liste des spécificités pour l'objet encours dans la table des objets !
    Et récupérer cette liste dans une listbox !

    J'ai fait la requête suivante (qui fonctionne dans SQLite Expert)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT t1.spe_nom FROM T_Specifs as t1, T_Li_ObjSpe as t2 Where (t1.spe_id = t2.spe_id) and (t2.obj_id=1)
    Dans le résultat de SQLite Expert, je récupère bien la liste des Spécificité de l'objet dont l'id est 1.

    Mais, dans le programme Lazarus, je n'arrive pas à remplir ma dbListBox avec le résultat de la requête, et je ne suis pas sur de la manière de synchroniser l'obj_id avec la table des Objets !

    J'espère avoir été plus clair...

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Tu pourrais utiliser cette requête (la 1ère proposée, avec un WHERE en plus) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.spe_nom
    FROM t_objets a 
    JOIN t_li_objspe b ON a.obj_id = b.obj_id
    JOIN t_specifs c ON b.sp_id = c.spe_id
    WHERE a.obj_id = :obj_id

    Spécifier le paramètre obj_id dans le TZQuery correspondant.
    Associer le DbListBox à un TDataSource qui soit lui même lié à ce TZQuery.

    Et dans l'événement où l'objet affiché change (probablement OnDataChange d'un autre TDataSource), tu fermes le TZQuery, assignes une nouvelle valeur à son paramètre, et tu le réouvres.

    On peut faire même mieux (plus "descriptif") en liant le TZQuery à la DataSource de l'objet affiché, mais c'est plus compliqué à expliquer, et ça n'ira pas plus vite...
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  5. #5
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 753
    Points
    9 753
    Par défaut
    Citation Envoyé par tintinux Voir le message
    On peut faire même mieux (plus "descriptif") en liant le TZQuery à la DataSource de l'objet affiché, mais c'est plus compliqué à expliquer, et ça n'ira pas plus vite...
    Merci pour cette explication, ça fonctionne parfaitement.

    Avant de mettre résolu, tu voudrais pas expliquer la manière de faire le lien avec TZQuery et le Datasource de la liste ? hum ? Enfin, sans vouloir abusé !
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  6. #6
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Avec Zeos, il y a 2 possibilités :

    La première qui existe aussi avec les composants orientés données de Delphi et avec SqlDb sous Lazarus, consiste à mettre dans le champ DataSource du Second TZQuery le nom du DataSource qui est lié au premier TZQuery (maître). Il faut ensuite que le nom du paramètre du second Query, sans les deux-points, soit exactement le même qu'un des champs du premier Query, et retournant la clé de jointure (on peut faire un alias dans le SQL pour que ça corresponde).

    Cette méthode, qu'on peut qualifier d'historique, pose parfois de sérieux problèmes pour que les noms des champs correspondent et ne marche que si la jointure est sur un seul champ (ce qui reste recommandé).

    La seconde, disponible uniquement avec Zeos, consiste à utiliser à remplir le champ MasterDatasource du second Query, au lieu de DataSource, et en plus les champs MasterFields et LinkedFields. Elle évite de devoir faire correspondre les noms des champs dans le SQL et permet d'utiliser des jointures sur plusieurs champs. Elle est donc un peu plus souple.

    Ces deux techniques ne sont pas unanimement utilisées et créent parfois des problèmes, surtout en maintenance sur des grosses applications avec des modèles de bases compliqués et/ou évolutifs, ou si on doit générer des requêtes dynamiques. J'ai connu des collègues devant maintenir un existant, qui ont cherché pendant des jours pourquoi "ça ne marchait plus", car ils ne connaissaient pas ces techniques.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  7. #7
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 384
    Points : 9 753
    Points
    9 753
    Par défaut
    Merci beaucoup pour toutes ces explications.

    Ça roule du feu de Dieu.

    A+
    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/06/2008, 17h24
  2. Lien entre tables lors d'une requête
    Par thom30 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/12/2007, 15h49
  3. Problème pour afficher une liste déroulante
    Par Oli_Ifre dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2007, 09h11
  4. Pb de liens entre table pour une requête
    Par syldudu dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/08/2006, 17h27
  5. Recheche commande AWK pour afficher une liste de fichiers
    Par Krispy dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/07/2006, 11h36

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