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

 Delphi Discussion :

Aide sur Table maître/détail


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut Aide sur Table maître/détail
    bonjour
    je désire une aide ou suggestion sur la relation Table maître/détail
    j'ai une table Maître Adhérent et table Détail Destination chaque adhérent pourra avoir 1 ou n destination
    ou on pourra avoir plusieurs Adhérents qui auront la même destination
    ma question ?
    comment faire la jointure de plusieurs Adhérents à une même destination en même temps au lieu de saisir la destination un par un
    Exmple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from adherent   
    where adherent.club='club touristique ';
    le résultat on pourra avoir 15 adhérents qui appartiennent au club touristique
    je veux affecter en même temps ces 15 adhérents à une destination unique EX : Espagne (table détail ) au lieu de saisir la destination pour chaque adhérent
    merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Ici c'est le forum Delphi et non SQL

    Cela dépend du SGBD et sa capacité à faire un UPDATE avec JOIN
    en Oracle, par exemple ça serait un MERGE
    tu peux aussi le faire vilainement via un WHERE IN (SELECT)

    Tu ne fournis pas les clés de tes tables, on ne peut pas t'aider sans ces informations mais c'est tellement trivial que doit déjà avoir trouvé la réponse

    Voici un code bien vilain qui devrait fonctionner sur beaucoup de SGBD
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE adherent_destination ad
    SET ad.dest_id = (SELECT d.dest_id FROM destination d WHERE d.pays = 'Espagne') 
    WHERE ad.adht_id in (select a.adht_id FROM adherent a WHERE a.club = 'club touristique ');

    Voici le code qui sera surement mis en place dans Delphi
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE adherent_destination ad
    SET ad.dest_id = :pDestID -- un combo box fournira cette valeur
    WHERE ad.adht_id in (select a.adht_id FROM adherent a WHERE a.club = :pClubNom); -- un autre combo box fournira ce filtre

    Je suis rouillé dans la syntaxe UPDATE JOIN
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE adherent_destination ad
    INNER JOIN adherent a ON a.adht_id  = ad.adht_id  
    SET ad.dest_id = :pDestID -- un combo box fournira cette valeur
    WHERE a.club = :pClubNom; -- un autre combo box fournira ce filtre
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    désolé pour le retard de réponse ....
    je crois que je me suis mal exprimé sur mon problème
    1- j'ai une relation entre deux tables Adhérent et Destination en maître détail voici la photo
    Nom : ESSAI01.jpg
Affichages : 700
Taille : 230,0 Ko
    la relation marche je choisi l’adhérent et je l'affecte a une destination ça marche

    2- j'ai une problématique si j'ai 20 adhérents qui vont aller a la même destination
    - je peut faire la saisi de la destination de chaque adhérents c'est a dire 20 saisi de la même destination ou j'ai pensé pourquoi pas les regroupés (Adhérent) et affecter en même temps la destination voici la photo
    Nom : ESSAI02.jpg
Affichages : 670
Taille : 270,4 Ko

    ma question une aide ou suggestion comment faire pour réussir ce code

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    ShaiLeTroll y a pourtant bien répondu (même s'il est trop pointu avec ses id uniques d'enregistrements, la bonne démarche cela dit)

    Même si cela dépend du SGBD , non indiqué, et des structures de table toujours non indiqué, la requête UPDATE (du code bien vilain) est une solution ou du moins partie de la solution car ce serait plutôt un INSERT OR UPDATE qu'il faudrait .

    Sans le SGBD et sans les descriptions des tables difficiles d'en plus.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    pardonne mon inexpérience dans ce forum
    j'utilise une base de donnée ACCESS
    AVEC LES TABLE :
    ADHÉRENT (EN MAÎTRE)
    N° AUTOINCR
    NOM
    PRENOM
    DATE_N
    ......

    DESTINATION (EN DETAIL)
    N° AUTO INCRE
    NUM POUR LA LIAISON
    DESTINATION
    DATE_D
    .....

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    à mon avis il manque une table ADHERENT_DESTINATION (IDADHERENT,IDDESTINATION) avec un Index Unique (IDDESTINATION,IDADHERENT) ainsi que des contraintes référentielles IDADHERENT Table ADHERENT(NUMERO) et IDDESTINATION table DESTINATION(NUMERO) c'est d'ailleurs ce qu'à proposé ShaiLeTroll.

    ensuite avec MSACCESS le choix ne se pose pas point de PROCEDURE ni de INSERT OR UPDATE ni de MERGE que d'autres SGBD pourraient proposer. Donc sur la base de votre écran n°2 je propose cette solution (qui, bien sûr, est loin d'être la plus "propre"), cela dépend aussi des composants de connexion utilisés (je crains qu'il ne s'agisse d'ADO qui sont loin d'être de mon domaine de prédilection)

    Par exemple dans l'évènement AfterPost de DESTINATION ou sur le onClick d'un bouton "ajout d'adhérents"
    Ce code brut se fait avec des composants BDE
    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
    var AQuery, EQuery: TQuery;   
    if RechercheParClub.Text<>'' then 
     begin
        AQuery :=TQuery.Create;  // sélection club
        EQuery :=TQuery.Create;  // exécution directe  
        Try
          AQuery.Connection :=Base; // base est le composant TConnection de la BDD
          EQuery.Connection :=Base; // 
          AQuery.SQl.Text:='SELECT NUMERO FROM ADHERENT WHERE CLUB=:C';
          AQuery.paramByName('C').asSTring:=  RechercheParClub.Text;
          AQuery.Open;
          EQuery.SQL.Text:='INSERT INTO ADHERENT_DESTINATION VALUES (:A,:D)';
          EQuery.Prepare;
          EQuery.ParamByName('D').asInteger:=Destination.FieldByName('NUMERO').asInteger;
          While not AQuery.EOF do 
           begin
             try 
               EQuery.ParamByName('A').aInteger:=AQuery.FieldBYName('NUMERO').asInteger;  
               EQuery.ExecSQL;
             except 
               // destination déjà indiquée pour l'adhérent
             end;
             AQuery.Next;
           end;
          AQuery.Close;
        finally
          AQuery.Free;
          EQuery.Free;
       end;
     end;
    Bien sûr s'il y avait certitude qu'aucun adhérent du club n'ai déjà été ajouté une requête du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ADHERENT_DESTINATION (IDADHERENT,IDDESTINATION) SELECT :DESTINATION,NUMERO FROM ADHERENT WHERE CLUB=:C
    fonctionnerait et éviterait cette boucle while not eof
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    DATE_D devrait être dans ADHERENT_DESTINATION

    Citation Envoyé par SergioMaster Voir le message

    Bien sûr s'il y avait certitude qu'aucun adhérent du club n'ai déjà été ajouté une requête du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ADHERENT_DESTINATION (IDADHERENT,IDDESTINATION) SELECT :DESTINATION,NUMERO FROM ADHERENT WHERE CLUB=:C
    fonctionnerait et éviterait cette boucle while not eof
    Avec un LEFT JOIN cela se gère pour éviter les doublons (moins lisible qu'un NOT EXISTS mais tellement plus rapide)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO ADHERENT_DESTINATION 
      (IDADHERENT, IDDESTINATION) 
    SELECT IDADHERENT, :pDESTINATION
    FROM ADHERENT a
    LEFT JOIN ADHERENT_DESTINATION ad ON ad.IDADHERENT = a.IDADHERENT AND ad.IDDESTINATION = :pDESTINATION 
    WHERE CLUB=:C 
    AND ad.IDADHERENT IS NULL


    le MERGE d'ORACLE il y a le WHEN MATCHED et WHEN NOT MATCHED
    Je l'utilise rarement car la gestion des blocages des enregistrements est un peu trop violente, je préfère soit un IF SELECT THEN UPDATE ELSE INSERT ou un UPDATE WHERE puis INSERT SELECT dans une belle transaction pour garantir que tout a été validé dans un tout cohérent
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Avec un LEFT JOIN cela se gère pour éviter les doublons (moins lisible qu'un NOT EXISTS mais tellement plus rapide)
    Bien vu
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 19
    Points
    19
    Par défaut
    merci pour les réponse !!!

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

Discussions similaires

  1. Opération somme sur table maître/détail sous SQL
    Par netsoft dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/01/2016, 10h07
  2. aide sur table divers ATABDIV
    Par casfiwi dans le forum SAGE
    Réponses: 2
    Dernier message: 08/10/2013, 14h03
  3. insert sur table maitre/detail
    Par looping dans le forum SQL
    Réponses: 1
    Dernier message: 22/04/2013, 07h31
  4. Réponses: 3
    Dernier message: 31/01/2008, 16h31
  5. agregats et table maitre détail
    Par pierrot67 dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/03/2006, 21h18

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