begin process at 2008 05 16 18:23:26
1 173 622 membres
440 nouveaux aujourd'hui
13 972 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Lier 3 tables [ Base de données / SQL Server ] (tintin972)

Lier 3 tables le 09/05/2008 13:02:36

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...

Re : Lier 3 tables le 09/05/2008 13:33:05

coq
(Admin CS)
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
*/

Re : Lier 3 tables le 09/05/2008 14:00:59

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...





Re : Lier 3 tables le 09/05/2008 16:22:21

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??


Re : Lier 3 tables le 09/05/2008 16:51:46

coq
(Admin CS)
Moi et le databinding, ça fait 2, il va falloir attendre quelqu'un d'autre.



/*
coq
MVP Visual C#
CoqBlog
*/

Re : Lier 3 tables le 09/05/2008 18:20:02

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.

Re : Lier 3 tables le 10/05/2008 11:40:44

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...


Re : Lier 3 tables le 11/05/2008 22:29:32

coq
(Admin CS)
Pour l'output, ça se joue avec la propriété ParameterDirection de l'instance de SqlParameter.



/*
coq
MVP Visual C#
CoqBlog
*/

Re : Lier 3 tables le 11/05/2008 22:33:25

coq
(Admin CS)
Et il faut bien entendu que la requête lui affecte une valeur.



/*
coq
MVP Visual C#
CoqBlog
*/

Re : Lier 3 tables le 12/05/2008 00:47:15

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...


[Page 1 Page 2]
Classé sous : afficher, id, detail, compo, dgvdetail

Participer à cet échange

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS