Разбор DataTable из плоской таблицы в таблицу normailze - PullRequest
1 голос
/ 22 апреля 2011

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

У меня будут повторные столбцы в датированных данных.

Invoice num     Amount    LineNum   Line Amout  Ledger
INV1            100       1         50          11101
INV1            100       2         50          25631 

строки будут повторяться с разными счетами

Как можно отчетливо выбрать новые данные?используя ADO.NET

Я хочу проанализировать данные в следующем формате

Таблица заголовков

  Invoice num     Amount    
  INV1            100         

Таблица строк

  Invoice num  LineNum   Line Amout  Ledger
  INV1          1         50          11101
  INV1          2         50          25631 

ВОПРОС: Я не знаю, какой будет лучший способ вывести вышеуказанный формат?Я вижу примеры usign linq, DataTable, Views?Я ищу фрагмент кода.

1 Ответ

0 голосов
/ 22 апреля 2011

ОК, чтобы начать проблему, я работаю с DataTable и данными, определенными следующим образом. Измените имена и типы в соответствии с вашими потребностями.

// I am building this table in code just for the purposes of this answer.
// If you already have your data table, ignore!
DataTable salesTable = new DataTable();
salesTable.Columns.Add("InvoiceNum", typeof(string));
salesTable.Columns.Add("Amount", typeof(decimal));
salesTable.Columns.Add("LineNum", typeof(int));
salesTable.Columns.Add("LineAmount", typeof(decimal));
salesTable.Columns.Add("Ledger", typeof(string));

// This is also just to populate data for the sample.
// Omit as you already have your data.
salesTable.Rows.Add("INV1", 100M, 1, 50M, "11101");
salesTable.Rows.Add("INV1", 100M, 1, 50M, "25631");

Обратите внимание, что я использую перегрузку .Rows.Add, которая принимает массив params object[]. Значения, которые я передаю, имеют порядок и тип столбцов, которые они должны заполнять. Код ниже использует тот же подход.

Первое, что я хочу сделать, это определить таблицы для вашего нового нормализованного формата. Сначала таблица заголовков.

DataTable headerTable = new DataTable();
headerTable.Columns.Add("InvoiceNum", typeof(string));
headerTable.Columns.Add("Amount", typeof(decimal));

А затем таблица позиций.

DataTable lineTable = new DataTable();
lineTable.Columns.Add("InvoiceNum", typeof(string));
lineTable.Columns.Add("LineNum", typeof(int));
lineTable.Columns.Add("LineAmount", typeof(decimal));
lineTable.Columns.Add("Ledger", typeof(string));

После этого я собираюсь использовать LINQ для группировки исходной таблицы продаж по номеру счета.

var groupedData = from row in salesTable.AsEnumerable()
                  group row by row.Field<string>("InvoiceNum") into grp
                  select grp;

После этого нужно просто перебрать группы и добавить данные в новые таблицы.

foreach (var invoiceGroup in groupedData)
{
    string invoiceNumber = invoiceGroup.Key;
    decimal amount = invoiceGroup.First().Field<decimal>("Amount");

    headerTable.Rows.Add(invoiceNumber, amount);

    foreach (DataRow row in invoiceGroup)
    {
        lineTable.Rows.Add(
                invoiceNumber,
                row.Field<int>("LineNum"),
                row.Field<decimal>("LineAmount"),
                row.Field<string>("Ledger")
            );
    }
}

И теперь у вас есть данные в нормализованном формате, который вы предпочитаете. Снова измените соответствующие имена столбцов и типы данных в соответствии с вашими потребностями.

...