验证方法无法按预期工作

时间:2015-04-23 18:43:12

标签: c# validation math

一些背景

我正在尝试创建一个管理产品订单的表单应用程序。我正在使用MS Access数据库(但这对于这个问题并不重要)来存储有关产品,订单等的所有数据。我相信我在这里有一个相当具体的问题,我无法理解我是如何制作的这行得通。一些建议/想法会很棒。

在我的订单表单中,我有一个事件btn_AddToOrder_Click,它添加了有关产品的信息(产品名称,产品SKU,每个产品价格(来自数据库))和要添加的数量(从数字向上对象)到数据网格视图。

问题

我的btn_AddToOrder_Click事件代码验证在将产品添加到订单之前,有足够数量的所需产品添加到订单中。如果产品已经在订单中,那么它只会添加数量,如果没有,它将添加所有细节。只要订单是新订单,这一切都可以正常工作。如果订单是已经存在的订单(即更改按钮将在更改后点击),并且我尝试将订单中已有的任何数量的任何数量添加到订单中,那么带有"的消息框只有" + tempProductStock +"这些产品有货。"显示器。例如,如果已经有产品" x"在数量为4的顺序中,有2个相同的产品" x"有货,我尝试添加2个相同的产品" x"对于订单(以及数据网格视图和ItemOrder列表),它只会添加2个产品" x"如果我正在下新订单如果已经将订单详细信息加载到表单对象中,并且没有加载"这些产品中只有2个已经存货,那么它并不存在。"会显示。

注意

当我说订单信息被加载到表单对象中时,我的意思是表单上有一个组合框,其中列出了所有已保存的订单,选择一个将填写有关订单的所有信息到表单中。< / p>

btn_AddToOrder_Click事件代码

private void btn_AddToOrder_Click(object sender, EventArgs e)
    {
        bool productInOrder = false;
        tempProductQuantityToAdd = Convert.ToInt32(numericUpDown1.Value);
        int tempTotalProductQuantity = tempProductQuantityToAdd;
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.Cells[0].Value.ToString() == tempProductName)
            {
                productInOrder = true;
                tempTotalProductQuantity += Convert.ToInt32(row.Cells[2].Value);
            }
        }
        if (cobo_Products.Text == "")
        {
            MessageBox.Show("Please select a product to add to the order.");
        }
        else if (tempProductQuantityToAdd < 1)
        {
            MessageBox.Show("Cannot add a product to an order without any quantity.");
        }
        else if (tempProductStock == 0)
        {
            MessageBox.Show("There are none of these products in stock.");
        }
        else if (tempTotalProductQuantity > tempProductStock) //CAUSING SOME ERRORS HERE?
        {
            MessageBox.Show("There are only " + tempProductStock + " of these products in stock.");
        }
        else
        {
            if (productInOrder)
            {
                MessageBox.Show("Product is already in this order. Product quantity will be added to the order.");
                foreach (DataGridViewRow row in dataGridView1.Rows) //Add quantity to specified product in data grid view
                {
                    if (row.Cells[0].Value.ToString() == tempProductName)
                    {
                        row.Cells[2].Value = Convert.ToInt32(row.Cells[2].Value) + tempProductQuantityToAdd;
                    }
                }
                //Change product quantity of specific product in list itemOrder
                //Currently deletes specific product then adds that product again with quantity increased
                for (int i = 0; i < itemOrder.Count; i++)
                {
                    if (itemOrder[i].productName == tempProductName)
                    {
                        var productDetails = new ProductDetails();
                        productDetails.productName = tempProductName;
                        productDetails.productSKU = tempProductSKU;
                        productDetails.productRP = tempProductRP;
                        productDetails.productWP = tempProductWP;
                        productDetails.productQuantity = tempTotalProductQuantity;
                        productDetails.previousProductQuantity = itemOrder[i].previousProductQuantity;
                        productDetails.productStock = tempProductStock;
                        productDetails.productSold = tempProductSold;
                        itemOrder.RemoveAt(i);
                        itemOrder.Add(productDetails);
                    }
                }
            }
            else if (tempProductQuantityToAdd >= 1)
            {
                //Add product to list
                var productDetails = new ProductDetails();
                productDetails.productName = tempProductName;
                productDetails.productSKU = tempProductSKU;
                productDetails.productRP = tempProductRP;
                productDetails.productWP = tempProductWP;
                productDetails.productQuantity = tempProductQuantityToAdd;
                productDetails.previousProductQuantity = productDetails.productQuantity;
                productDetails.productStock = tempProductStock;
                productDetails.productSold = tempProductSold;
                itemOrder.Add(productDetails);
                //Add the product to data grid
                dataGridView1.Rows.Add(tempProductName, tempProductSKU, tempProductQuantityToAdd, tempProductRP);
            }
            //Total the order
            orderTotal += tempProductRP * tempProductQuantityToAdd;
            if (txt_DiscountFixed.Text != "0")
            {
                discountFixed = Convert.ToDecimal(txt_DiscountFixed.Text);
                txt_Total.Text = "Total: £" + (orderTotal - discountFixed + shippingCost);
            }
            else if (txt_DiscountPercentage.Text != "0")
            {
                discountPercentage = Convert.ToInt32(txt_DiscountPercentage.Text);
                txt_Total.Text = "Total: £" + (Math.Round(Convert.ToDecimal(orderTotal) * (1 - Convert.ToDecimal(discountPercentage) / 100), 2) + shippingCost);
            }
            else
            {
                txt_Total.Text = "Total: £" + (orderTotal + shippingCost);
            }
            //Test the list itemOrder - display its contents
            //StringBuilder sb = new StringBuilder();
            //foreach (ProductDetails item in itemOrder)
            //{
            //    sb.AppendLine("Name: " + item.productName + ", SKU: " + item.productSKU + ", RP: " + item.productRP + ", WP: " + item.productWP + ", Qty: " + item.productQuantity + ", Stock: " + item.productStock + ", Sold: " + item.productSold);
            //}
            //MessageBox.Show(sb.ToString());
        }
    }

如何设置tempProductStock

private void cobo_Products_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            connection.Open();
            OleDbCommand command = new OleDbCommand();
            command.Connection = connection;
            string query = "select * from Products where ProductName= '" + cobo_Products.Text + "'";
            //MessageBox.Show(query);
            command.CommandText = query;
            OleDbDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                tempProductName = reader["ProductName"].ToString();
                tempProductSKU = reader["ProductSKU"].ToString();
                tempProductRP = Convert.ToDecimal(reader["RP"]);
                tempProductWP = Convert.ToDecimal(reader["WP"]);
                tempProductStock = Convert.ToInt32(reader["Stock"]);
                tempProductSold = Convert.ToInt32(reader["Sold"]);
            }
            connection.Close();
            //MessageBox.Show(tempProductName +", "+ tempProductSKU +", "+ tempProductRP +", "+ tempProductWP +", "+ tempProductStock +", "+ tempProductSold);
        }
        catch (Exception ex)
        {
            connection.Close();
            MessageBox.Show("Error " + ex);
        }
    }

我非常欣赏一些关于如何使这项工作成功的想法。提前谢谢。

我感谢我可能没有提供回答我的问题所需的所有信息。如果我能提供更多内容,请告诉我。不幸的是,我无法在我的问题中添加图片,这让我有点难以解释。

1 个答案:

答案 0 :(得分:1)

使用您的示例:

1.   Product: Gloves          Qty in order: 4          Qty in stock: 2

然后,用户选择添加2个相同的产品,您的方法将执行以下计算:

set tempTotalProductQuantity to 2
add existing orders (4) to tempTotalProductQuantity (2)
if tempTotalProductQuantity is more than in stock.. (6 > 2)
  display "There are only 2 in stock.." (the 2 from stock variable) 

那么解决方案是什么?

由于您已经在订单中添加了4,并从库存中扣除了这一点,因此您不应检查tempTotalProductQuantity(因为这是总数,包括已扣除的数量)。而是检查用户想要立即添加的数量tempProductQuantityToAdd

else if (tempProductQuantityToAdd > tempProductStock)

当然有很多方法可以解决这个问题。另一种方法是使用已存在的变量增加tempProductStock变量:

else if (tempTotalProductQuantity > (tempTotalProductQuantity - tempProductQuantityToAdd + tempProductStock))

这将检查库存的总订单数量+订单中的数量。所以在这种情况下,它将是6 > (6 - 2 + 2)

编辑:

这假设您在插入新订单时从库存中扣除。否则,我不知道订单如何包含4种产品,只有2种库存。

该解决方案假设您在将订单添加到表格后,通过tempProductStock或其他方法重新设置cobo_Products_SelectedIndexChanged