Как объединить две таблицы данных, содержащие разные столбцы на основе условия? - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть два типа данных, первый содержит

 DataTable  dtMaterialStatement = new DataTable();
                    dtMaterialStatement.Columns.Add(new DataColumn("MaterialNo", Type.GetType("System.String")));
                    dtMaterialStatement.Columns.Add(new DataColumn("MaterialId", Type.GetType("System.String")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Qty", Type.GetType("System.Double")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Unit", Type.GetType("System.String")));
                    dtMaterialStatement.Columns.Add(new DataColumn("SinglePrice", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("PricePerPack", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("UnitsPerPack", Type.GetType("System.String")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Discount1", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Discount2", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Discount3", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("SalesPrice", Type.GetType("System.Decimal")));
                    dtMaterialStatement.Columns.Add(new DataColumn("Exist", Type.GetType("System.Boolean")));

Второй содержит: -

"MaterialNo"
  Qty
 "Unit"
 "SinglePrice"
 "PricePerPack"
 "UnitsPerPack"
 "Discount1"
  "Discount2"
 "Discount3"
 "SalesPrice"

и добавьте дополнительный столбец,

Я хочу объединить обе таблицы, если MaterialNo первой таблицы совпадает со вторым столбцом MaterialNo таблицы, затем взять значение поля общего столбца из второй таблицы, чтобы обновить значение первого столбца, соответствующего столбцу. иначе вставьте новую строку в первую таблицу, указав сначала столбец таблицы, но взяв значение из второй таблицы.

1 Ответ

0 голосов
/ 02 февраля 2012
  1. Используйте это, чтобы извлечь новые таблицы данных, которые содержат только различия http://kodesharp.blogspot.com/2007/12/c-compare-2-datatables-and-return-3rd.html

  2. Затем используйте цикл foreach или for, чтобы вручную извлечь различия в массив. Затем переведите его в таблицу данных

Примерно так:

DataTable dt = CompareDataTables(dt1, dt2);

ArrayList Errors = new ArrayList();

for (int i = 0; i < d.Columns.Count; i++)
{
    for (int j = 0; j < d.Rows.Count; j++)
    {
        if (dt1.Rows[j][i].ToString() != dt2.Rows[j][i].ToString())
            {
                Errors.Add(j);
                Errors.Add(i);
                Errors.Add(dt1.Rows[j][i].ToString());
                Errors.Add(dt2.Rows[j][i].ToString());
            }
     }
 }

DataTable dtFinal = dt;

for (int i = 0; i < Errors.Count; i += 4)
{
    int ak = Int32.Parse(Errors[i].ToString());
    int bk = Int32.Parse(Errors[i + 1].ToString());
    dtFinal.Rows[ak][bk] = Errors[i + 2].ToString() + "/" + Errors[i + 3].ToString();
}
...