C# 反向先进先出数量项目?
下面我的第一篇文章已经解决了 我有一个数据库详细信息名称C# 反向先进先出数量项目?,c#,C#,下面我的第一篇文章已经解决了 我有一个数据库详细信息名称Item\u detail No(autoincrement) Id_Item qtyLimit qtyReal ------------------------------------------------------- 1 1 30 0 2 1 4
Item\u 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,数量限制为详细项目中每个数据的限制数量
如果我有来自交易中的datagridview1的数据
Id_Item qtyIn
---------------
1 50
2 80
NoTrans(autoincrement) no(from item_detail) qtyIn
---------------------------------------------------------
1 1 10
2 2 40
3 3 30
4 4 50
如何将我的交易中的数量添加到我的更新项目\u详细信息
但从下到上反向
我想要这样的结果
No(autoincrement) Id_Item qtyLimit qtyReal
-------------------------------------------------------
1 1 30 10
2 1 40 40
3 2 50 30
4 2 60 60
因此,其检查限制id no 1如果qty limit=qty real,则使用相同的no id从底部移动到顶部,然后使用qty limit再次检查
之后,我想将该事务处理放入表Item\u transaction
Id_Item qtyIn
---------------
1 50
2 80
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
private void calculate()
{
//交易记录:Id_项目,qtyIn
IEnumerable contextItemIn=null;
//ItemDetail:否,Id\u项,qtyLimit,qtyReal
IEnumerable contextItemDetails=null;
Dictionary itemInQuantities=contextItemIn.ToDictionary(x=>x.Id\u项,x=>x.qtyIn);
var itemDetails=contextItemDetails.OrderBy(x=>x.No.ToList();
foreach(itemDetails.AsEnumerable().Reverse()中的变量项)
{
小数位数;
if(ItemInQuanties.TryGetValue(item.Id\u item,out InQuantity))
{
变量qtyChange=inQty
item.qtyReal+=qtyChange;
inQty-=qtyChange;
if(inQty==item.QtyLimit)
{
iteminquanties.Remove(item.Id\u item);
}
其他的
{
ItemInQuantilities[item.Id\u item]=InQuantity;
}
如果(qtyChange!=0)
{
添加(新项目事务{/*No=autoincrement,*/
NoTrans=item.No,qtyIn=qtyChange});
}
}
}
//itemDetails数量值已更正
}
所以,请帮助我,就我所知,只需要一些小的改动就可以了
因此,让我们首先将项的详细信息.capacity
定义为qtyLimit-qtyReal
。单个项目详细信息的最大更改受其容量的限制,而所需的更改由\u transaction.qtyIn
中的给出。因此,您可以计算单个项目的数量变化,如下所示:
var qtyChange = Math.Min(inQty, item.qtyLimit - item.qtyReal);
当剩余的inQty
为0
时,来自in_事务
的条目完成,因此更改条件
//if (inQty == item.QtyLimit) // <- wrong
if (inQty == 0)
// ... remove
请更正您的代码。。。像qyout
,ItemOut
这样的问题看起来像是你上一个问题的遗留问题。另外,如果您明确地为每个表指定一个名称也会有所帮助,这样我们就总能知道我们在谈论什么。与第一个表项目详细信息
、第二个表项目交易
、第三个表更新项目详细信息
第四个表项目交易
类似。当然,你可以选择不同的名字,但无论如何,还是要以某种方式命名。已经在@grek40编辑我的帖子了吗