如何解决如何从C#中的必需参数显示记录?
| SQL数据类型: 序列号/部件号-nvarchar(50), 数量-整数 在DataTable上加载的记录:SerialNumber | PartNumber | Quantity
1 | 0001 | 20
2 | 0001 | 10
3 | 0001 | 20
5 | 0001 | 20
需求:
1,获取总数量等于40的序列号
2.获取最低的串行优先(FIFO)
哪个样本结果应如下所示:
SerialNumber | PartNumber | Quantity
1 | 0001 | 20
3 | 0001 | 20
如何得到这个结果?
在此致谢
解决方法
好的,因此您删除了sql标记,并引入了FIFO作为要求。这澄清了事情。
您的答案的核心在这里:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace SO_Forms_Demo
{
class SumFifo
{
DataTable _dt;
public SumFifo(DataTable dt)
{
_dt = dt;
}
public DataView GetAll()
{
return new DataView(_dt,null,DataViewRowState.CurrentRows);
}
public DataTable GetFIFO(string partNumber,int qty)
{
DataTable resultsTable = _dt.Clone();
//the generic collection type that represents a FIFO relationship is a Queue
Queue<DataRow> PartRows = new Queue<DataRow>(_dt.Select(\"partNumber = \'\" + partNumber + \"\'\",\"serialNumber\"));
//iterate through the queue adding rows and decreasing quantity till your requirment is met.
foreach (DataRow row in PartRows)
{
if (qty > 0)
{
resultsTable.ImportRow(row);
qty -= int.Parse(row[\"qty\"].ToString());
}
}
return resultsTable;
}
}
}
\“ GetFIFO \”方法将迭代提供的数据集,并首先创建一个队列(具有正确的partNumber的数据行的FIFO集合。它将迭代该集合,将对象数量减少所选数量,直到达到0。
为了测试这个,构建一个看起来像这样的表格:
使用如下代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SO_Forms_Demo
{
public partial class FormFIFO : Form
{
DataTable _table;
public FormFIFO()
{
InitializeComponent();
_table = new DataTable(\"fifo\");
_table.Columns.Add(new DataColumn(\"serialNumber\"));
_table.Columns.Add(new DataColumn(\"partNumber\"));
_table.Columns.Add(new DataColumn(\"qty\"));
_table.AcceptChanges();
_table.Rows.Add(new object[3] { 1,\"0001\",20 });
_table.Rows.Add(new object[3] { 2,\"0002\",10 });
_table.Rows.Add(new object[3] { 3,20 });
_table.Rows.Add(new object[3] { 4,10 });
_table.Rows.Add(new object[3] { 5,20 });
_table.Rows.Add(new object[3] { 6,10 });
_table.AcceptChanges();
}
private void button1_Click(object sender,EventArgs e)
{
dataGridView1.DataSource = null;
SumFifo sumFifo = new SumFifo(_table);
dataGridView1.DataSource = sumFifo.GetAll();
}
private void button2_Click(object sender,EventArgs e)
{
dataGridView1.DataSource = null;
SumFifo sumFifo = new SumFifo(_table);
dataGridView1.DataSource = sumFifo.GetFIFO(textBox1.Text,int.Parse( textBox2.Text));
}
}
}
现在,显然,要使此\\\\\\\\\\\\\有用\\\\\\\ / \ /等/ \\\\\\\\\\ / \\ / \ / \ ////// \\\\\\\ / \ ///////,是很长的路要走,但是GetFIFO方法是C#中对您的问题的基本答案。
,这绝对可以在SQL中完成,但是优化它以使其适用于大型集将是挑战。这是一个使用通用表表达式来计算目标零件号的可能排列集的解决方案,将这些排列按其数量的SUM分组,然后选择SUM与目标匹配的第一个排列。
然后,该排列用于标识要从数据集中选择的序列号:
declare @partNum char(4)
SET @partNum = \'0001\'
declare @quantity int
SET @quantity = 40
declare @data TABLE (
SerialNumber int identity(1,1),PartNumber char(4),Quantity int
);
INSERT INTO @data (PartNumber,Quantity) VALUES (\'0001\',20);
INSERT INTO @data (PartNumber,10);
INSERT INTO @data (PartNumber,Quantity) VALUES (\'0002\',20);
WITH
cte_items as (
select * from @data where PartNumber = @partNum
),cte_perms as (
select cast(cast(SerialNumber as binary(4)) as varbinary(max)) as perm,1 as numentries
from cte_items
union all
select cast(n.SerialNumber as binary(4)) + p.perm,p.numentries + 1
from cte_perms p
join cte_items n on n.SerialNumber < cast(substring(perm,1,4) as int)
),cte_permlist as (
select row_number() over (order by (select 1)) as permnum,perm
from cte_perms
)
SELECT d1.SerialNumber,d1.PartNumber,d1.Quantity
FROM @data d1
INNER JOIN (
SELECT
cast(substring(p.perm,4*n.SerialNumber-3,4) as int) as SerialNumber
from cte_permlist p
join @data n on n.SerialNumber = n.SerialNumber
where cast(substring(p.perm,4) as int) != 0
and p.permnum = (
SELECT TOP 1 permutations.permnum
FROM @data d2
CROSS APPLY (
SELECT
p.permnum,cast(substring(p.perm,4) as int) as SerialNumber
from cte_permlist p
join @data n on n.SerialNumber = n.SerialNumber
where cast(substring(p.perm,4) as int) != 0
) permutations
WHERE PartNumber = @partNum
and permutations.SerialNumber = d2.SerialNumber
GROUP BY permutations.permnum
HAVING SUM(d2.Quantity) = @quantity
ORDER BY permnum desc
)
) pSn on pSn.SerialNumber = d1.SerialNumber
结果:
SerialNumber PartNumber Quantity
------------ ---------- -----------
1 0001 20
3 0001 20
一旦查询优化器完成了这项工作,它应该会非常有效,除非对于目标零件号而言,存在许多其他的排列。
,我建议编写一个SQL查询,该查询返回给定零件号的所有行,并执行计算以确定在另一种编程语言中使用哪个序列号。 SQL非常适合基于集合的操作,但是此问题需要找到SQL无法胜任的子集的特定约束子集。
当您获得零件的行集合时。我建议采用深度或广度优先搜索。如果您不需要满足“序列号的最小数量”中的数量,并且在每个阶段都选择“小于不足的最大数量”,则深度优先可能是最好的方法在进行搜索时成为合理的策略。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。