none
Un calcul un peu spécial RRS feed

  • Question

  • Plop !

     

    Celui qui dit que jfais pas vivre le forum c'est un menteur Stick out tongue.

     

    L'idée ici est que:

     

    dans ma base de donnée, ma table xdb_recette contient le champ price (prix ^^).

    et qu'il est initialisé à 0.

     

    Maintenant nous rajoutons des composants. le prix va changé. L'idée est donc que dans ma form "frmViewRecette" j'inclue la requete suivante:

    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

     

    ça me calcul le prix total, et de la, je le INSERT dans ma table recette, qui l'affiche en même temps que toutes mes recettes. ? C'est comme faire un chemin inverse quoi ^^.

     

    Jsais pas si jsuis compréhensible :/

     

    Meilleure salutation

    mardi 6 mai 2008 09:23

Toutes les réponses

  • Bonjour,

     

    1/Il est impossible que les TableAdapter/DataAdater génère des insert à partir des jointures... (Trop complexes)

    2/Il y a redondance dans votre base de données le fait de vouloir mettre le prix de la recette alors que vous pouvez le calculer automatiquement via une requête SQL...

     

    Cordialement

    mardi 6 mai 2008 11:52
    Modérateur
  • Hello,

     

    Merci pour ta réponse,

     

    Je vais donc simplement utiliser la requête.

    Je l'ai ici dans la form "frmEditRecette":

     

    bool bTotalPrice = mydatabase.SelectRecette("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 WHERE recette=" + _idRecette + ";");

     

    Comment faire maintenant pour afficher ce résultat dans mon

    toolStripStatusLabel1 ?

     

    Point 2:

     

    Une fois que 1 produit est enregistrer dans la recette, je veux pouvoir modifié et enregistrer directement la quantitié par le dataGridView. Il n'a donc pas de readOnly = true, mais, si je le modifie, sa n'enregistre pas dans la base de donnée ni ne recalcul le prix.

     

    Code de la form:

     

    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.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 + ";");

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

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

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

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

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

    kryptonDataGridView1.AutoGenerateColumns = true;

    kryptonDataGridView1.Refresh();

    DataTable table = (DataTable)kryptonDataGridView1.DataSource;

    bool bTotalPrice = mydatabase.SelectRecette("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 WHERE recette=" + _idRecette + ";");

    toolStripStatusLabel1.Text = "Prix total: " + totalPrice.ToString() + "CHF";

    }

    public frmEditRecette()

    {

    InitializeComponent();

    }

    private void toolStripButton1_Click(object sender, EventArgs e)

    {

    frmAddTheToRecette _frmAddTheToRecette = new frmAddTheToRecette();

    _frmAddTheToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton2_Click(object sender, EventArgs e)

    {

    frmAddAromToRecette _frmAddAromToRecette = new frmAddAromToRecette();

    _frmAddAromToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton3_Click(object sender, EventArgs e)

    {

    frmAddDecoToRecette _frmAddDecoToRecette = new frmAddDecoToRecette();

    _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();

    }

    }

    }

    mardi 6 mai 2008 12:14
  •  Gilles TOURREAU A écrit:

    2/Il y a redondance dans votre base de données le fait de vouloir mettre le prix de la recette alors que vous pouvez le calculer automatiquement via une requête SQL...

     

    Effectivement, Gilles à raison sur ce point, si tu peux calculer à partir d'une requête SQL, tu ne dois pas répeter les valeurs ailleurs, car peut créé des erreurs d'intégrité de tes données (Pas le bon prix).

    mardi 6 mai 2008 12:44
    Modérateur
  • Soit,

    il faut alors récuperer le prix et la quantitié dans le dataGridView :/

     

    Je vais récupéré le code

     

    Edit:

     

    Voila:

    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.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 + ";");

    kryptonDataGridView1.DataSource = mydatabase.myDataTable;

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

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

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

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

    kryptonDataGridView1.AutoGenerateColumns = true;

    kryptonDataGridView1.Refresh();

    DataTable table = (DataTable)kryptonDataGridView1.DataSource;

    double totalPrice = 0;

    foreach (DataRow row in table.Rows)

    {

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

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

    }

    toolStripStatusLabel1.Text = "Prix total: " + totalPrice.ToString() + "CHF";

    }

    public frmEditRecette()

    {

    InitializeComponent();

    }

    private void toolStripButton1_Click(object sender, EventArgs e)

    {

    frmAddTheToRecette _frmAddTheToRecette = new frmAddTheToRecette();

    _frmAddTheToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton2_Click(object sender, EventArgs e)

    {

    frmAddAromToRecette _frmAddAromToRecette = new frmAddAromToRecette();

    _frmAddAromToRecette.ShowDialog();

    dataBaseReload();

    }

    private void toolStripButton3_Click(object sender, EventArgs e)

    {

    frmAddDecoToRecette _frmAddDecoToRecette = new frmAddDecoToRecette();

    _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();

    }

    }

    }

     

     

    Comment et ou dire maintenant:

     

    Si la valeur de la conne qt a changé {

     update la database;

    dataBaseReload();

    }

     

    ?

    mardi 6 mai 2008 12:47