Sumar Valores de columnas DataGridView VB.NET

publicado por: Anonymous

estoy realizando una app y quiero sumar los valores de la columna SUBTOTAL clasificándolo por marca (columna MARCA), el problema radica en que va a ir variando las marcas. En primera instancia solo ocupaba dos marcas y resolvía el problema con este código…

Sub Sumar()
    Dim totalA As Double = 0
    Dim totalB As Double = 0
    For Each fila As DataGridViewRow In dgvDatos.Rows
        If fila.Cells("SUBTOTAL").Value Is Nothing Then
            Exit Sub
        ElseIf fila.Cells("MARCA").Value = "A" Then
            totalA += Convert.ToDouble(fila.Cells("SUBTOTAL").Value)
        ElseIf fila.Cells("MARCA").Value = "B" Then
            totalB += Convert.ToDouble(fila.Cells("SUBTOTAL").Value)
        End If
    Next
    lblA.Text = Format(totalA, "$ #,##0.000")
    lblB.Text = Format(totalB, "$ #,##0.000")
End Sub

Pero ahora las marcas pueden ser variables y así como lo estoy manejando tendría que declarar N variables para almacenar el resultado por marca. Alguna sugerencia para optimizar mi operación?
Gracias anticipadas!!

introducir la descripción de la imagen aquí

solución

Puedes utilizar el algoritmo conocido como corte de control. En éste enlace que te dejé lo definen de manera sencilla:

“El corte de control es un proceso en el cual partiendo de registros ordenados por el valor de uno o más campos, (denominados campos clave o llave o criterio de ordenamiento) se los procesa en categorías determinadas por los criterios de ordenamiento.
En otras palabras, se procesa un conjunto ordenado de registros en subconjuntos determinados por los criterios de orden.”

En tu caso, primero deberías ordenar la tabla dgvDatos por MARCA, para así utilizar este atributo como clasificador. Te adjunto cómo podrías comenzar a modificar tu código (no conozco mucho vb, así que no tomes este ejemplo como solución):

Sub Sumar()
    Dim marca as String // Defines la marca para la cual estás sumando sus valores SUBTOTAL.
    Dim totalMarca as Double = 0 // El SUBTOTAL de una marca.

    marca = //Obtener la primera MARCA (en el caso de tu ejemplo cuando este ordenado sería 'A')

    For Each fila As DataGridViewRow In dgvDatos.Rows
     If fila.Cells("SUBTOTAL").Value Is Nothing Then
        Exit Sub
     if(marca = fila.Cells("MARCA").Value) then
        totalMarca += Convert.ToDouble(fila.Cells("SUBTOTAL").Value)
     else
        lblMARCA.Text = Format(totalMarca, "$ #,##0.000")
        marca = fila.Cells("MARCA").Value
    End if

    Next
End Sub

De ésta manera, ordenando tu tabla como primer paso, te quedarían todas las filas pertenecientes a la MARCA ‘A’, luego todas las filas de la siguiente MARCA y así. El algoritmo suma todos los SUBTOTALES perteneciente a la primera marca, hasta encontrar una diferente a ésta y ahí setea la variable marca con la nueva marca (la siguiente a la primera definida que es ‘A’) para comenzar con todo el proceso de nuevo.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *