none
Return 0 RRS feed

  • Question

  • Bonjour,

     

    Après plusieurs heure de recherche accompagné de Radric (que je remercie, en passant), nous avons un problème quand à l'affichage des détails des recettes. Je m'explique:

     

    Voila que j'ai 2 forms :

    - frmViewRecette qui possède un bouton frmViewDetailRecette.

    - frmViewRecettte possède un datagridView, au meme titre que frmViewDetailRecette.

     

    Lorsque nous avons selectionner la recette qui nous intéresse et cliquer sur le bouton, frmViewDetailRecette doit afficher les produits de la recette.

     

    exemple:

    frmViewRecette a la recette "Tomates Farcie". Lorsque l on clique sur la détail, frmViewDetailRecette doit afficher les composants de cette recette, soit:

     

    - 1 tomate

    - des condiments

    - de la viande hachés

    - de la sauce

     

    Voilà donc mes codes:

     

    frmViewRecette:

     

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using ComponentFactory.Krypton.Toolkit;

    namespace TheProject

    {

    public partial class frmViewRecette : ComponentFactory.Krypton.Toolkit.KryptonForm, Observateur

    {

    public frmViewRecette()

    {

    InitializeComponent();

    }

    private void toolStripButton1_Click(object sender, EventArgs e)

    {

    frmNewRecette _frmNewRecette = new frmNewRecette();

    _frmNewRecette.Show();

    }

    private void frmViewRecette_Load(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool connectionStatus = mydatabase.SelectArome("SELECT * FROM xdb_recette;");

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

    kryptonDataGridView1.Columns["name"].HeaderText = "Nom";

    kryptonDataGridView1.Columns["id"].Visible = false;

    kryptonDataGridView1.Columns["price"].Visible = false;

    kryptonDataGridView1.Refresh();

    }

    private void toolStripButton2_Click(object sender, EventArgs e)

    {

    frmEditRecette _frmEditRecette = new frmEditRecette();

    _frmEditRecette.Show();

    }

    private void toolStripButton4_Click(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool connectionDeleteStatus = mydatabase.updateAll("DELETE FROM xdb_recette WHERE id=" + kryptonDataGridView1.CurrentRow.Cells["Id"].Value.ToString() + ";");

    bool connectionDeleteStatus1 = mydatabase.updateAll("DELETE FROM xdb_recetteComposant WHERE recette=" + kryptonDataGridView1.CurrentRow.Cells["Id"].Value.ToString() + ";");

    if (connectionDeleteStatus == false)

    {

    //remplacer cette ligne par une écriture dans un log à l'avenir

    }

    MessageBox.Show("La recette à été supprimé avec succès", "Supression de recette", MessageBoxButtons.OK, MessageBoxIcon.Information);

    kryptonDataGridView1.Refresh();

    }

    private void btnViewDetail_Click(object sender, EventArgs e)

    {

    frmViewDetailRecette _frmViewDetailRecette = new frmViewDetailRecette();

    _frmViewDetailRecette.IdRecette = (int)kryptonDataGridView1.CurrentRow.Cells["Id"].Value;

    if (_frmViewDetailRecette.InitializeData() == true)

    {

    _frmViewDetailRecette.Show();

    }

    }

    }

    }

     

     

    le code source de frmViewDetailRecette:

     

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using ComponentFactory.Krypton.Toolkit;

    namespace TheProject

    {

    public partial class frmViewDetailRecette : ComponentFactory.Krypton.Toolkit.KryptonForm

    {

    private int _idRecette;

    public int IdRecette

    {

    get { return _idRecette; }

    set { _idRecette = value; }

    }

    private void frmViewDetailRecette_Load(object sender, EventArgs e)

    {

    }

    public bool InitializeData()

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool mySelect = mydatabase.SelectRecette("SELECT xdb_element.name name, xdb_element.price price, xdb_category.name cat, xdb_recettecomposant.qt qt FROM xdb_element LEFT JOIN xdb_recettecomposant ON xdb_recettecomposant.element = xdb_element.id LEFT JOIN xdb_category ON xdb_category.id=xdb_element.category WHERE xdb_recettecomposant.recette=" + _idRecette.ToString() + ";");

    if (mydatabase.myDataTable.Rows.Count == 0)

    {

    MessageBox.Show("Vous devez d'abord remplir la recette", "erreur", MessageBoxButtons.OK, MessageBoxIcon.Information);

    return false;

    }

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

    kryptonDataGridView1.Columns["catName"].Visible = false;

    kryptonDataGridView1.Columns["category"].Visible = false;

    kryptonDataGridView1.Columns["id"].Visible = false;

    kryptonDataGridView1.Columns["name"].HeaderText = "Nom";

    kryptonDataGridView1.Columns["price"].HeaderText = "Prix/kg";

    //Calcul du prix total de la recette

    DataTable table = (DataTable)kryptonDataGridView1.DataSource;

    double totalPrice = 0;

    foreach (DataRow row in table.Rows)

    {

    totalPrice += Double.Parse(row["price"].ToString());

    totalPrice += Double.Parse(row["tva"].ToString());

    }

    toolStripStatusLabel1.Text = totalPrice.ToString();

    return true;

    }

    }

    }

     

     

    Comme vous pouvez le constater, des get/set qui récupère les valeurs sont bel et bien  présente (Merci Radric Wink).

     

    Il me dit sans cesse: "Vous devez remplir la recette", alors que ces recettes ont effectivement des produits qui les composent.

     

    Voilà voilà, si vous avez des questions voir une solution (Wink), je suis à votre disposition !

     

    Meilleures salutations ! 

     

    lundi 5 mai 2008 07:17

Toutes les réponses

  • Bonjour,

     

    Je cré ce sous-poste car l'erreur y est assez proche.

     

    Comme le montre le code ci-dessus, j'ai un bouton qui va ouvrir la form frmEditRecette. C'est dans cette forme que j'rajouterai des composanta à mes recettes.

     

    Voilà le code de cette dernière:

     

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Text;

    using System.Windows.Forms;

    using ComponentFactory.Krypton.Toolkit;

    namespace TheProject

    {

    public partial class frmEditRecette : ComponentFactory.Krypton.Toolkit.KryptonForm

    {

    private int _idRecette;

    public int IdRecette

    {

    get { return _idRecette; }

    set { _idRecette = value; }

    }

    private int _idProduct;

    public int IdProduct

    {

    get { return _idProduct; }

    set { _idProduct = value; }

    }

    private void dataBaseReload()

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool connectionStatus = mydatabase.SelectRecette("SELECT xdb_element.name name, xdb_category.name cat, qt FROM xdb_recetteComposant LEFT JOIN xdb_element ON xdb_element.id = xdb_recetteComposant.element LEFT JOIN xdb_category ON xdb_category.id = xdb_element.category WHERE recette=" + _idRecette.ToString() + ";");

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

    //kryptonDataGridView1.Columns["id"].Visible = false;

    kryptonDataGridView1.Columns["name"].HeaderText = "Nom";

    kryptonDataGridView1.CurrentRow.Cells["name"].ReadOnly = true;

    kryptonDataGridView1.Columns["cat"].HeaderText = "Catégorie";

    kryptonDataGridView1.CurrentRow.Cells["cat"].ReadOnly = true;

    kryptonDataGridView1.Columns["qt"].HeaderText = "Quantité";

    kryptonDataGridView1.AutoGenerateColumns = true;

    kryptonDataGridView1.Refresh();

    DataTable table = (DataTable)kryptonDataGridView1.DataSource;

    }

    public frmEditRecette()

    {

    InitializeComponent();

    }

    private void toolStripButton1_Click(object sender, EventArgs e)

    {

    frmAddTheToRecette _frmAddTheToRecette = new frmAddTheToRecette();

    //_frmAddTheToRecette.IdRecette = Int32.Parse(kryptonDataGridView1.CurrentRow.Cells["Id"].Value.ToString());

    _frmAddTheToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton2_Click(object sender, EventArgs e)

    {

    frmAddAromToRecette _frmAddAromToRecette = new frmAddAromToRecette();

    //_frmAddAromToRecette.IdRecette = Int32.Parse(kryptonDataGridView1.CurrentRow.Cells["Id"].Value.ToString());

    _frmAddAromToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton3_Click(object sender, EventArgs e)

    {

    frmAddDecoToRecette _frmAddDecoToRecette = new frmAddDecoToRecette();

    //_frmAddDecoToRecette.IdRecette = Int32.Parse(kryptonDataGridView1.CurrentRow.Cells["id"].Value.ToString());

    _frmAddDecoToRecette.ShowDialog();

    dataBaseReload();

    }

    private void frmEditRecette_Load(object sender, EventArgs e)

    {

    dataBaseReload();

    }

    private void toolStripButton4_Click(object sender, EventArgs e)

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool insertArome = mydatabase.updateAll("DELETE FROM xdb_recetteComposant WHERE id=" + kryptonDataGridView1.CurrentRow.Cells["id"].Value.ToString() + "");

    MessageBox.Show("Suppression des données effectuées avec succès", "suppression", MessageBoxButtons.OK, MessageBoxIcon.Information);

    dataBaseReload();

    }

    }

    }

    Edit: je me suis mal exprimer. Chaque recette contient les memes composants. Ce qui est faux car 2 viandes pourront avoir le meme sel mais pas la meme sauce ^^. C'est donc au niveau en effet des id que sa bug. Image:

     

    http://img241.imageshack.us/my.php?image=productviewerrorxh2.png

     

    Je ne sais pas si je suis compréhensible, mais dans le cas contraire, dite le moi ! Stick out tongue

     

    Meilleures salutations !

    lundi 5 mai 2008 07:57
  • Bonjour,

    Avez vous en debug récupéré la valeur de _idRecette et essayé ensuite d'exécuter votre requête SQL directement sur la base ? (Il y a peut être une erreur dans la requête ?)

    lundi 5 mai 2008 08:01
  • Bonjour,

     

    La requete est juste (pour l'avoir essayé dans le PHPMyAdmin - elle ne retourne rien:

     

    MySQL n'a retourné aucun enregistrement. (traitement: 0.0008 sec.)
    requête SQL:
    SELECT xdb_element.name name, xdb_category.name cat, qt
    FROM xdb_recetteComposant
    LEFT JOIN xdb_element ON xdb_element.id = xdb_recetteComposant.element
    LEFT JOIN xdb_category ON xdb_category.id = xdb_element.category
    WHERE recette =12
    LIMIT 0 , 30

     

     

    )

     Radric m'avais fais voir la valeur retourné, mais je sais plus, 0 ou false je croix. Comment je peux revérifier?

     

     

     

    lundi 5 mai 2008 08:04
  • Bonjour,

    Si votre requête ne renvoi aucun résultat, il est normal que vous ayez votre message d'erreur, vu que celui-ci se base sur la présence de lignes retournées par la requête.

    Si elle devrait retourner des données pour un identifiant donnée, il faudrait la revoir.
    lundi 5 mai 2008 08:54
  • Bonjour,

     

    J'ai pourtant des données (que j'ai inséré via MySQL), alors si je prends le bouton edit, pour les 2 id de recette que j'ai, il m'affiche le meme nombre de ligne. Alors que 1 devrait en avoir qu'une et l'autre trois. Et lorsque je clic sur les détails il me donne le message d'erreur.

     

    Meilleure salutation

     

    lundi 5 mai 2008 08:58
  • Bonjour,

    Pourriez-vous m'envoyer un export de votre base de données (structure + données) à l'email "guillaume.rouchon<arobase>winwise.fr" ? Ou si vous avez un accès extérieur via phpmyadmin, les identifiants pour y accéder ?

    lundi 5 mai 2008 10:44
  • Bonjour,

     

    Ca part dans 2minutes :]

     

    Merci encore !

    lundi 5 mai 2008 10:48
  • Bonjour Guillaume,

     

    Avez-vous des nouvelles quand à mon problème?

     

    Merci encore :]

     

     

    Sur un autre forum on me dit qu il faut initialiser IdRecette ???

    mardi 6 mai 2008 07:00
  •  

    IdRecette tu l'initialises juste avant le show  (sinon tu ne pourrais pas avoir une valeur comme 12).

     

    La démarche de guillaume est la bonne. Ton problème se situe au niveau de la requete ou des données.

    mardi 6 mai 2008 07:30
  • Bonjour,

    Votre requête est "correcte", ce sont vos données qui ne le sont pas et plus particulièrement la table xdb_recettecomposant :

    • Dans la colonne recette, vous avez des valeurs à 0 alors qu'il s'agit d'une clé étrangère vers la table xdb_recette qui ne contient aucune ligne avec un id 0.
    • Dans la colonne element, vous avez les valeurs 1, 2 et 3 alors qu'il s'agit d'une clé étrangère vers la table xdb_element qui ne contient qu'une ligne avec un id 31.

    Sous SQL Server, tant que les clés étrangères étaient spécifiées, je n'ai pas pu insérer vos données. Il doit y avoir un problème avec MySQL qui ne prend pas en compte ces clés étrangères et à donc permis à votre base d'avoir des données "corrompu".

    La Solution est de remettre à jour vos données (via phpMyAdmin par exemple).

     

    Par ailleurs, même si la requête renverra les données souhaitées, je l'aurai formulé autrement. Le point de départ de votre requête est la recette dont vous voulez récupérer les élements et leur catégorie associé :

     

    Code Snippet

    SELECT

    xdb_element.name name,

    xdb_element.price price,

    xdb_category.name cat,

    xdb_recettecomposant.qt qt

    FROM

    xdb_recettecomposant

    INNER JOIN xdb_element ON

    xdb_element.id = xdb_recettecomposant.element

    INNER JOIN xdb_category ON

    xdb_category.id = xdb_element.category

    WHERE

    xdb_recettecomposant.recette = 12

     

     

    En mettant votre requête comme ci dessus, vous optimisé les performances en utilisant des INNER JOIN au lieu de LEFT JOIN et est pour moi plus compréhensible car l'ordre des tables et leur jointure suit la logique que l'on exprimerait à l'orale :

    "Pour ma recette 12, je récupère ses éléments et les catégories associées à ces éléments".

     

    mardi 6 mai 2008 08:07
  • Bonjour,

     

    Merci pour votre soutiens !

     

    Mon chef m'a fait un petit cours de ces LEFT JOIN et INNER . Suite à ça nous avons revu nos requetes qui fonctionne maintenant sous MySQL:

     

     

    calcul du prix:

    SELECT xdb_recettecomposant.recette, sum(qt), sum(qt * price) / sum(qt) priceperkg
    FROM xdb_element
    INNER JOIN xdb_recettecomposant ON xdb_element.id = xdb_recettecomposant.element
    GROUP BY recette

     

    selection:

    SELECT xdb_element.id, xdb_element.name, xdb_element.price elementprice, xdb_category.name category, xdb_recette.name recette, xdb_recettecomposant.qt, ( xdb_recettecomposant.qt * xdb_element.price ) price
    FROM xdb_element
    INNER JOIN xdb_recettecomposant ON xdb_element.id = xdb_recettecomposant.element
    INNER JOIN xdb_recette ON xdb_recettecomposant.recette = xdb_recette.id
    INNER JOIN xdb_category ON xdb_element.category = xdb_category.id
    ORDER by recette

     

    Maintenant, J'ai une erreur:

     

    "La référence d'objet n'est pas instancié à une instance d'objet"

     

    Form: frmEditRecette

    ligne:  kryptonDataGridView1.Columns["cat"].HeaderText = "Catégorie";

    code:

    private void dataBaseReload()

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool connectionStatus = mydatabase.SelectRecette("SELECT xdb_element.id, xdb_element.name, xdb_element.price, xdb_category.name category, xdb_recette.name recette, xdb_recettecomposant.qt FROM xdb_element INNER JOIN xdb_recettecomposant ON xdb_element.id = xdb_recettecomposant.element INNER JOIN xdb_recette ON xdb_recettecomposant.recette = xdb_recette.id INNER JOIN xdb_category ON xdb_element.category = xdb_category.id ORDER by recette;");

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

    //kryptonDataGridView1.Columns["id"].Visible = false;

    kryptonDataGridView1.Columns["name"].HeaderText = "Nom";

    kryptonDataGridView1.CurrentRow.Cells["name"].ReadOnly = true;

    kryptonDataGridView1.Columns["cat"].HeaderText = "Catégorie";

    kryptonDataGridView1.CurrentRow.Cells["cat"].ReadOnly = true;

    kryptonDataGridView1.Columns["qt"].HeaderText = "Quantité";

    kryptonDataGridView1.AutoGenerateColumns = true;

    kryptonDataGridView1.Refresh();

    DataTable table = (DataTable)kryptonDataGridView1.DataSource;

    }

     

    Et, la même erreur:

     

    Form: frmViewDetailRecette

    ligne:

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

    Code:

    public bool InitializeData()

    {

    dataBase mydatabase = new dataBase("localhost", "theproject", "root");

    bool mySelect = mydatabase.SelectRecette("SELECT xdb_element.id, xdb_element.name, xdb_element.price, xdb_category.name category, xdb_recette.name recette, xdb_recettecomposant.qt FROM xdb_element INNER JOIN xdb_recettecomposant ON xdb_element.id = xdb_recettecomposant.element INNER JOIN xdb_recette ON xdb_recettecomposant.recette = xdb_recette.id INNER JOIN xdb_category ON xdb_element.category = xdb_category.id ORDER by recette;");

    if (mydatabase.myDataTable.Rows.Count == 0)

    {

    MessageBox.Show("Vous devez d'abord remplir la recette", "erreur", MessageBoxButtons.OK, MessageBoxIcon.Information);

    return false;

    }

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

    kryptonDataGridView1.Columns["catName"].Visible = false;

    kryptonDataGridView1.Columns["category"].Visible = false;

    kryptonDataGridView1.Columns["id"].Visible = false;

    kryptonDataGridView1.Columns["name"].HeaderText = "Nom";

    kryptonDataGridView1.Columns["price"].HeaderText = "Prix/kg";

    //Calcul du prix total de la recette Ces lignes vont être modifier, le calcul du prix est fait par MySQL

    DataTable table = (DataTable)kryptonDataGridView1.DataSource;

    double totalPrice = 0;

    foreach (DataRow row in table.Rows)

    {

    totalPrice += Double.Parse(row["price"].ToString());

    totalPrice += Double.Parse(row["tva"].ToString());

    }

    toolStripStatusLabel1.Text = totalPrice.ToString();

    return true;

    }

     

     

    Je vous remercie infiniment du soutiens que vous me portez!

     

    mardi 6 mai 2008 08:57
  • Concernant la première erreur tu n'as pas de colonne  "cat" mais une colonne category d'où ton problème.

     

    Pour la deuxième je ne sais pas. La requête donne bien quelquechose ?

    mardi 6 mai 2008 09:19
  • C'est la meme requete Wink

     

    Edit:

     

    J'ai modifier la requete, car en effet si je cliquait sur la recette "café" j'avais aussi les composants de l'autre recette. Donc, il me faut utiliser les get set idRecette n'est-ce pas :}

     

    J'ai alors modifier la requete:

    bool connectionStatus = mydatabase.SelectRecette("SELECT xdb_element.id, xdb_element.name, xdb_element.price, xdb_category.name category, xdb_recette.name recette, xdb_recettecomposant.qt FROM xdb_element INNER JOIN xdb_recettecomposant ON xdb_element.id = xdb_recettecomposant.element INNER JOIN xdb_recette ON xdb_recettecomposant.recette = xdb_recette.id INNER JOIN xdb_category ON xdb_element.category = xdb_category.id WHERE recette=" + _idRecette.ToString() + ";");

     

    Qui ne m'affiche plus rien dans aucune des 2 recettes. Hors, si je vais dans mon MySQL et que je vais

     

    SELECT xdb_element.id, xdb_element.name, xdb_element.price, xdb_category.name category, xdb_recette.name recette, xdb_recettecomposant.qt FROM xdb_element INNER JOIN xdb_recettecomposant ON xdb_element.id = xdb_recettecomposant.element INNER JOIN xdb_recette ON xdb_recettecomposant.recette = xdb_recette.id INNER JOIN xdb_category ON xdb_element.category = xdb_category.id WHERE recette=12

     

    12 étant l'id de ma recette café, il m'affiche les bon composants.

     

    pourquoi?

    mardi 6 mai 2008 09:27
  • Bonjour,

    Si votre requête marche sous MySQL et non dans votre appli, il faudrait en debug voir exactement la requête envoyé à la base par votre méthode SelectRecette par exemple.

    mardi 6 mai 2008 10:20
  • Edit:

     

    J'ai pu corriger le soucis.

     

    J'ai cependant denouveau cette erreur d'instance d'objet.

     

    Si je place le point rouge (point d'arreter) et que j'execute (F5) c'est normal que je ne vois aucune valeur?

     

    Edit:

     

    J'ai pu m'arranger autrement !

     

    Merci en tout cas Wink

    mardi 6 mai 2008 10:51