一些背景
我正在尝试创建一个管理产品订单的表单应用程序。我正在使用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);
}
}
我非常欣赏一些关于如何使这项工作成功的想法。提前谢谢。
我感谢我可能没有提供回答我的问题所需的所有信息。如果我能提供更多内容,请告诉我。不幸的是,我无法在我的问题中添加图片,这让我有点难以解释。
答案 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
。