C# 先进先出减去库存数量?
我有一个数据库详细信息名称item\u detailC# 先进先出减去库存数量?,c#,C#,我有一个数据库详细信息名称item\u detail No(autoincrement) Id_Item qty -------------------------------------- 1 1 10 2 1 20 3 2 20 4 2
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;你能解释一下吗?@inheavaitemOutQuantilities
字典跟踪每个项目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创建了表,所以我知道每个项目有多少减法,它是如何工作的?