Principales respuestas
Sumar registro de dos datasets

Pregunta
-
Buenas tardes a todos.
Gracias de antemano por su tiempo.
Estoy haciendo mi primera aplicación en asp.net, y me he encontrado con un pequeño problema.
Mi aplicación lee varios xml, los cuales tienen la misma estructura pero los registros pueden ser coincidentes o no.
El xml volcado a una tabla seria algo así.
xml1
ID DESCRIPCION FORMATO PEDIDO
1 GOMINOLAS BOLSA 4
2 PIPAS CAJA 100 2
xml2
ID DESCRIPCION FORMATO PEDIDO
1 GOMINOLAS BOLSA 2
3 GUSANITOS CAJA 3
Quiero unir los datos en un solo dataset, realizando la suma de la columna pedido. La única manera que se me ha ocurrido es haciendo un xml genérico con todos los articulos, e ir leyendo los xml1,xml2 etc... recorriendo y buscando el identificador y haciendo la suma.
Esto me parece que es poco elegante e incluso lento.
Conocéis otra manera que pueda resolver más fácilmente el problema
Gracias de antemano
Un saludo
Respuestas
-
Doy el tema por cerrado, al final lo consegui con agrupacion de datatables
Dim dicSum As New Dictionary(Of String, Integer)()
dtfinal = dsdata.Tables(0).Clone
For Each row As DataRow In dsdata.Tables(0).Rows
Dim group As String = row("CODIGO").ToString()
Dim rate As Integer = Convert.ToInt32(row("PEDIDO"))
If dicSum.ContainsKey(group) Then
dicSum(group) += rate
Else
dicSum.Add(group, rate)
End If
Next
Dim foundRows() As Data.DataRow
For Each g As String In dicSum.Keys
foundRows = dsdata.Tables(0).Select("CODIGO Like '" & CStr(g) & "'")
If foundRows.Length > 0 Then
dtfinal.Rows.Add(foundRows(0).ItemArray(0), foundRows(0).ItemArray(1), foundRows(0).ItemArray(2), dicSum(g))
End If
Console.WriteLine("SUM({0})={1}", g, dicSum(g))
Next
dsfinal.Tables.Add(dtfinal)
BindGrid(dsfinal)Muchas gracias
- Marcado como respuesta Karen MalagónModerator miércoles, 7 de octubre de 2015 20:29
Todas las respuestas
-
Hola buen día, tal vez no te sirva de mucho, pero yo realice un join entre dos datatables, tal vez te pueda servir como guía para luego hacer lo que necesites, este es el código:
var resul = (from drDBI in tablaBDI.AsEnumerable() join drCRM in tablaCRM.AsEnumerable() on drDBI.Field<int>("PosicionBDI") equals drCRM.Field<int>("posicionCRM") select new { NomColBDI = drDBI.Field<string>("NombreBDI"), NomColCRM = drCRM.Field<string>("NombreCRM"), PosicionBDI = drDBI.Field<int>("PosicionBDI"), PosicionCRM = drCRM.Field<int>("posicionCRM"), NullBDI = drDBI.Field<string>("NullBDI"), NullCRM = drCRM.Field<string>("NullCRM"), TipoBDI = drDBI.Field<string>("TipoBDI"), TipoCRM = drCRM.Field<string>("TipoCRM"), longitudBDI = drDBI.Field<int?>("longitudBDI"), longitudCRM = drCRM.Field<int?>("longitudCRM") });
Eso es aplicando LinQ, bueno como te digo espero que por lo menos te sirva como idea.Roy Sillerico
-
-
-
Creo que vamos por buen camino, no se nada sobre LINQ, pero creo que es la solución mas elegante.
Si hago un merge de los datasets (xml) luego con linq podria agrupar los registros haciendo un sumatorio de la columna PEDIDO, las otras columnas (id,descripcion, formato) son iguales para todos los dataset
Ahora mismo estoy viendo como hacerlo, pero me encuentro un poco perdido, voy a buscar LINQ for dummies leccion uno.
Un saludo
-
Doy el tema por cerrado, al final lo consegui con agrupacion de datatables
Dim dicSum As New Dictionary(Of String, Integer)()
dtfinal = dsdata.Tables(0).Clone
For Each row As DataRow In dsdata.Tables(0).Rows
Dim group As String = row("CODIGO").ToString()
Dim rate As Integer = Convert.ToInt32(row("PEDIDO"))
If dicSum.ContainsKey(group) Then
dicSum(group) += rate
Else
dicSum.Add(group, rate)
End If
Next
Dim foundRows() As Data.DataRow
For Each g As String In dicSum.Keys
foundRows = dsdata.Tables(0).Select("CODIGO Like '" & CStr(g) & "'")
If foundRows.Length > 0 Then
dtfinal.Rows.Add(foundRows(0).ItemArray(0), foundRows(0).ItemArray(1), foundRows(0).ItemArray(2), dicSum(g))
End If
Console.WriteLine("SUM({0})={1}", g, dicSum(g))
Next
dsfinal.Tables.Add(dtfinal)
BindGrid(dsfinal)Muchas gracias
- Marcado como respuesta Karen MalagónModerator miércoles, 7 de octubre de 2015 20:29