C# 先进先出减去库存数量?

C# 先进先出减去库存数量?,c#,C#,我有一个数据库详细信息名称item\u detail No(autoincrement) Id_Item qty -------------------------------------- 1 1 10 2 1 20 3 2 20 4 2

我有一个数据库详细信息名称item\u detail

No(autoincrement)      Id_Item    qty
--------------------------------------
       1                  1        10
       2                  1        20
       3                  2        20
       4                  2        20
       5                  3        30
       6                  3        40
因此,对于表中排名第一的项目1,其总数量为30

如果我的事务中有来自datagridview1的数据

   Id_Item    qtyOUT
   ---------------
      1         20        
      2         30
如何从datagridview1中减去qty到我的数据库,以便得到我想要的结果

 No(autoincrement)     Id_Item    qty
--------------------------------------
       1                  1        0
       2                  1        10
       3                  2        0
       4                  2        10
       5                  3        30
       6                  3        40
因此,检查是否没有1个id项1只有数量10减去0,然后根据最先出现的交易编号移动仍然有值的id_项1

在减法之后,我想将该事务处理放入表ITEM\u transaction中

 NoTrans(autoincrement) no(from item_detail)      qtyOut
---------------------------------------------------------
       1                       1                    10
       2                       2                    10
       3                       3                    20
       4                       4                    10
trycode

private void calculate()
{
// Transaction: Id_Item, qtyOUT
IEnumerable<ItemOut> contextItemOut = null;
// ItemDetail: No, Id_Item, qty
IEnumerable<ItemDetail> contextItemDetails = null;

Dictionary<int, decimal> itemOutQuantities = contextItemOut.ToDictionary(x => x.Id_Item, x => x.qtyOUT);

var itemDetails = contextItemDetails.OrderBy(x => x.No).ToList();

foreach (var item in itemDetails)
{
    decimal outQty;
    if (itemOutQuantities.TryGetValue(item.Id_Item, out outQty))
    {
        var qtyChange = Math.Min(outQty, item.qty);
        item.qty -= qtyChange;
        outQty -= qtyChange;
        if (outQty == 0)
        {
            ITEM_TRANSACTION trans = new ITEM_TRANSACTION();
            trans.id_Item = item;
            trans.qtyOut = qtyChange; //maybe its wrong
            itemOutQuantities.Remove(item.Id_Item);
        }
        else
        {
            itemOutQuantities[item.Id_Item] = outQty;
        }
    }
}

// itemDetails qty values are corrected
private void calculate()
{
//事务处理:Id_项目,qtyOUT
IEnumerable contextItemOut=null;
//ItemDetail:否,Id\u项目,数量
IEnumerable contextItemDetails=null;
Dictionary ItemOutQuantilities=contextItemOut.ToDictionary(x=>x.Id\u项,x=>x.qtyOUT);
var itemDetails=contextItemDetails.OrderBy(x=>x.No.ToList();
foreach(itemDetails中的var项目)
{
十进制输出数量;
if(itemOutQuanties.TryGetValue(item.Id\u item,OutQuantity))
{
变量qtyChange=数学最小值(出库数量、物料数量);
物料数量-=数量变更;
outQty-=qtyChange;
如果(输出数量==0)
{
ITEM_TRANSACTION=新ITEM_TRANSACTION();
trans.id_项目=项目;
trans.qtyOut=qtyChange;//可能是错的
ItemOutQuantilities.Remove(item.Id\u item);
}
其他的
{
ItemOutQuanties[item.Id\u item]=OutQuantity;
}
}
}
//itemDetails数量值已更正
}


因此,请帮助

为了简单起见,我假设您的数据可用作
IEnumerable
(不要像我的代码那样将它们保留为
null
),您可以适应datatable或任何值存储

将您的
qyout
条目转换为字典,以便高效访问,然后按
No
顺序循环您的项目详细信息条目,并检查每个详细信息是否有一个值要减除

private void calculate()
{
    // Transaction: Id_Item, qtyOUT
    IEnumerable<ItemOut> contextItemOut = null;
    // ItemDetail: No, Id_Item, qty
    IEnumerable<ItemDetail> contextItemDetails = null;

    Dictionary<int, decimal> itemOutQuantities = contextItemOut.ToDictionary(x => x.Id_Item, x => x.qtyOUT);

    var itemDetails = contextItemDetails.OrderBy(x => x.No).ToList();

    // Data for ITEM_TRANSACTION
    ICollection<ItemTransaction> transactions = new List<ItemTransaction>();

    foreach (var item in itemDetails)
    {
        decimal outQty;
        if (itemOutQuantities.TryGetValue(item.Id_Item, out outQty))
        {
            var qtyChange = Math.Min(outQty, item.qty);
            item.qty -= qtyChange;
            outQty -= qtyChange;
            if (outQty == 0)
            {
                itemOutQuantities.Remove(item.Id_Item);
            }
            else
            {
                itemOutQuantities[item.Id_Item] = outQty;
            }

            if (qtyChange != 0)
            {
                transactions.Add(new ItemTransaction { /*No = autoincrement, */ NoTrans = item.No, qtyOUT = qtyChange });
            }
        }
    }

    // itemDetails qty values are corrected
}
private void calculate()
{
//事务处理:Id_项目,qtyOUT
IEnumerable contextItemOut=null;
//ItemDetail:否,Id\u项目,数量
IEnumerable contextItemDetails=null;
Dictionary ItemOutQuantilities=contextItemOut.ToDictionary(x=>x.Id\u项,x=>x.qtyOUT);
var itemDetails=contextItemDetails.OrderBy(x=>x.No.ToList();
//项目交易的数据
ICollection事务=新列表();
foreach(itemDetails中的var项目)
{
十进制输出数量;
if(itemOutQuanties.TryGetValue(item.Id\u item,OutQuantity))
{
变量qtyChange=数学最小值(出库数量、物料数量);
物料数量-=数量变更;
outQty-=qtyChange;
如果(输出数量==0)
{
ItemOutQuantilities.Remove(item.Id\u item);
}
其他的
{
ItemOutQuanties[item.Id\u item]=OutQuantity;
}
如果(qtyChange!=0)
{
添加(newitemtransaction{/*No=autoincrement,*/NoTrans=item.No,qtyOUT=qtyChange});
}
}
}
//itemDetails数量值已更正
}

逻辑是什么?id 1和2的两个项目的值都发生了变化,但不是3。它来自datagrid事务,因为项目1-20和2-30以及我在上一张表中想要的结果我编辑了我的帖子,这样你就可以理解了。是的,如果值qty=0,那么移动仍然有值的同一个id\u项目,然后使用linq减去TOO删除项目将不起作用。您需要第二个for循环来枚举listitem数组,并从listitem的每一行中减去项,直到qtyout变为零。如果要更改为foreach for(datagridview1中的DataGridViewRow行)其工作原理>?因为我的父亲是这样的complex@InheavenA据我所知,
datagridview1
将是包含
qyout
的文件,因此需要将其转换为字典。循环遍历项目详细信息条目。我仍然没有得到它itemOutQuantilities[item.Id\u item]=outQuantity;你能解释一下吗?@inheava
itemOutQuantilities
字典跟踪每个项目ID的剩余
qtyOUT
值。例如,
ID\u item=1
qtyOUT=20
开始。处理项目详细信息
No=1
后,剩余的
qtut=10
因为
10
从第一个项目详细信息中减去。此剩余值在字典中更新,以便可用于具有相同ID的下一个项目(项目详细信息
No=2
),如果我想从该事务创建新表,则列为“ID\u item”和“qyout”,例如“ID\u item1”、ID\u item\u transaksi=1自动递增、ID\u item=1、qty\u out=10下一行ID\u item\u transaksi=2,id_item=1和qty_out=10,我已经使用linq名称item_TRANSAKSI创建了表,所以我知道每个项目有多少减法,它是如何工作的?