begin process at 2012 02 08 06:20:29
  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 Afficher des données dans des labels [ par menouni67 ] salut je suis entrain de programmer une application de gestion de notes en asp.net en utilisant c# mon problem c'est que il faut que que programmer un Afficher un rapport [ par saku28 ] Bonjour, Suite à des recherches sur la création d'état avec WPF, j'ai créer un rapport via l'assistant de visual studion (ajout nouvel élement >> Rapp retourne tableau en C# [ par houba80 ] Slaut cher mombre je suis entrain de developper un GED avec C#, j'ai une classe Groupe qui contient la méthode id_groupe(), cette derniere va me renvo afficher une calendrier en cliquant sur un textbox [ par maroueniag ] Bonjour à tous, pouvez vous m'aider à trouver le code lorsque l'utilisateur clique sur un textBox pour saisir une date, un calendrier apparait pour fa Afficher document office ou pdf ou image dans un Form C# [ par houba80 ] Salut, je veux récupérer mes documents office PDF et image (jpg, bmp...) qui sont enregistrer dans une base SQLServer 2008 et les afficher dans un for


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 3,136 sec (3)

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