我的第一篇文章已经解决了 First in first out subtract quantity stock?
我有一个数据库详细信息名称Item_detail
No(autoincrement) Id_Item qtyLimit qtyReal
-------------------------------------------------------
1 1 30 0
2 1 40 0
3 2 50 0
4 2 60 10
因此对于项目1总和项目1的所有数量实数为0,并且数量限制是详细项目中每个数据的限制数量
如果我有来自in_transaction
Id_Item qtyIn
---------------
1 50
2 80
如何将交易中的数量添加到我的update Item_detail
,但反向从下到上
结果我想要这样
No(autoincrement) Id_Item qtyLimit qtyReal
-------------------------------------------------------
1 1 30 10
2 1 40 40
3 2 50 30
4 2 60 60
因此,如果qty limit = qty,其检查限制ID为1,则从底部向上移动,同样没有id,然后再次使用qty limit检查
之后我想将该交易流程放入表Item_transaction
NoTrans(autoincrement) no(from item_detail) qtyIn
---------------------------------------------------------
1 1 10
2 2 40
3 3 30
4 4 50
trycode
private void calculate()
{
// Transaction: Id_Item, qtyIn
IEnumerable<in_transaction> contextItemIn = null;
// ItemDetail: No, Id_Item, qtyLimit, qtyReal
IEnumerable<ItemDetail> contextItemDetails = null;
Dictionary<int, decimal> itemInQuantities = contextItemIn.ToDictionary(x => x.Id_Item, x => x.qtyIn);
var itemDetails = contextItemDetails.OrderBy(x => x.No).ToList();
foreach (var item in itemDetails.AsEnumerable().Reverse())
{
decimal inQty;
if (itemInQuantities.TryGetValue(item.Id_Item, out inQty))
{
var qtyChange = inQty
item.qtyReal += qtyChange;
inQty -= qtyChange;
if (inQty == item.QtyLimit)
{
itemInQuantities.Remove(item.Id_Item);
}
else
{
itemInQuantities[item.Id_Item] = inQty;
}
if (qtyChange != 0)
{
transactions.Add(new ItemTransaction { /*No = autoincrement, */
NoTrans = item.No, qtyIn = qtyChange });
}
}
}
// itemDetails qty values are corrected
}
所以请帮忙
答案 0 :(得分:1)
据我所知,只需做一些小的改动就可以完成这项工作。
因此,我们首先将Item_detail.capacity
的字词设为qtyLimit - qtyReal
。单个项目详细信息的最大更改受其capacity
限制,而所需更改由in_transaction.qtyIn
给出。因此,您可以计算单个项目的数量变化
var qtyChange = Math.Min(inQty, item.qtyLimit - item.qtyReal);
来自in_transaction
的条目已完成,剩余的inQty
为0
,因此更改条件
//if (inQty == item.QtyLimit) // <- wrong
if (inQty == 0)
// ... remove
为简化代码而进行的微小改动:不要在以后反转项目,而是开始正确排序。
var itemDetails = contextItemDetails.OrderByDescending(x => x.No).ToList();
foreach (var item in itemDetails)