vb.net - 乘以数据表中的值
vb.net - multiplying values from datatable
我在 vb.net 工作,在我的程序中我有两个数据表。我想要的是将第二个数据表中某些 IZ 的数量与第一个数据表中相同 IZ 的数量相乘。我想为每个 IZ 都这样做。
例如,对于 IZ12554,它就像 1*460=460 和 0,0025*460=1,15;对于 IZ10836,它将是 3*2000=6000; 1*2000=2000; 1*2000=2000 等,并将这些结果写入数据表 3.
DATATABLE 1
Capacity IZ Quantity ID Document
-------------------------------------------
DM00006 IZ12554 460 20 PDN00084625
DM00007 IZ10836 2000 1 PDN00084983
DM00010 IZ12641 25200 1 PDN00084997
DM00011 IZ03941 940 1 PDN00084639
DM00087 IZ15137 50 12 PDN00084904
....
....
DATATABLE 2
IZ MA Quantity Unit
----------------------------------
IZ12554 MA06196 1 KOS
IZ12554 MA05545 0,0025 KOS
IZ10836 MA06199 3 KOS
IZ10836 MA06197 1 KOS
IZ10836 MA00892 1 kos
IZ12641 MA06199 1 KOS
IZ12641 MA32200 0,04 m
IZ03941 MA07639 0,0025 KOS
IZ03941 MA00896 0,295 M
IZ03941 MA06200 1 KOS
IZ03941 MA00892 1 kos
IZ15137 MA06200 1 KOS
IZ15137 MA00557 0,0025 KOS
IZ15137 MA00897 0,295 M
...
...
DATATABLE 3 - RESULTS
IZ MA Quantity Unit
----------------------------------
IZ12554 MA06196 460 KOS
IZ12554 MA05545 1,15 KOS
IZ10836 MA06199 6000 KOS
IZ10836 MA06197 2000 KOS
IZ10836 MA00892 2000 kos
IZ12641 MA06199 25200 KOS
IZ12641 MA32200 1000,8 m
IZ03941 MA07639 2,35 KOS
IZ03941 MA00896 277,3 M
IZ03941 MA06200 940 KOS
IZ03941 MA00892 940 kos
IZ15137 MA06200 50 KOS
IZ15137 MA00557 0,125 KOS
IZ15137 MA00897 14,75 M
...
...
我搜索了答案,但仍然不知道如何使用数据表,我是编程的初学者...
提前致谢!
您可以尝试类似的操作:
DataTable DataTable3 = new DataTable();
DataColumn myDataColumn;
myDataColumn = new DataColumn();
myDataColumn.DataType = Type.GetType("System.String");
myDataColumn.ColumnName = "IZ";
DataTable3.Columns.Add(myDataColumn);
DataColumn myDataColumn;
myDataColumn = new DataColumn();
myDataColumn.DataType = Type.GetType("System.String");
myDataColumn.ColumnName = "MA";
DataTable3.Columns.Add(myDataColumn);
DataColumn myDataColumn;
myDataColumn = new DataColumn();
myDataColumn.DataType = Type.GetType("System.Int32");
myDataColumn.ColumnName = "Sum_QTY";
DataTable3.Columns.Add(myDataColumn);
//ADD More columns to DataTable Here
foreach(DataRow row in DataTable1.Rows){
foreach(DataRow row2 in DataTable2.Rows){
if (row["IZ"].ToString()==row2["IZ"].ToString()){
//Row3 is the row from Table 3
row3 = DataTable3.NewRow();
row3["IZ"]=row["IZ"].ToString();
row3["MA"]=row2["MA"].ToString();
row3["Sum_QTY"]=row2["Quantity"]*row["Quantity"];
//ADD calculations here and add them to row3
DataTable3.Rows.Add(row3);
}
}
}
正如对问题的评论所建议的那样,在数据库中执行此操作可能更有效,但您可以使用 LINQ to DataSet 加入数据并执行计算:
Dim result =
From r2 In dt2.AsEnumerable()
Join r1 In dt1.AsEnumerable() On r2.Field(Of String)("IZ") Equals r1.Field(Of String)("IZ")
Select
IZ = r2.Field(Of String)("IZ"),
MA = r2.Field(Of String)("MA"),
Quantity = r2.Field(Of Decimal)("Quantity") * r1.Field(Of Integer)("Quantity"),
Unit = r2.Field(Of String)("Unit")
这为您提供了一个 IEnumerable
匿名类型,其中包含您想要的结果。我不知道有什么内置方法可以将其转换回 DataTable
(如果您需要的话),但您可以稍加思考就可以做到。有关更多详细信息,请参阅 this question,但像这样的东西应该有效:
<Extension>
Function ToDataTable(Of T)(items As IEnumerable(Of T)) As DataTable
Dim dt = New DataTable()
Dim props = GetType(T).GetProperties()
For Each prop In props
Dim dc = dt.Columns.Add(prop.Name, prop.PropertyType)
Next
For Each item In items
Dim dr = dt.NewRow()
For Each prop In props
dr(prop.Name) = prop.GetValue(item)
Next
dt.Rows.Add(dr)
Next
Return dt
End Function
然后您可以:
Dim dt3 = result.ToDataTable()
' or ToDataTable(result) if you don't make it an extension method
我在 vb.net 工作,在我的程序中我有两个数据表。我想要的是将第二个数据表中某些 IZ 的数量与第一个数据表中相同 IZ 的数量相乘。我想为每个 IZ 都这样做。
例如,对于 IZ12554,它就像 1*460=460 和 0,0025*460=1,15;对于 IZ10836,它将是 3*2000=6000; 1*2000=2000; 1*2000=2000 等,并将这些结果写入数据表 3.
DATATABLE 1
Capacity IZ Quantity ID Document
-------------------------------------------
DM00006 IZ12554 460 20 PDN00084625
DM00007 IZ10836 2000 1 PDN00084983
DM00010 IZ12641 25200 1 PDN00084997
DM00011 IZ03941 940 1 PDN00084639
DM00087 IZ15137 50 12 PDN00084904
....
....
DATATABLE 2
IZ MA Quantity Unit
----------------------------------
IZ12554 MA06196 1 KOS
IZ12554 MA05545 0,0025 KOS
IZ10836 MA06199 3 KOS
IZ10836 MA06197 1 KOS
IZ10836 MA00892 1 kos
IZ12641 MA06199 1 KOS
IZ12641 MA32200 0,04 m
IZ03941 MA07639 0,0025 KOS
IZ03941 MA00896 0,295 M
IZ03941 MA06200 1 KOS
IZ03941 MA00892 1 kos
IZ15137 MA06200 1 KOS
IZ15137 MA00557 0,0025 KOS
IZ15137 MA00897 0,295 M
...
...
DATATABLE 3 - RESULTS
IZ MA Quantity Unit
----------------------------------
IZ12554 MA06196 460 KOS
IZ12554 MA05545 1,15 KOS
IZ10836 MA06199 6000 KOS
IZ10836 MA06197 2000 KOS
IZ10836 MA00892 2000 kos
IZ12641 MA06199 25200 KOS
IZ12641 MA32200 1000,8 m
IZ03941 MA07639 2,35 KOS
IZ03941 MA00896 277,3 M
IZ03941 MA06200 940 KOS
IZ03941 MA00892 940 kos
IZ15137 MA06200 50 KOS
IZ15137 MA00557 0,125 KOS
IZ15137 MA00897 14,75 M
...
...
我搜索了答案,但仍然不知道如何使用数据表,我是编程的初学者...
提前致谢!
您可以尝试类似的操作:
DataTable DataTable3 = new DataTable();
DataColumn myDataColumn;
myDataColumn = new DataColumn();
myDataColumn.DataType = Type.GetType("System.String");
myDataColumn.ColumnName = "IZ";
DataTable3.Columns.Add(myDataColumn);
DataColumn myDataColumn;
myDataColumn = new DataColumn();
myDataColumn.DataType = Type.GetType("System.String");
myDataColumn.ColumnName = "MA";
DataTable3.Columns.Add(myDataColumn);
DataColumn myDataColumn;
myDataColumn = new DataColumn();
myDataColumn.DataType = Type.GetType("System.Int32");
myDataColumn.ColumnName = "Sum_QTY";
DataTable3.Columns.Add(myDataColumn);
//ADD More columns to DataTable Here
foreach(DataRow row in DataTable1.Rows){
foreach(DataRow row2 in DataTable2.Rows){
if (row["IZ"].ToString()==row2["IZ"].ToString()){
//Row3 is the row from Table 3
row3 = DataTable3.NewRow();
row3["IZ"]=row["IZ"].ToString();
row3["MA"]=row2["MA"].ToString();
row3["Sum_QTY"]=row2["Quantity"]*row["Quantity"];
//ADD calculations here and add them to row3
DataTable3.Rows.Add(row3);
}
}
}
正如对问题的评论所建议的那样,在数据库中执行此操作可能更有效,但您可以使用 LINQ to DataSet 加入数据并执行计算:
Dim result =
From r2 In dt2.AsEnumerable()
Join r1 In dt1.AsEnumerable() On r2.Field(Of String)("IZ") Equals r1.Field(Of String)("IZ")
Select
IZ = r2.Field(Of String)("IZ"),
MA = r2.Field(Of String)("MA"),
Quantity = r2.Field(Of Decimal)("Quantity") * r1.Field(Of Integer)("Quantity"),
Unit = r2.Field(Of String)("Unit")
这为您提供了一个 IEnumerable
匿名类型,其中包含您想要的结果。我不知道有什么内置方法可以将其转换回 DataTable
(如果您需要的话),但您可以稍加思考就可以做到。有关更多详细信息,请参阅 this question,但像这样的东西应该有效:
<Extension>
Function ToDataTable(Of T)(items As IEnumerable(Of T)) As DataTable
Dim dt = New DataTable()
Dim props = GetType(T).GetProperties()
For Each prop In props
Dim dc = dt.Columns.Add(prop.Name, prop.PropertyType)
Next
For Each item In items
Dim dr = dt.NewRow()
For Each prop In props
dr(prop.Name) = prop.GetValue(item)
Next
dt.Rows.Add(dr)
Next
Return dt
End Function
然后您可以:
Dim dt3 = result.ToDataTable()
' or ToDataTable(result) if you don't make it an extension method