none
Sumar registro de dos datasets RRS feed

  • 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

    lunes, 5 de octubre de 2015 14:56

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

    martes, 6 de octubre de 2015 9:52

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

    lunes, 5 de octubre de 2015 15:19
  • Me has dado la clave para indagar sobre el tema.

    Si estuviera en vez de en xml en sql, el problema seria mínimo con unos group by y unos sum, lo tendria resuelto.

    Gracias por tu tiempo.

    lunes, 5 de octubre de 2015 15:29
  • Linq no solamente es para tablas, también puedes ir contra XML (Linq to XML), hay bastante documentación en línea.

    Roy Sillerico

    lunes, 5 de octubre de 2015 15:34
  • 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

    lunes, 5 de octubre de 2015 15:40
  • 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

    martes, 6 de octubre de 2015 9:52