begin process at 2010 02 10 11:25:00
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Base de données

 > 

SQL Server

 > 

Lier 3 tables


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Lier 3 tables

vendredi 9 mai 2008 à 13:02:36 | Lier 3 tables

tintin972

Bonjour à tous,

Je développe un projet MVS2005 en C#  sur une BBD Sql server 2005. La première chose qu'il faut que j'arrive a faire est d'afficher la liste des composants qui composent un produit. Malheureusement dans ma BDD pour l'intégrité des données j'ai une table de tansition (DETAIL) entre ma table COMPONENT et ma table PRODUCT...
Donc PODUCT (product_id, product_name....) DETAIL(detail_id, product_id,compo_id, quantity...) COMPONENT (compo_id, compo_name,value,...)
A l'aide du gestionnaire "Source de donné" (donc sans écrire de code)...J'arrive a créer 3 datagridview qui sont liés entre eux mon DgvDetail m'affiche bien toutes les entrés qui correspondent au produit sélectionné dans le DgvProduct (pour un unique produc_id). Par contre mon DgvCompo ne m'affiche que l'entré sélectionné dans le DgvDetail...(pour un unique compo_id)
Comment faire pour afficher dans mon DgvCompo tous les composents "utilisés"  dans le DgvDetail... C a d retrouver pour chaque entré du DataAdapter de mon DgvDetail le composant correspondant et l'afficher (pour chaque compo_id)

J'essai en vain de changer la requete qui rempli mon CompoAdapter... Mais rien n'y fait...Je ne réussi à afficher qu'une entré correspondant à la ligne sélectionné dans le DgvDetail...
Je pensais qu'une requete du genre ... SELECT * FROM dbo.COMPONENT WHERE EXISTS  ( SELECT * FROM DETAIL WHERE COMPENENT.compo_id= DETAIL.compo_id)  meme en métant dans la sous requete des conditions bidon du genre WHERE compo_id<50 ca me renvoi qu'une entré...

Si quelqu'un peu m'aider ca me sauverais...Je suis méga en retard sur mon projet et je stagne sur ce probléme depuis trop longtemps...
Merci d'avance


Pierre qui roule n'amasse pas mousse...
vendredi 9 mai 2008 à 13:33:05 | Re : Lier 3 tables

coq

Administrateur CodeS-SourceS
Réponse acceptée !
Salut,

Heu, où est passé l'ID du produit dans cette histoire, c'est quand même lui qui est censé permettre de filtrer la liste des composants.

A vue de nez pour la requête, en restant sur l'idée de la sous-requête, ça donnerait quelquechose du genre :
SELECT * -- mettre plutot la liste des colonnes ici
FROM [dbo].[COMPONENT] AS Components
WHERE Components.[compo_id] IN ( SELECT [compo_id]
                                FROM [dbo].[DETAIL] AS Details
                                WHERE Details.[product_id] = @productID
                                )

Et avec une jointure plutot ceci :
SELECT Components.* -- mettre plutot la liste des colonnes ici
FROM [dbo].[COMPONENT] AS Components
    INNER JOIN [dbo].[DETAIL] AS Details ON Components.[compo_id]=Details.[compo_id]
                                                AND Details.[product_id]=@productID

En gardant quand même une préférence pour la seconde qui devrait avoir un cout moins important à l'execution (à tester).


/*
coq
MVP Visual C#
CoqBlog
*/
vendredi 9 mai 2008 à 14:00:59 | Re : Lier 3 tables

tintin972

Salut Coq,

Pour le product_id vu que DETAIL est directement (et correctement) lié à PRODUCT, je pense qu'il n'est plus vraiment nécessaire de remonter jusqu'a lui...

Tu utiliserais donc une requete paramaètré, est- il possible d'éviter cela? Car ca implique fournir une valeur du paramètre. C'est l'une des solutions que j'ai retenu aussi (sauf que ma requete n'utilisait pas de AS...) mais je n'ai pas eu bcp de succès pour passer le param au bon moment.
J'avais utiliser deux méthodes :

- soit je récupére le paramètre manuellement genre en prenant la valeur contenu dans la colonne product_id de mon DgvDetail.. Ca marche j'affiche les composants mais ceux qui sont affichés avant le load ...(J'ai du mal/je sais pas me lier au bon event?).
- Ma deuxième tentative a été d'ajouter un paramètre en output dans les propriété de la requete qui remplie mon DataadapterDetail mais j'arrive pas à récolter une valeur pour la réinjecter dans la requete qui remplie DataAdapter COMPONENT...Le parametre reste NULL...

Je test avec ta requete...




vendredi 9 mai 2008 à 16:22:21 | Re : Lier 3 tables

tintin972


Bon ca fonctionne plutot bien avec ta requete en lui passant manuelement le parametre (1ere méthode que énoncé plus haut)...Mais comme prévu il me reste le probléme de l'évènement à utiliser pour la mise à jour...Je me dis qu'un OnCellValueChanger ca va bien le faire mais vue que je me base sur une case du DgvDetail pour récupérer la valeur du param (productid). Ca me pause un probléme a l'initialisation (Exeption ReferenceNull). Je pense que l'événement "arrive" avant la création de la cellule ou je récupère ma valeur...Il me faut donc trouver une condition qui lui dise d'attendre que la cell soit créée avant d'aller regarder ca valeur...j'ai pensé à un truc du genre :

 private void DETAILDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
 {         
 if (DgvDetail.created = = true)
{
 Decimal Param = DgCdetail.CurrentRows.Cell[1].Value;
this.cOMPONENTTableAdapter.FillByCoqMeth(this.mBSDBDataSet.COMPONENT, prodparam);
}
}

Mais bon visiblement created n'est jamais true...Je pense avoir testé toutes les propriétés qui pourraient aller...mais rien ne va. Qu'est ce que je pourrai mettre a la place du .created? Dois-je prendre un autre event??

vendredi 9 mai 2008 à 16:51:46 | Re : Lier 3 tables

coq

Administrateur CodeS-SourceS
Moi et le databinding, ça fait 2, il va falloir attendre quelqu'un d'autre.



/*
coq
MVP Visual C#
CoqBlog
*/
vendredi 9 mai 2008 à 18:20:02 | Re : Lier 3 tables

tintin972



Merci Quand même tu m'as bien aidé....
Il me suffirait de trouver une manière de bien faire ma mise a jour et mes tables sont a peu près liées.
samedi 10 mai 2008 à 11:40:44 | Re : Lier 3 tables

tintin972

Dis peut être que par contre tu sais faire une requête qui fourni un paramètre en output? Cela existe-il?
 Ça serait selon moi un moyen efficace de faire ma 2ème liaison.
J'ai remarqué que dans les propriétés de la requête qui remplie mon dataadapter on peut insérer un paramètre de type output. Du coup il faut lui fournir une variable du type dans mon cas decimal? paramproduct_id ca compile mais il semble que paramproduct_id soit toujours null...

P.S : J'ai du mal a croire que je sois le seul à essayer de lier 3 tables! La structure de ma bdd me parait classique...

dimanche 11 mai 2008 à 22:29:32 | Re : Lier 3 tables

coq

Administrateur CodeS-SourceS
Pour l'output, ça se joue avec la propriété ParameterDirection de l'instance de SqlParameter.



/*
coq
MVP Visual C#
CoqBlog
*/
dimanche 11 mai 2008 à 22:33:25 | Re : Lier 3 tables

coq

Administrateur CodeS-SourceS
Et il faut bien entendu que la requête lui affecte une valeur.



/*
coq
MVP Visual C#
CoqBlog
*/
lundi 12 mai 2008 à 00:47:15 | Re : Lier 3 tables

tintin972


Ma maniere de faire est la suivante...

Dans mon dataset je définis la requete et dans les propriétés je définis un paramètre avec en direction output. Je le fais donc avec l'assistant mais je pense que ca équivaut à ce que tu préconise...

Pour affecté la valeur retour je définis une variable para (j'ai mi le ? par rapport aux erreur qui m'étaient retournés)...et je la place en utilisant out dans mon appel...

decimal? para;
this.TableAdapter.Fill(this.mBSDBDataSet.PR_CP_DETAIL, out para);

Mais para semble être toujours null...

1 2

Cette discussion est classée dans : afficher, id, detail, compo, dgvdetail


Répondre à ce message

Sujets en rapport avec ce message

Bonjour [:)] [ par metasys ] Bonjour tlm, J'ai 2 questions. La premiere, j'aimerais savoir comment je fais pour aller lire dans un champ d'une Db MSSL du XML pour ensuite l'affich Afficher le detail dans un nouveau formulaire [ par mimille63 ] Bonjour,Je souhaite afficher un datagrid d'entete de commande sur un formulaire et je voudrais qu'en double cliquant sur une ligne de ce datagrid, les comment afficher une colonne de ma table ? [ par prodotnet ] Bonjours tout le monde ,.j'ai réussi a me connecter a ma BD SQL  Server 2005  avec C#- cette BD contient une table "famille" .-cette table contient a C# Récupérer contenu d'une listbox et afficher dans un textbox [ par stef du 62 ] Bonjour, actuellement en projet de BTS et n'ayant pas étudié le c# , j'ai un peu de mal ^^.Je récupére sur pda un fichier texte dont j'affiche le cont Comment afficher dans la barre des taches sans avoir de Fenetre? [ par vinzemuls ] Bonjour,Voilà j'ai créée une application qui peut fonctionner en mode "Batch" ou en mode "Interface".J'ai donc créé une condition dans Program.cs:   i Affichage de sous-repertoire puis de fichiers [ par mathew77 ] Bonjour,je suis actuellement en DUT alternance et j'ai besoin de réaliser un petit programme pour mon entreprise en C#.Je dois en effet à partir d'un Afficher qu'une partie d'une image, et la deplacer [ par yorundr ] Bonjour,j'aurais besoin de votre aide pour quelque chose que je veut faire. Et je ne sais pas si c'est possible, ni comment le faire.On affiche une im C# et ado.net comment inserer une ligne dans ma table ? [ par prodotnet ] Bonjour a tous , je suis débutant en C# et je cherche comment insérer une ligne dans ma table "famille" qui contient 2 colonnes "id" et "nom" sachant insérer des données dans une datagridview [ par zoplaka ] Salut  à tous je suis debutant en c# je voudrais solliciter l'aide des uns et des autres dans le soucie de palier mes difficultés à afficher des éléme


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales