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 :

Relation entre tables et Delphi


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut Relation entre tables et Delphi
    Bonjour
    Je cherche à comprendre les grandes lignes :
    J’ai 3 tables A, B, C
    La table A s’affiche correctement sur la forme
    La table B est une table de jointure. Avec deux clefs primaires identique à A,C
    Et la table C doit m’afficher les données lié a la table A par l’intermédiaire de la table B avec une relation 0,n , 0,n entre les tables A, B et B,C

    Ma question, est-ce que une requête SQL suffit pour toutes les tables ou faut-il créer une requête SQL à chaque table.
    En fait je me suis instruit sur le langage SQL mais il me manque le truc pour lier SQL et Delphi.
    J’arrive très bien avec une relation 1,1 et 0,n de deux tables.
    Merci de vos réponses.
    Patrick

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 79
    Points : 58
    Points
    58
    Par défaut
    Salut:
    si la relation entre les table A->B->C alors vous devez créer les tables :
    A avec un clé primaire A1
    B avec deux clé primaire A1, B1
    C avec trois clé primaire A1, B1 et C1
    est fait les relations :
    A maître-détail(A1-A1) B
    B maître-détail(A1-A1 et B1-B1) C
    Sans passé a SQL on utilisons les Table dans Acces BD
    pour utiliser SQL en Delphi il ya Query dans Acces BD

  3. #3
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut
    Bonjour
    merci, tarek_ep pour la réponse à laquelle je vais cogiter...

    Je voyais ça comme ça .
    A avec une clé primaire A1
    B avec deux clés primaire A1, C1 (clé idem que table A et C)
    C avec une clé primaire C1

    A faire un


    avec le dataSource lié a table A
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * B bb
    where bb.A1 = :A1

    avec le dataSource lié a table B
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * C cc
    where cc.C1 = :C1
    D'où la question quel sont mes lacunes?
    merci de vos réponses
    Patrick

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    et si tu donnais des exemples avec des tables réelles ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut
    Bonjour

    Ce que je voudrais dans une forme, c’est afficher la table article et voir en détail les imputations. Et aussi faire l’inverse dans une autre forme afficher les imputations et voir en détail une partie des articles ;
    Est-ce qu’en partant sur ce principe ci-dessous, c’est bien ou il me faut faire autrement ?


    J’ai créé d’un MCD avec « Analysesi.exe » :


    En suite le logiciel à créé le MLD.


    Et la partie SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE article (art_code varchar(20) NOT NULL, art_ref varchar(45), art_desig varchar(50) 
     
    CREATE TABLE imputation (imp_nom varchar(50) NOT NULL, imp_desig varchar(150), detbs_num uniqueidentifier);
     
    CREATE TABLE possede (imp_nom varchar(50) NOT NULL, art_code varchar(20) NOT NULL);
     
    ALTER TABLE possede ADD CONSTRAINT PK_possede PRIMARY KEY (imp_nom, art_code);
     
    ALTER TABLE possede ADD CONSTRAINT FK_possede_imp_nom FOREIGN KEY (imp_nom) REFERENCES imputation (imp_nom);
     
    ALTER TABLE possede ADD CONSTRAINT FK_possede_art_code FOREIGN KEY (art_code) REFERENCES article (art_code);

    Dans un Module Data voici une procédure

    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
    41
    42
    43
    procedure TDM.Ouverture_tbl_POSSEDE;
    begin
    try
    if not IBDataBase1.Connected then connexionbase;
    IBQuery_Possede.DataSource := Datasource_Article;
     
    IBQuery_Possede.Close;
    IBQuery_Possede.SQL.Clear;
    IBQuery_Possede.SQL.Add('SELECT * FROM POSSEDE P');
    IBQuery_Possede.SQL.Add('WHERE (P.ART_CODE = :ART_CODE)');
    IBQuery_Possede.Prepare;
    IBQuery_Possede.Open;
     
    except
    erreur(Format(MSg01,['"Possede (table de liaison Article, Imputation)"']));
    IBQuery_Possede.Close;
    end;
    end;
     
     
    procedure TDM.Ouverture_tbl_IMPUT;
    begin
    try
    if not IBDataBase1.Connected then connexionbase;
     
     
    ////////////IBQuery_Imput.DataSource := Datasource_Possede;
     
    IBQuery_Imput.Close;
    IBQuery_Imput.SQL.Clear;
    IBQuery_Imput.SQL.Add('SELECT * FROM IMPUTATION I');
    IBQuery_Imput.SQL.Add('LEFT OUTER JOIN POSSEDE P');
    IBQuery_Imput.SQL.Add('ON (I.IMP_NOM = P.IMP_NOM)');
    IBQuery_Imput.Prepare;
    IBQuery_Imput.Open;
     
    Tbl_imput:=true;
    except
    erreur(Format(MSg01,['"Imputation"']));
    Tbl_imput:=false;
    IBQuery_imput.Active:=false;
    end;
    end;
    J’ouvre les deux tables, dans la forme je visualise bien les détails d’un article avec la table « POSSEDE », ce que je cherche à faire c’est voir à partir de la colonne « IMP_NOM » de la table possede la colonne « IMP_NOM » de la table imputation.

    Bien sur je pourrais mettre les données d’imputation dans la table « Possede » et tout irai bien, mais l’inverse de la table « possede » est-ce que je pourrais voir les articles utilisés.

  6. #6
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Bien sur que tu peux les avoir. Il suffit de mettre le bon instruction SQL
    Liste des articles d'une imputation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT
      I.IMP.NOM,
      I.IMP.DESIGN,
      P.ART_CODE,
      A.ART_REF,
      A.ART_DESIGN
    FROM IMPUTATION I
    LEFT JOIN POSSEDE P ON P.IMP_NOM = I.IMP_NOM
    LEFT JOIN ARTICLE A ON A.ART_CODE = P.ART_CODE
    WHERE I.IMP.NOM = :PIMPUTATION
    Les imputations concernant un article
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT
      A.ART_CODE,
      A.ART_REF,
       A.ART_DESIGN,
      P.IMP.NOM,
      I.IMP.DESIGN,
    FROM ARTICLE A 
    LEFT JOIN POSSEDE P ON P.ART_CODE = A.ART_CODE
    LEFT JOIN IMPUTATION I ON I.IMP_NOM = P.IMP_NOM
    WHERE A.ART_CODE = :PCODEARTICLE
    Voici à peu près les requêtes SQL. Il fuat regarder s'il n'y a pas d'erreur mais l'essentiel est là.
    Tu peux très bien aussi t'en sortir en mode Maitre detail.

    A+
    On progresse .....

  7. #7
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut
    Bonjour

    Je repose ma question différemment.
    En fait, ce qui me gène, j’ai une forme avec la table A qui s’affiche bien, je voudrais afficher une partie de la table C.
    Dans le MCD j’ai une table de jointure pour les tables A et C que j’appelle B.

    Je ne sais pas ou mettre la requête de jointure lors de l’ouverture de la forme, dans la table A, B,ou C , et faut-il ouvrir les trois tables ou la requête le fait ?
    Faut-il lier les « datasource » et utiliser les paramètres ?
    Si vous avez un modèle ça serait parfait.
    Merci à Andry, tarek_ep et Just-Soft qui m’ont répondu.

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Dans ce cas, il suffit de configurer les tables/Query en relation maitre/Détail.
    Cf Aide de Delphi et demos pour plus de détail

    Courage
    On progresse .....

  9. #9
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    Bonjour,

    Peut être que cela peut se faire aussi au niveau des composants:
    3 datasets A, B et C ouvert sur les 3 tables A, B et C
    Le dataset B peut avoir un champ lookup sur A....
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  10. #10
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Dans Delphi tu as un expert en création de projet qui te permettra de comprendre le mécanisme de relation entre tables. Dans Delphi7 : nouveau/autre - onglet affaires - expert fiche base de données.

  11. #11
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut
    Bonjour

    Je vous remercie tous de m'avoir accordé du temps pour m'aider. Hier soir je suis allé au lit bien heureux d'avoir trouvé la solution à mon problème.



    Je pensais bien qu’il me manquait un petit rien pour savoir faire ce que je voulais.
    Je vais tenter d’expliquer le problème et sa solution.
    Avant de créer la base de données, j’ai voulu passer par un MCD avec la méthode Mérise en utilisant des tutoriaux de ce site.
    Voici donc le MCD




    La table « Possede » est la table de jointure, pour la créer dans le MCD il faut dire « la table article possède de zéro à plusieurs Imputations » relation 0,n.
    ET la table « Imputation » possède de zéro à plusieurs articles, relation 0,n

    Car, je veux avoir la possibilité d'avoir ou pas d’Imputation à un article et aussi par d’articles dans une imputation (Ce qui permet en plus de créer des imputations d’avance)

    L’utilité de ces trois tables est de pouvoir lister tous ou une partie des articles qui sont utilisés par imputation OU lister toutes les Imputations utilisées par un article et aussi de lister les articles sans imputations OU les imputations sans articles.

    Le problème que j’ai rencontré, je ne savais pas dans quelle table créer la requête SQL et avec Delphi comment afficher les données. Plusieurs méthodes sont possibles voici celle que j’ai retenue.

    Ce que je savais faire c’était une relation maître/détail, alors j’ai utilisé la table article comme maître et la table possède comme détail.
    Voici un bout de programme :

    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
    41
    42
    43
    44
     
    procedure TDM.Ouverture_tbl_ARTICLE;
    begin
    try
    if not IBDataBase1.Connected then connexionbase;
     
    IBQuery_Article.Close;
    IBQuery_Article.SQL.Clear;
     
    IBQuery_Article.SQL.Add('SELECT * FROM ARTICLE');
    if not IBQuery_Article.Prepared then
    IBQuery_Article.Prepare;
    IBQuery_Article.Open;
     
    except
    erreur(Format(MSg01,['"Article"']));
    IBQuery_Article.Active:=false;
    end;
    end;
     
    (***************************  PROCEDURE OU FONCTION  **************************)
    procedure TDM.Ouverture_tbl_POSSEDE;
    begin
    try
    if not IBDataBase1.Connected then connexionbase;
     
    //paramètre :ART_CODE de la requête SQL
    IBQuery_Possede.DataSource := Datasource_Article;
     
    IBQuery_Possede.Close;
    IBQuery_Possede.SQL.Clear;
    IBQuery_Possede.SQL.Add('SELECT * FROM POSSEDE P');
    IBQuery_Possede.SQL.Add('LEFT OUTER JOIN IMPUTATION I ON (I.IMP_NOM = P.IMP_NOM)');
    IBQuery_Possede.SQL.Add('WHERE (P.ART_CODE = :ART_CODE)');
     
    if not IBQuery_Possede.Prepared then
    IBQuery_Possede.Prepare;
    IBQuery_Possede.Open;
     
    except
    erreur(Format(MSg01,['"Possede"']));
    IBQuery_Possede.Close;
    end;
    end;

    Là ou je coinçais et que je viens de réussi. C’est faire une jointure avec la table Possède et Imputation.
    Maintenant ce que je comprends, une jointure c’est une façon d’importer, joindre, lier des colonnes d’une table avec une autre table.
    Pour afficher dans une grille de données , utiliser le datasource de la table qui à la jointure (dans mon cas « possede ») et pour l’affichage d’une colonne de la table jointée (dans mon cas « Imputation ») ajouté avec l'éditeur de colonnes un nom de colonne de la table jointé (imputation) dans la grille.

    Patrick25300

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

Discussions similaires

  1. Access me change mes relations entre tables
    Par karimspace dans le forum Access
    Réponses: 14
    Dernier message: 29/03/2006, 09h57
  2. Relation entre tables dans bdd différentes
    Par Mandotnet dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 29/03/2006, 08h03
  3. Les relations entre tables
    Par sheira dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 20/03/2006, 15h03
  4. Récupération des relations entre tables
    Par Themacleod1980 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/02/2006, 11h34
  5. relations entre tables
    Par ilyassou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/11/2005, 07h48

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