Reputation:
I have two DataTables both have the same type of schema but have different data. Basically, I want to do is that I want to subtract those rows of newDt which are less then newDt1. Up to that point, I wrote that code but it has some logical error.
Below is a newDt DataTable which contains original Data.
var newDt = dt.AsEnumerable()
.GroupBy(r => r.Field<int>("batch_num"))
.Select(g =>
{
var row = dt.NewRow();
row["batch_num"] = g.Key;
row["qty"] = g.Sum(r => Convert.ToInt32(r.Field<int>("qty")));
return row;
}).CopyToDataTable();
Below is newdt1 DataTable which contains Data With Different 'qty' column value but same 'batch_num'.
newDt1 = dt_1.AsEnumerable()
.GroupBy(r => r.Field<int>("batch_num"))
.Select(g =>
{
var row = dt_1.NewRow();
row["batch_num"] = g.Key;
row["qty"] = g.Sum(r => Convert.ToInt32(r.Field<int>("qty")));
return row;
}).CopyToDataTable();
Below is resulting DataTable which contains subtracted 'qty' of newDt from newDt1.
DataTable result = newDt.AsEnumerable() // IT IS SUBTRACTING NEWDt from NewDt1 and storing result in it.
.Join(newDt1.AsEnumerable(), d1 => d1["batch_num"], d2 => d2["batch_num"], (d1, d2) => new { D1 = d1, D2 = d2 })
.Select(r =>
{
var row = newDt1.NewRow();
row["batch_num"] = Convert.ToInt32(r.D1["batch_num"]);
row["qty"] = Convert.ToInt32(r.D2["qty"]) - Convert.ToInt32(r.D1["qty"]);
return row;
}).CopyToDataTable();
for (int i = 0; i < result.Rows.Count; i++)
{
if (Convert.ToInt32(newDt.Rows[i]["qty"]) < (Convert.ToInt32(newDt1.Rows[i]["qty"])))
{
SqlCommand command = new SqlCommand("update batch set sold_qty=sold_qty-@soldqty2, left_qty=left_qty+@soldqty2 where id=@id2", con);
command.Parameters.AddWithValue("@soldqty2", Convert.ToInt32(result.Rows[i]["qty"]));
command.Parameters.AddWithValue("@id2", Convert.ToInt32(result.Rows[i]["batch_num"]));
rexe = command.ExecuteNonQuery();
}
}
I want that only those 'qty' column rows of 'newDT1' should be subtracted which are less than row value of 'qty' column of 'newDT'.
Upvotes: 1
Views: 35
Reputation:
Here is how we can subtract two DataTables.
DataTable Subtraction_result = newDt.AsEnumerable()
.Join(newDt1.AsEnumerable(), d1 => d1["batch_num"], d2 => d2["batch_num"], (d1, d2) => new { D1 = d1, D2 = d2 })
.Select(r =>
{
var row = newDt1.NewRow();
row["batch_num"] = Convert.ToInt32(r.D1["batch_num"]);
row["qty"] = Convert.ToInt32(r.D2["qty"]) - Convert.ToInt32(r.D1["qty"]);
return row;
}).CopyToDataTable();
Upvotes: 2