反向FIFO数量项?

时间:2017-08-29 07:04:26

标签: c#

我的第一篇文章已经解决了 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

的datagridview1的数据
   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

}

所以请帮忙

1 个答案:

答案 0 :(得分:1)

据我所知,只需做一些小的改动就可以完成这项工作。

因此,我们首先将Item_detail.capacity的字词设为qtyLimit - qtyReal。单个项目详细信息的最大更改受其capacity限制,而所需更改由in_transaction.qtyIn给出。因此,您可以计算单个项目的数量变化

var qtyChange = Math.Min(inQty, item.qtyLimit - item.qtyReal);

来自in_transaction的条目已完成,剩余的inQty0,因此更改条件

//if (inQty == item.QtyLimit) // <- wrong
if (inQty == 0)
    // ... remove

为简化代码而进行的微小改动:不要在以后反转项目,而是开始正确排序。

var itemDetails = contextItemDetails.OrderByDescending(x => x.No).ToList();
foreach (var item in itemDetails)