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

Accès aux données Discussion :

DataSet Typé et Relation, Comment remplir automatiquement les tables enfants ?


Sujet :

Accès aux données

  1. #1
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut [ADO.NET] DataSet Typé et Relation, Comment remplir les tables enfants ?
    Bonjour,

    je possède un DataSet typé nommé "Client". Ce DataSet possède 3 TableAdapter:

    - Client
    - Adresses -> pour les adresses du client
    - Téléphones -> pour les téléphones du client

    Deux relations sont définies:
    - entre Client et Adresses
    - entre Client et Téléphones

    Supposons que j'ai une requête sur la table client qui me permet de faire une recherche d'un client à partir de son nom.
    Est-il possible de remplir par la même occasion les tables Adresses et Téléphones ?

    Merci d'avance.

  2. #2
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    quelqu'un n'aurait pas une tite idée ?
    Le message n'est peut-être pas suffisamment clair

    Merci
    Bye

  3. #3
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonsoir,

    apparemment ce n'est pas très clair. Je le conçois bien volontiers.
    Pour obtenir la liste des clients j'utilise la méthode GetClientByNom qui fait appel à une procédure stockée pour obtenir la liste des clients.
    J'aimerais aussi obtenir la listes des adresses et des téléphones associées à chaque client trouvé.
    Pour l'instant j'utilise une requête qui pour chaque IdClient trouvé, récupère la liste des adresses et des téléphones. Ne trouvant ça pas très génial, je désirais savoir comment faire de manière plus pratique.

    Merci d'avance.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Points : 616
    Points
    616
    Par défaut
    Bonsoir,
    je n'ai pas de quoi te faire un exemple ce soir ... mais j'essaie de te faire ca demain au taf si personne ne t'en as fais d'ici la (tout depend de ma charge de taf ... )

    En esperant avoir plein de temps

    Notalp
    Je pense volontiers à penser aux choses auxquelles je pense que les autres ne penseront pas

  5. #5
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    personne n'a vraiment pas une idée ?

    Merci.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Points : 616
    Points
    616
    Par défaut
    Je suis désolé mais mon exemple ne pourra pas t'aider, j'utilise des propriétés de DLL payantes ...

    Bonne chance

    Notalp
    Je pense volontiers à penser aux choses auxquelles je pense que les autres ne penseront pas

  7. #7
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Ah ?
    Bah dommage pour moi alors.

    J'avais espéré ... Et sinon malgrès tout, tu n'aurais pas quelques conseils à me filer ? Il n'y a pas moyen de faire ce que je souhaite sans utiliser des dll payantes, avec les outils du framework ?

    Merci.

  8. #8
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Salut,
    Pas sûr que ça t'aidera, mais moi dans des cas similaires, j'utilise plutôt les DataViews:

    DataClients : Remplie comme tu veux.
    DataTableAdresses : Remplie avec tous les enregistrements de la table Adresses(sans le WHERE/ON Adresses.RefClt=Clients.CleClt, le tout simple simple SELECT MesColonnes FROM Adresses)
    DataTableTelephonnes : De même.

    Je ne travaille pas directement sur le DataTableAdresses, mais sur DataTableAdresses.DefaultView, quand je sens le besoin de filtrer, je fais tout simplement un: DataTableAdresses.DefaultView.RowFilter = "RefClt = " + IdClientEnQuestion;

    Je ne sais pas dans ton cas ce qui serait mieux, charger le tout dans un DataTable et travailler sur la DataView filtrée, ou aller chercher à chaque fois les données depuis la base, à toi de voir.
    Certified SCJP 5.0 / SCWCD 5.0 / SCEA 5.0
    C'est une grande folie de vouloir être sage tout seul.
    Duc de La Rochefoucauld

  9. #9
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    je te remercie pour ta réponse.
    Pour la table client ta solution est interessante car il n'y a pas beaucoup de lignes (une vingtaine).

    Mais j'ai une table produits et une table commande. Il y a plusieurs milliers de lignes (10000) voire même plus. Ne serait-il pas plus interessant de filtrer les données lors de la requête à la base de données ? Ainsi, il y aurait beaucoup moins de données dans le DataSet.
    Qu'en penses-tu ?

    Merci d'avance pour ton aide.

  10. #10
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Pilloutou dit:
    Ne serait-il pas plus interessant de filtrer les données lors de la requête à la base de données ?
    Biensur que si, c'est d'ailleurs ce que je fais pour les tables genre, devis,commande,facture...Il est clair qu'avec ces tables, il ne serait pas raisonnable de charger le tout(Tout les lignes article vendu pour tous les Factures ). Bref, je crois que dans ces cas, la seule manière de procéder, c'est de piocher les données depuis la base à chaque navigation sur la table facture.
    Certified SCJP 5.0 / SCWCD 5.0 / SCEA 5.0
    C'est une grande folie de vouloir être sage tout seul.
    Duc de La Rochefoucauld

  11. #11
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Et donc par exemple, comment fais-tu pour avoir la liste des commandes passés par un client et les détails de ces commandes ?
    Tu fais une requête sur la table commande à partir de l'identifiant client et une requête similaire sur la table détails ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM COMMANDES
    WHERE ID_CLIENT = 10;

    et
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM DETAILS_COMMANDES
    INNER JOIN COMMANDES
    ON COMMANDES.CDE_ID = DETAILS_COMMANDES.CDE_ID
    WHERE COMMANES.ID_CLIENT = 10;

    Merci d'avance.

  12. #12
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Là, on commence à se perdre.
    Pilloutou dit:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM COMMANDES
    WHERE ID_CLIENT = 10;
    et
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM DETAILS_COMMANDES
    INNER JOIN COMMANDES
    ON COMMANDES.CDE_ID = DETAILS_COMMANDES.CDE_ID
    WHERE COMMANES.ID_CLIENT = 10;
    Oui, c'est exact c'est comme ça que je fais .

    En fait, j'avoue que je comprends pas ce que tu veux faire, dans l'inteface qui afficherait ces données, ça serait:

    1. Tu choisis un client
    2. Toutes ses commandes s'affichent
    3. Toutes les détails de commande s'affichent également

    ou
    1. Tu choisis un client
    2. Toutes ses commandes s'affichent
    3. Tu choisis une commande
    4. Seul les détails de cette commande s'affichent.
    Certified SCJP 5.0 / SCWCD 5.0 / SCEA 5.0
    C'est une grande folie de vouloir être sage tout seul.
    Duc de La Rochefoucauld

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2002
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    salut

    comment fais-tu pour avoir la liste des commandes passés par un client et les détails de ces commandes ?
    en une seule requête tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    SELECT     Clients.ID_Client, DETAILS_COMMANDES.*
    FROM        Clients INNER JOIN
                  COMMANDES ON Clients.ID_Client = COMMANDES.ID_client 
                   INNER JOIN
                   DETAILS_COMMANDES ON 
                   COMMANDES.CDE_ID = DETAILS_COMMANDES.CDE_ID
    WHERE Clients.ID_CLIENT = 10
    tu peux enlever Clients.ID_Client de select pour avoir seulement les commandes et leurs détails
    bonne chance

  14. #14
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    et merci pour vos réponses.

    DarkMolo
    Dans mon exemple, j'aimerais retrouver toutes les commandes et les détails de ces commandes pour un client donné sur une période donnée.
    Donc à partir de l'identifiant client, d'une date de début et d'une date de fin, avoir la liste des commandes et les détails de ces commandes.
    Donc je dirais ta proposition 1.
    Mais j'aimerais savoir s'il n'y a pas une manière de faire plus automatique qu'en passant par les deux requêtes que j'ai décrit précédemment.

    Midou
    Merci pour la requête, mais comment puis-je faire à partir de cette requête pour remplir deux DataTable Commandes et Details_Commandes

    Merci d'avance pour votre aide.
    Bye

  15. #15
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Une petite suggestion, puisque tu tiens tant à optimiser tes requêtes, dans la deuxième:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM DETAILS_COMMANDES
    INNER JOIN COMMANDES
    ON COMMANDES.CDE_ID = DETAILS_COMMANDES.CDE_ID
    WHERE COMMANES.ID_CLIENT = 10;

    Puisqu'on vient de sélectionner les commandes d'un client x, il serait interessant de regrouper les CDE_ID sélectionné sous forme de string genre:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String MaListe="";
    while (LectureDeCommande)
    {
    MaListe += CleCmd + ",";
    }
    MaListe = MaListe.Substring(0,MaListe.Length-1);  //Parce que y'aura une virgule de plus à la fin

    ça donnerait "cle1,cle2,cle3...cleN"
    Et ainsi remplacer ton ancienne requête de selection de détails par:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String SqlSelectionDetails="SELECT *
    FROM DETAILS_COMMANDES WHERE IN ("+ MaListe + ")";
    Certified SCJP 5.0 / SCWCD 5.0 / SCEA 5.0
    C'est une grande folie de vouloir être sage tout seul.
    Duc de La Rochefoucauld

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2002
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    salut

    entre deux dates tu ajoute à la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND (TaTable.TacolonneDate BETWEEN 'année-mois-jour' AND 'année-mois-jour')
    pour remplir les deux DataTables il faut passer par deux requêtes je pense

    en vérité je vois pas bien ce que tu veux faire exactement

    bonne chance

  17. #17
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour,

    j'ai deux DataSet typés.
    Dans le premier j'ai deux DataTables: Commande et DetailsCommande.
    Dans le deuxième, j'ai une DataTable: Produit

    Du côté de la base de données, les tables sont liées comme suit:

    Commande <- CDE_ID -> DetailsCommande <- PDT_ID -> Produit

    J'aimerais par exemple rechercher les commandes passées par un client.
    J'ai donc créer une requête qui remplit la DataTable commande à partir de l'identifiant du client.
    Mais il faut que je remplisse la DataTable DetailsCommande, parce qu'une commande sans les détails de la commande, ça n'a pas d'interêt. Je me demande s'il est possible de remplir automatiquement la DataTable DetailsCommande en fonction des résultats retournés dans la DataTable Commande.
    Apparemment c'est possible vu la réponse de Notalp. Mais est-ce possible sans les dll payantes ?

    Et plus compliqué encore, il faut aussi remplir la DataTable Produits situé dans l'autre DataSet typé.

    Vous allez me dire, mais pourquoi utilisé deux DataSet ? Parce que j'ai lu ça dans un document de Microsoft:
    Designing Data Tier Components and Passing Data Through Tiers

    Merci d'avance.
    Pilloutou

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2002
    Messages : 77
    Points : 73
    Points
    73
    Par défaut
    bonjour
    si j'ai bien compris voici un exemple (lots de requêtes)
    ici j'ai pas crée de DataTable mais tu peux le faire pour travailler avec si tu veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DataSet ds = new DataSet();
    string str = "Ta requête pour les commandes d'un client"+
                   "Ta requête pour les détails de la commandes du même client";
    OleDbDataAdapter da = new OleDbDataAdapter(str,con);
    da.TableMappings.Add("Table","Commande");
    da.TableMappings.Add("Table1","Détailcommande");
    da.Fill(ds);
    dg.DataSource = ds; // affichage dans un Datagrid et tu verra le résultat
    tu fais la même chose pour remplir l'autre dataset concernant les produits

    mais si tu nous montre un bout de ton code ça sera un peu plus clair et voir ce qui ne marche pas

    bon codage

  19. #19
    Membre actif
    Inscrit en
    Août 2006
    Messages
    381
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 381
    Points : 252
    Points
    252
    Par défaut
    Bonjour

    et merci pour la réponse.
    Tu me conseilles donc de recréer un DataSet générique en plus de mes deux DataSet typés ?
    J'y avais pensé mais je me demandais si côté architecture, c'était la bonne soluce de mélanger des DataSet typés et DataSet générique. De ce fait, je me demandais si je n'avais pas un problème d'architecture.

    mais si tu nous montre un bout de ton code ça sera un peu plus clair et voir ce qui ne marche pas
    J'aimerais bien mais je n'ai pas grand chose à montrer, je ne sais pas trop comment m'y prendre.
    Mes deux DataSet typés ont été généré par le designer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dg.DataSource = ds; // affichage dans un Datagrid et tu verras le résultat
    Et je vais avoir l'ensemble des données dans le même DataGridView ?
    C'est cool ça, va falloir que j'essaie...

    Merci bien.

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2007, 18h54
  2. comment charger toutes les tables dans DataSet
    Par keletigui dans le forum Accès aux données
    Réponses: 1
    Dernier message: 21/02/2007, 20h44
  3. Réponses: 3
    Dernier message: 09/11/2006, 17h31
  4. [VS2005][VB.NET] Dataset Typé et relations.
    Par Cyrilange dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/04/2006, 18h06
  5. [Excel] Comment ajuster automatiquement les colonnes ?
    Par fba dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 14/11/2005, 16h23

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