2013-11-06 5 views
0

Моя проблема заключается в том, как (эффективно) конвертировать данные из DataTable из одного состояния в другое. Позвольте мне показать вам пример:Преобразование данных в DataTable

Источник данных - один документ в один ряд

Invoice|Date |User |LineNo|Article|Qty |LineNo|Article|Qty |LineNo|Article|Qty 
190201 |20130110|User1|01 |Art1 |12 PCE|02 |Art2 |7 PCE|03 |Art3 |4 PCE 

данных назначения - один документ в несколько рядов в зависимости от того, сколько строк есть в каждом документе. Данные заголовка (счет-фактура, данные и пользователь) дублируются в каждой строке.

Invoice|Date |User |LineNo|Article|Qty 
190201 |20130110|User1|01 |Art1 |12 PCE 
190201 |20130110|User1|02 |Art2 |7 PCE 
190201 |20130110|User1|03 |Art3 |4 PCE 

Целью является преобразование DataTable с одной строкой в ​​документ для многостраничного DataTable. Есть ли у вас предложения?

+6

Очевидный вопрос тогда ... до сих пор, что вы пробовали? –

ответ

1

Основываясь на информации, я хотел бы посмотреть на что-то вроде этого:

у вас есть предопределенный SourceDataTable с одной строкой, которая существует из 2-х частей:

Статическая часть

счета-фактуры | Дата | пользователь

динамическая часть которая может произойти N раз.

LineNo | Статья | Кол-во

Выполнение следующей последовательности: Статическая | Динамический1 | Dynamic2 | Dynamic3 | DynamicN ...

После этого мы знаем, как рассчитать количество динамических строк.

var AmountOfNewLines = (SourceDataTable.Columns.Count - 3)/3; 

//the minus comes from the Static data 
//divide by 3 because every Dynamic part exists out of 3 columns 

основываясь на этом, вы знаете, сколько строк там должны быть созданы, и вы знаете, как ваш формат выглядит следующим образом:

//Creation of the DestinationTable datatable 
var DestinationTable = new DataTable("Destination"); 

DestinationTable.Columns.Add("Invoice", typeof(String)); //Correct Type? 
DestinationTable.Columns.Add("Date", typeof(String)); 
DestinationTable.Columns.Add("User", typeof(String)); 
DestinationTable.Columns.Add("LineNo", typeof(String)); 
DestinationTable.Columns.Add("Article", typeof(String)); 
DestinationTable.Columns.Add("Qty", typeof(String)); 

for(int i = 0; i < AmountOfNewLines - 1; i++) 
{ 
    //Create a new row 
    //Invoice|Date |User |LineNo|Article|Qty 
    foreach(DataRow d in SourceDataTable) 
    { 
    //Using the foreach makes the datarow more easier to approach 
    //The Number inside the brackets explains which column is being approached. 
    DestinationTable.Rows.Add(d[0], d[1], d[2], d[3+(3*i)], d[4+(3*i)], d[5+(3*i)]) 
    } 

} 
+0

Спасибо за помощь. Ваше решение выполнило эту работу. – Eori

Смежные вопросы