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 :

gestion maitre detail


Sujet :

Bases de données Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 831
    Points : 261
    Points
    261
    Par défaut gestion maitre detail
    bonjour,

    je reformule différement mon post du 9/6 car j'ai du mal expliquer le problème:

    soit 2 dbgrid représentant 2 tables en maitre détail et un dbnavigator associé à la table maitre

    est ce qui'il est possible de gerer les 2 tables en maitre détail avec un seul dbnavigator (celui de la table maitre) ?

    merci

  2. #2
    Membre habitué Avatar de host22
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2007
    Messages : 222
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par looping
    bonjour,

    je reformule différement mon post du 9/6 car j'ai du mal expliquer le problème:

    soit 2 dbgrid représentant 2 tables en maitre détail et un dbnavigator associé à la table maitre

    est ce qui'il est possible de gerer les 2 tables en maitre détail avec un seul dbnavigator (celui de la table maitre) ?

    merci
    ce que j'ai compris c'est que ta 2 tables une maitre et l'autre détail qui sont reliées biensur relie ton dnavigator au datasource de ta table maitre et tu gere ta table maitre avec ces détail (champs reliés) tu peut si t veut mettre un 2eme dbnavigator pour ta 2eme table mais il va gerer la 2ème seulement.
    enfin d'aprés ce que j'ai cru comprendre.
    Un homme savant a compris un certain nombre de vérités, un homme cultivé a compris un certain nombre d'erreurs.

  3. #3
    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
    Salut
    Peut être une piste :
    Si le DBGrid esclave recoit le focus , faire pointer le datasource du dbnavigator sur celui du DBGrid esclave.
    Il faut gerer l'evenement OnEnter des DBgrids.
    l'incovenient c'est qu'il faut cliquer sur chaque DBGrid avant d'utiliser le dbnavigator.
    Un ptit bout de code vite fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.DBGridEnter(Sender: TObject);
    begin
      if Sender = DBGrid_Maitre then
        DBNavigator1.DataSource := DbGrid_Maitre.DataSource;
      if Sender = DBGrid_Esclave then
        DBNavigator1.DataSource := DbGrid_Esclave.DataSource;
      MessageDlg(PChar('Le DBNavigator est sur le '(Sender as tDbGrid).Name), mtWarning, [mbOK], 0);
    end;
    A+
    On progresse .....

  4. #4
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Procedure TForm1.DBGridEnter(Sender: TObject);
    begin
      DBNavigator1.DataSource. := (Sender  AS TDbGrid).DataSource.Dataset;
    end;

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut
    Connait tu le format de la base de données (Paradox ou Autre)
    Si c'est un format Paradox aucun problème puisque le fait de relier le ttable de la table détail au tdatasource de la table maitre met en place toutes les fonctions nécessaires pour que la table détail soit synchronisées avec la table maitre. Si ce sont d'autre format de table (SQL Server par exemple) il te faudra certainement placer un index secondaire sur la table détail. Ce qui est fait d'ailleur par le Wizard qui existe dans certaines versions de DELPHI.
    En Paradox : il n'est pas possible d'agir sur le "Cancel" simultané des tables maitre et détail puisque la notion de Transaction (Commit et RollBack) n'existe pas. Dans ce cas tu peux remplacer "Cancel" par un Cancel Sur la table Détail et un Delete sur la table Maitre si il n'existe plus d'enregistrement dans la table Detail reliés à l'enregistrement Maitre.

  6. #6
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Citation Envoyé par ALWEBER
    Connait tu le format de la base de données (Paradox ou Autre)
    Si c'est un format Paradox aucun problème puisque le fait de relier le ttable de la table détail au tdatasource de la table maitre met en place toutes les fonctions nécessaires pour que la table détail soit synchronisées avec la table maitre. Si ce sont d'autre format de table (SQL Server par exemple) il te faudra certainement placer un index secondaire sur la table détail. Ce qui est fait d'ailleur par le Wizard qui existe dans certaines versions de DELPHI.
    En Paradox : il n'est pas possible d'agir sur le "Cancel" simultané des tables maitre et détail puisque la notion de Transaction (Commit et RollBack) n'existe pas. Dans ce cas tu peux remplacer "Cancel" par un Cancel Sur la table Détail et un Delete sur la table Maitre si il n'existe plus d'enregistrement dans la table Detail reliés à l'enregistrement Maitre.
    soit vous vous est tromper de post ou vous avez mal compris le problèmes notre ami ne parle pas d'une intégrité mais just de gérer deu table avec un seul DBNavigatror.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 831
    Points : 261
    Points
    261
    Par défaut explications détaillés
    bonjour,

    je me suis mal expliqué sur le premier post
    avec un jpeg que vous trouverez en pièce jointe ca sera plus clair

    en fait tous les champs et le dbnavigator sont rattachés à une meme table (table1) sauf le champ memo commentaire en bas à droite qui lui est rattaché a une autre table (table2)

    - table1 est maitre et table2 détail (lié sur le champ "N° qualité")
    - il ni a qu'un champ détail par champ maitre: en fait la table détail n'est qu'une extention de la table maitre. J'ai fait ca pour separer les champ memo des autres champ

    donc la question: comment à l'aide du navigator gerer le champ commentaire ?

    merci

  8. #8
    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 looping
    ...
    - il ni a qu'un champ détail par champ maitre:
    ...
    J'ai fait ca pour separer les champ memo des autres champ
    Tu t'es bien compliqué la vie ! Pourquoi donc as-tu séparé le champ mémo ?
    En utilisant qu'une seule table, tu n'aurais pas ce genre de difficultés.


    @+

  9. #9
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    alors la bravo pour ton premier post tu a parlé de DBGrid, Maitre-détail... etc.
    c'est pas grave sa servira peut être a quelqu'un d'autres.

    pour ton problemes.
    Dans l'évenement AfterScroll de ta Table1 tu appel un location

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Table2.Active then
       Table2.Locate('Num',Table1.FiledByName('Num').Value,[]);
    mais reste toujours un problèmes. dans le cas ou t'a pas de commentaire pour ton Enregistrement de Table1 le locate Echou alors il reste sur le dernier
    enregistrement ce qui risque de tromper l'utilisateur.

  10. #10
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Citation Envoyé par Cl@udius
    Salut



    Tu t'es bien compliqué la vie ! Pourquoi donc as-tu séparé le champ mémo ?
    En utilisant qu'une seule table, tu n'aurais pas ce genre de difficultés.


    @+
    je pense que c'est dans un but optimisation.

  11. #11
    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
    Citation Envoyé par aityahia
    je pense que c'est dans un but optimisation.
    En fait je ne vois pas trop laquelle !
    A moins que Looping utilises des TxxxTable au lieu de TxxxQuery.

  12. #12
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Citation Envoyé par Cl@udius
    En fait je ne vois pas trop laquelle !
    A moins que Looping utilises des TxxxTable au lieu de TxxxQuery.
    pour looping au lieu d'intégrer un champs memo dans sa table et qui ne sera pas remplie c'est une perte d'espace.

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut
    Si ta table est au format Paradox du peux sans probleme intégrer le champ mémo dans ta table. Lorsque tu decris la structure de table met la longueur à 1. Par défaut Le premier caractère du memo sera stocké dans le fichier .DB et le reste (<=4Go) sera stocké dans le fichier .MB. Ce qui est à mon avis la solution la plus simple. Si toutefois tu tiens à conserver les deux tables ces deux tables doivent avoir la même clé primaire. Il faut synchroniser ces deux tables en interceptant les événements AfterInsert,... sur l'objet TTable associé à la table Maitre.

    Note :
    pour looping au lieu d'intégrer un champs memo dans sa table et qui ne sera pas remplie c'est une perte d'espace
    Ce point n'est pas vrai puisque le champ MEMO qui est un champ BLOB (Binary Large Objet) est traité comme un champ de longueur variable (VarChar)

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 831
    Points : 261
    Points
    261
    Par défaut réponse
    bonsoir,

    j'ai séparé le champ memo par crainte de corruption (le fichier maitre est préservé) et aussi parce que c'est plus facile ensuite pour gerer les états sous freereport: si il ni a pas de texte le champ texte( ce qui se produit pour la moitie des enregistrements), je valide une option et le détail ne s'imprime pas et je gagne du papier .

    pour la gestion j'ai fait comme ceci:

    sur l'evenement "AfterEdit" de la table maitre: je met tabledétail.edit

    sur l'événement "AfterInsert" de la table maitre: je met tabledétail.insert

    pour l'enregistrement j'ai vu que c'est automatique: quand on "post" la table maitre , la table détail passe en post automatiquement

    le champ qui sert de liaison maitre-détail, lui est rempli automatiquement dans la table détail lors de l'insertion ou l'édition

    ensuite je teste la table détail: if tabledétailTEXTE.value='' then tabledétail.delete; ceci pour effacer un enregistrement vide

    le premier test sont positifs, ca fonctionne correctement

    le seul probleme restant c'est la fonction cancel:
    si je fait tabledétail.cancel sur l'evénement beforecancel de la table maitre, ca ne fonctionne pas: les champs de la table maitre sont bien annulé mais le champ détail est passé en post tout seul ! mais ceci n'est pas trop problématique pour l'instant


    a+ et merci a tous

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut
    En complement tu peux récuperer la cle de la table maitre avant le cancel et lancer un TQuery comme ci dessous. La requete se fera en parallèle et l'enregistrement de la table détail sera effacé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      q1 : TQuery ;
    begin
      Q1 := TQuery.Create (nil);
      Q1.DatabaseName := '' ;
      Q1.SQL.text := 'DELETE ... '
      q1.ExecSQL ;
      q1.Free ;
    end ;

  16. #16
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par looping
    j'ai séparé le champ memo par crainte de corruption (le fichier maitre est préservé)
    Si tu as peur de corruption de fichier alors n'utilise pas paradox

    Citation Envoyé par looping
    et aussi parce que c'est plus facile ensuite pour gerer les états sous freereport: si il ni a pas de texte le champ texte( ce qui se produit pour la moitie des enregistrements), je valide une option et le détail ne s'imprime pas et je gagne du papier .
    Que le champ soit dans la même table ou pas ne t'oblige pas a ajouter le champ memo à un état freereport, tu peux configurer comme tu veux cela.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. Insertion dans 2 tables (Maitre + detaille )
    Par nil dans le forum Bases de données
    Réponses: 11
    Dernier message: 09/11/2005, 22h30
  2. [TTable] Pb avec une relation maitre-detail
    Par kase74 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/10/2005, 11h34
  3. [jdbc/JAVA] maitre/detail ;qlq a un lien!
    Par b_52globemaster dans le forum JDBC
    Réponses: 8
    Dernier message: 03/08/2005, 21h44
  4. [C#] [WinForms] DataGrids maitre / details séparés
    Par aeled dans le forum Windows Forms
    Réponses: 4
    Dernier message: 08/03/2005, 13h18
  5. [Ferme] DBLookup fiche detail (relation maitre detail)
    Par boyerf dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/02/2004, 21h12

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