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

Windows Forms Discussion :

[VB.NET]Vue ou table dans mon dataset ?


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut [VB.NET]Vue ou table dans mon dataset ?
    Bonjour,

    je voudrais connaître la stratégie à adopter pour travailler sur les relations un à plusieurs dans mon application.

    Je m'explique, j'ai une liste d'adresses dans une table AdrTbl. Chaque ligne comprend:

    Nom as string
    Rue as string
    CP as string
    Ville as string
    PAYS as integer

    Vous voyez que le pays est un nombre (Foreign key) qui est en liaison avec la clé de ma table PaysTbl qui comprend:

    PaysId as integer
    PaysNom as string

    Dans mon application, je dois fréquemment afficher des adresses, mais comment faire pour afficher le nom du pays plutôt que le numéro du pays.

    Pour l'instant j'ai un AdrTblAdapter pour mes adresses, et un PaysTblAdapter pour mes pays (je me sers de paysBindingSource pour afficher tous mes pays dans un comboBox)

    Dois-je créer une vue qui comprend la table Adresse et la table Pays et qui contiendra toutes mes données adresses plus le nom du pays ?

    Si oui, comment faire pour que cette vue soit utilisable dans tous les formulaires de l'application sans devoir chaque fois la recréer ?

    Vaste question n'est-ce pas ?

  2. #2
    Membre habitué Avatar de lou87
    Profil pro
    Inscrit en
    Février 2006
    Messages
    368
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 368
    Points : 128
    Points
    128
    Par défaut
    Bonjour !

    Il me semble que si les tableaux Pays et Adresse sont triés dans l'ordre des numéros de Pays normalement tu devrais y arriver...

    Avec, si je me trompe, un For et Next to....

    Mais dite le moi si je me trompe

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Je te remercie pour ta réponse.

    En fait je ne parle pas de tableaux mais bien de tables et mon problème est donc d'afficher

    non pas :

    Dupont Rue de France 5 F55555 PARIS 1

    mais bien :

    Dupont Rue de France 5 F55555 PARIS FRANCE

    Mais peut-être t'ais-je mal compris ?

  4. #4
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Points : 2 914
    Points
    2 914
    Par défaut
    passe par des jointures pour récupérer le nom du pays que tu metteras dans ta requête SELECT et que tu peux récupérer dans un DataSet!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Peux-tu m'en dire plus,

    Je maîtrise pas mal les bases de données, mais pas trop ADO ni DotNet, je suis donc un peu perdu entre les datasets Typés, pas typés les datareaders. En fait j'arrive souvent à accéder, updaté mes données en imitant des petits morceaux de codes que je copie à gauche ou à droite, mais je me pose beaucoup de questions quant à savoir quelle approche est préférable à l'autre pour telle ou telle situation.

    Voilà pourquoi je parle de "stratégie" dans mon mail initial.

  6. #6
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Points : 2 914
    Points
    2 914
    Par défaut
    poste ton code comme ça je pourrais t'aider OK

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Voici un morceau de code

    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
    'On écrit dans la base
                Dim dataAdr As bIGbKEDataSet.AdrTblRow
                dataAdr = Me.MyBigBkeDTS.AdrTbl.FindByAdrId(adresseAModif.AdrId)
                dataAdr.BeginEdit()
                dataAdr.AdrCliId = adresseAModif.AdrCliId
                dataAdr.AdrCliTyp = adresseAModif.AdrCliTyp
                dataAdr.AdrCliSeq = adresseAModif.AdrCliSeq
                dataAdr.AdrNom = adresseAModif.AdrNom
                dataAdr.AdrRue = adresseAModif.AdrRue
                dataAdr.AdrCP = adresseAModif.AdrCp
                dataAdr.AdrVille = adresseAModif.AdrVille
                dataAdr.AdrPays = adresseAModif.AdrPays
                dataAdr.AdrTel = adresseAModif.AdrTel
                dataAdr.AdrFax = adresseAModif.AdrFax
                dataAdr.AdrMail = adresseAModif.AdrMail
     
     
                dataAdr.EndEdit()
                Dim rowsAffected As Integer = 0
                rowsAffected = Me.AdrTblTableAdapter.Update(dataAdr)
    J'ai en fait un fichier bIGbKEDataSet.xsd que je vois dans mon Solution Explorer et un MyBigBkeDTS que je vois en dessous de mon formulaire.

    Le code ci-dessus met à jour tous les champs de mon adresse.

    Est-ce un dataset Typé ou pas typé ?

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    oui il est typé et le type c'est : bIGbKEDataSet

    en fait pour ton histoire le mieux ne serait il pas de créer un nouvel élément directement dans ta classe xsd ?

    regarde là, la photo

    http://www.developpez.net/forums/vie...ght=expression

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    J'arrive bien à créer un nouvel élément appelé AdrPaysStr, mais quelle expression lui mettre pour pouvoir aller chercher le nom du Pays en relation avec le numéro. Dans AdrTbl, j'ai le numéro mais pas le nom.

    Je vois bien la solution de faire une requete (en access) pour faire ma jointure et créer spécialement un adapter pour mettre à jour les tables via la requete, mais est-ce une solution acceptable ?

    Quand je travaillais en [1.1] (j'ai fais que regarder de loin) j'ai utilisé des SQLcommand ou OleDbCommand ou je réécrivais mon SQL dans mon code, et ça marchait plutôt bien. Maintenant en [2.2], je ne trouve plus ces OleDbCommand.

  10. #10
    doccpu
    Invité(e)
    Par défaut
    fait une requette sql qui resemble a ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select Nom, Rue, CP, Ville, PaysNom from AdrTbl inner join PaysTbl as PaysId = PAYS;
    et recupere ça avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (dsMonDataSet/drMonDataReader) = daMonDataAdapter.ExecuteReader()

  11. #11
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    dans Expression tu met :
    Parent(LeNomDeLaLiaisonEntreLesDeuxTables).PaysNom

    Pour connaitre le nom de la liaison tu click sur la liaison (le losange entre tes tables) et F4 pour les propriétés, le nom est marqué, c'est bien de les laisser par defaut.

    Avec la solution que je te propose, plus besoin de requete, ça te créé un nouveau champs avec ce que tu veux dedans. Je trouve ça bien, je l'utilise souvent.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Merci à doccpu et NiamorH pour vos réponses.

    Pour le datareader, je vais tester ce WE.

    Pour l'expression, j'ai donc créé un champ adrPaysStr dans la DataTable AdrTbl de mon BigBkeDataSet.xsd

    Comme cette table est en relation avec la table Pays, j'ai une ligne qui rejoint les deux tables (mais pas de losange). Ma relation est PaysTbl_AdrTbl.

    J'ai alors inscrit dans l'expression de mon champ AdrPaysStr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parent(PaysTbl_AdrTbl).paysNom
    Et l'expression est acceptée sans erreur.

    Si je fais un click droit sur ma table AdrTbl, puis Preview Data, puis Preview, je vois bien une colonne adrPaysStr, mais elle est vide !

    J'ai effacé et recréé mon AdrTblTableAdapter et mon adrTblBindingSource et je n'ai pas de données dans cette même colonne adrPaysStr (quand je fais preview)

  13. #13
    doccpu
    Invité(e)
    Par défaut
    c'est normal de ne pas avoir de données dans ta colonne et c'est purement idiot d'avoir fait une colone de plus dans ta table (redondance d'informations)!
    Fais plutot une requette SQL avec une jointure comme je te l'ai montré précédement !

    si tu veux modifier les données de la table AdrTbl a partir de ta requette c'est pas possible en automatique il faut passer par le formulaire qui attaque AdrTbl directement !

    si tu me disait exactement ce que tu veux faire on irrais plus vite !

  14. #14
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Si tu avais lu doccpu, il ne s'agit pas de la table de la base de donnée mais de celle du dataset.

    Autre chose doccpu lorsque qu'on créé un système d'information pour une application, il doit être optimisé et une bonne optimisation comprend aussi des redondance dans le soucis d'acces facile à l'information! La redondance nous permet justement ici d'eviter de passer par des connexions à la base et des requetes.

    L'avantage de passer par le dataset est que cette redondance est temporaire (la base réelle n'a pas de redondance).

    Golzinne il faut absoluement que tu ai ces liaisons qui traduise justement la relation parent/enfant d'integrite referencielle

    Les liaisons sont représentées comme ça :



    Pour les créer, tu dois clicker déplacer depuis le BORD GRIS GAUCHE de la table Pays(Parent) jusqu'à celui de la table Commune, ou Adresse dans ton cas je crois(Enfant).

    Là il va te demander quels champs sont en relation, il te propose directement la clé primaire de la table parent et tu dois choisir la clé étrangère de la table enfant et tu valide.

    A partir de là tu as créé le lien qui te permet de naviguer entre tes tables depuis ton dataset. Et je vais te dire, selon la façon dont tu veux afficher les données tu n'es pas forcement obligé de créer l'expression :

    Disons que tu ai une adresse dans :
    Dim AR as DataSetAdresse.AdresseRow

    et bien pour chopper le pays tu fais :
    AR.PaysRow.PaysNom
    tout simplement ! pour un affichage dans un textbox c'est parfait

    mais si tu veux afficher dans un datagrid, il faut passer par le mapping name. Dans ce cas là tu n'y coupe pas, il faut créer l'expression et rajouter l'élément a ton dataset

    voilà

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Je vais peut-être scinder ma réponse en deux parties car je constate que face à une même question, deux approches différentes me sont proposées. Je m’en réjouis car je vous demande de l’aide justement pour voir quelle approche avoir par rapport à la gestion des données via vb.net.

    Voici pour doccpu

    Dans mon instruction Fill, je change ma requête SQL et je fais un Join entre la table Pays et Adresse. Ca fonctionne, mais je me demandais ce qu’il arriverait si je de vais faire des liens avec d’autres tables. Il m’arrive souvent dans une table d’avoir des liens sur 4 ou 5 foreign Keys. Ne dois-je pas alors faire directement des instructions SQL via un dataAdapter et les récupérer dans un DataSet (non typé) ?

    comme tu me l'avais écrit

    et recupere ça avec un Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (dsMonDataSet/drMonDataReader) = daMonDataAdapter.ExecuteReader()
    Pour NiamorH

    Je suis très intéressé par la méthode que tu préconises, je suis assez d’accord sur le discours sur la dénormalisation et la performance.

    Par contre, je n’arrive pas à repérer ou tu trouves ces losanges…

    Voici ce que moi j’obtiens si j’édite mon dataSet* via mon fichier xsd. C’est peut-être parceque je suis en version 2.0, ou alors on parle pas de la même chose






    J'ai réussi dans ce shéma à rajouter comme tu me l'as dit un champ adrsss sur lequel, dans Expression, j'ai mis Parent(PAYSTblAdrTbl).paysDesc. Mais ça n'affiche rien.

  16. #16
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Effectivement tu n'a pas la même version que moi mais je ne suis pas sur que ça influe sur les expressions..
    Essaye de respecter la Casse on ne sait jamais.. sinon je vois pas trop.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    Ok, merci pour les propositions, le sujet est peut-être trop vaste et trop imprécis, je vais le noter résolu.

  18. #18
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par NiamorH
    Autre chose doccpu lorsque qu'on créé un système d'information pour une application, il doit être optimisé et une bonne optimisation comprend aussi des redondance dans le soucis d'acces facile à l'information! La redondance nous permet justement ici d'eviter de passer par des connexions à la base et des requetes.

    [...]

    L'avantage de passer par le dataset est que cette redondance est temporaire (la base réelle n'a pas de redondance).
    la redondance ne doit pas exister dans la base come tu l'a fait remarquer ! donc la seule redondance (qui n'en est pas une) que je suis pret a t'accorder est en fait de faire apel a une procedure stoquée ou a une vue qui te renvoie une table qui contient les champs de plusieurs tables. Mais au niveau physique il ne doit jamais y avoir de table qui contienne les valeurs d'autres tables (mis a part l'identificateur de l'enregistrement de la table parent).

  19. #19
    doccpu
    Invité(e)
    Par défaut
    Citation Envoyé par Golzinne
    mais je me demandais ce qu’il arriverait si je de vais faire des liens avec d’autres tables. Il m’arrive souvent dans une table d’avoir des liens sur 4 ou 5 foreign Keys. Ne dois-je pas alors faire directement des instructions SQL via un dataAdapter et les récupérer dans un DataSet (non typé) ?
    En fait normalement tu peux faire autant de join sur autant de niveau que tu veux ! Donc le tout apres est de pouvoir les utiliser.

    Un petit conseil :

    Essai de metre ta requette au forma d'une vue ou d'une procedure stokée ce qui te permetra de recuperer la table dans un dataset typé !

    /!\ Attention : la table du dataset sera uniquement en lecture seule !

    Si tu veux ecrire dans les tables tu doit passer par les tables elles memes!

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Points : 491
    Points
    491
    Par défaut
    merci doccpu,

    En fait je me suis orienté vers un dataset non typé, je fais un join sur mes deux tables dans le select de mon adapter, je mets dans un dataset puis dans un databinding auquel je lie mes différents contrôles.

    Pour la mise à jour, je passe par un autre adapter.

    Le grand avantage que je vois avec le dataset non typé, c'est qu'à aucun moment mon IDE ne perd les pédales alors que quand j'édite mon fichier XSD, soudainement, il ne me permet plus de voir ni le XSD ni les formulaires en mode design, et je dois effacer TOUT ce qui a trait aux données et tout recréer.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Nom de table dans mon DataSet
    Par lucazzo dans le forum C#
    Réponses: 2
    Dernier message: 07/07/2009, 17h42
  2. [ADO.NET][IDbDataAdapter] Comment nommer les tables dans un dataset ?
    Par davcha dans le forum Accès aux données
    Réponses: 11
    Dernier message: 11/05/2006, 17h42
  3. Réponses: 1
    Dernier message: 06/04/2005, 15h09
  4. [VB.NET] Trier une table de mon DataSet
    Par San Soussy dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/03/2005, 17h30
  5. Réponses: 7
    Dernier message: 18/06/2004, 09h58

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