none
Sumar horas de una columna de un DataTable

    Question

  • Hola Buenos Días a todos los que participan en el foro,

    Agradecería que me puedan ayudar con la suma de una columna de un DataTable, entiendo que la table hay que recorrerlo (For Each) y obtener el valor y en cada iteracion sumar este valor, pero creo que no es sumar como cualquier entero.

    For each row as datarow in dtHoras.rows

    dim horas as datetime=Convert.ToDateTime(row("hora"))

    'Codigo para sumar...

    next

    txtSumaHoras.text=CStr(sumaHoras)

    Saludos


    Mauricio Hernández


    • Edited by mauriciohz Thursday, May 17, 2012 2:31 PM falta información
    Thursday, May 17, 2012 2:24 PM

Answers

  • o sea sumas solo horas

    Dim sumaHoras As New TimeSpan(0,0,0)
    
    For each row as datarow in dtHoras.rows
    
       Dim horas as TimeSpan= TimeSpan.Parse(CStr(row("hora")))
    
       sumaHoras = sumaHoras.Add(horas)
    
    next
    
    txtSumaHoras.text= sumaHoras.ToString("hh:mm:ss")


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marked as answer by mauriciohz Thursday, May 17, 2012 7:23 PM
    Thursday, May 17, 2012 3:27 PM
  • Gracias Leandro y Ramonyo

    mientras, hice el metodo de esta forma y funciona bien, de todas maneras revisare lo anterior

    Private Sub ObtenerHorasTotalHoras()
            Try
                Dim fecha As DateTime = dtpFechaPc.Value.ToShortDateString
                Dim dsHoras As DataSet = clsConductor.ObtenerHorasTrabajadas(fecha)
                Dim dtHorasCerradas As DataTable = dsHoras.Tables("TableHorasCerradas")
                Dim sumaHoras As New TimeSpan(0, 0, 0)

                For Each row As DataRow In dtHorasCerradas.Rows
                    Dim horas As TimeSpan = TimeSpan.Parse(CStr(row("horas1")))
                    'validar dbnull.value
                    sumaHoras = sumaHoras.Add(horas)
                Next
                Dim valor As String = sumaHoras.ToString()
                Dim sumTotalHoras As Int32
                Dim totalHoras As String
                Dim dias As Int32 = sumaHoras.Days
                Dim hora As Int32 = sumaHoras.Hours
                Dim min As Int32 = sumaHoras.Minutes
                Dim seg As Int32 = sumaHoras.Seconds
                If dias > 0 Then
                    dias = dias * 24 '24 horas del dia
                    sumTotalHoras = dias + hora
                    totalHoras = sumTotalHoras & ":" & min & ":" & seg
                Else
                    totalHoras = hora & ":" & min & ":" & seg
                End If
                MessageBox.Show(totalHoras)  ' "78:42:11" horas totales
            Catch ex As Exception
                KryptonMessageBox.Show(ex.Message)
            End Try
        End Sub

    Saludos

    Gracias


    Mauricio Hernández


    • Marked as answer by mauriciohz Thursday, May 17, 2012 7:22 PM
    • Edited by mauriciohz Thursday, May 17, 2012 7:24 PM falta info...
    Thursday, May 17, 2012 7:22 PM

All replies


  • Dim sumaHoras As DateTime = DateTime.Today ' aqui tienes que asignar una fecha de inicio
    
    For each row as datarow in dtHoras.rows
    
       Dim horas as TimeSpan= TimeSpan.Parse(CStr(row("hora")))
    
       sumaHoras = sumaHoras.Add(horas)
    
    next
    
    txtSumaHoras.text=CStr(sumaHoras)



    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    Thursday, May 17, 2012 2:40 PM
  • Hola Leandro

    El resultado obtenido por el algoritmo es "20-05-2012 6:42:11" que es la suma de la columna "Horas" de la imagen de arriba, pero este mismo ejercicio lo hice en Excel y me da como suma "78:42:11" horas totales lo que esta bien ya que representa la suma total en horas

    Como puedo obtener el resultado que tuve en excel?

    Saludos

    Gracias

    ...


    Mauricio Hernández

    Thursday, May 17, 2012 3:21 PM
  • o sea sumas solo horas

    Dim sumaHoras As New TimeSpan(0,0,0)
    
    For each row as datarow in dtHoras.rows
    
       Dim horas as TimeSpan= TimeSpan.Parse(CStr(row("hora")))
    
       sumaHoras = sumaHoras.Add(horas)
    
    next
    
    txtSumaHoras.text= sumaHoras.ToString("hh:mm:ss")


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marked as answer by mauriciohz Thursday, May 17, 2012 7:23 PM
    Thursday, May 17, 2012 3:27 PM
  • Leandro, 

    me da el siguiente error:

    linea: 

    txtSumaHoras.text= sumaHoras.ToString("hh:mm:ss")

    "Error 1 Error de resolución de sobrecarga porque ninguna de las funciones 'ToString' a las que se tiene acceso acepta este número de argumentos"

    Ahora si lo dejo sin el formato "hh:mm:ss" queda en 00:00:00

    a la espera de tus comentarios

    Saludos


    Mauricio Hernández

    Thursday, May 17, 2012 3:41 PM
  • que tal buenas tardes puedes hacer lo siguiente convertir todo a segundos te paso un ejemplo a continuacion:

    Dim sumHora As Integer = 0
            Dim sumMin As Integer = 0
            Dim sumSeg As Integer = 0
            Dim totSeg As Integer = 0
    
            For Each hora As String In arreglo
                Dim hr, mn, seg As String
                hr = Mid(hora, 1, 2)
                mn = Mid(hora, 4, 2)
                seg = Mid(hora, 7, 2)
                sumHora += ((hr * 60) * 60)
                sumMin += (mn * 60)
                sumSeg += seg
            Next
    
            totSeg = sumHora + sumSeg + sumMin

    y te paso una funcion para convertir esos segundos en formato hora minuto y segundos:

    Shared Function segundosAHoras(ByVal lSegundos As Integer) As String
    
            Try
                Dim minutos As Integer
                Dim horas As Integer
                Dim segundos As Integer
                Dim segundosHora As Integer = 3600
    
                horas = lSegundos \ segundosHora
                minutos = (lSegundos Mod segundosHora) \ 60
                segundos = (lSegundos Mod segundosHora) Mod 60
    
                segundosAHoras = horas & ":" & _
                                           Format(minutos, "00")
                segundosAHoras = segundosAHoras & ":" & _
                                           Format(segundos, "00")
    
            Catch ex As Exception
                segundosAHoras = "00:00:00"
            End Try
        End Function

    espero te solucione tu problema si no pues de perdido de te una idea, cualquier cosa estamos a la orden.

    Saludos...

    • Proposed as answer by ramonyo Thursday, May 17, 2012 5:28 PM
    Thursday, May 17, 2012 5:28 PM
  • Ahora si lo dejo sin el formato "hh:mm:ss" queda en 00:00:00

    pero si queda con cero es porque no sumo nada

    es del tipo TimeSpan la variable, el intenllisense del VS no marca un tostring() con parametros, porque eso si que es raro

    sino usa

    txtSumaHoras.text= String.Format("{0:hh:mm:ss}", sumaHoras);

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Thursday, May 17, 2012 5:43 PM
  • Gracias Leandro y Ramonyo

    mientras, hice el metodo de esta forma y funciona bien, de todas maneras revisare lo anterior

    Private Sub ObtenerHorasTotalHoras()
            Try
                Dim fecha As DateTime = dtpFechaPc.Value.ToShortDateString
                Dim dsHoras As DataSet = clsConductor.ObtenerHorasTrabajadas(fecha)
                Dim dtHorasCerradas As DataTable = dsHoras.Tables("TableHorasCerradas")
                Dim sumaHoras As New TimeSpan(0, 0, 0)

                For Each row As DataRow In dtHorasCerradas.Rows
                    Dim horas As TimeSpan = TimeSpan.Parse(CStr(row("horas1")))
                    'validar dbnull.value
                    sumaHoras = sumaHoras.Add(horas)
                Next
                Dim valor As String = sumaHoras.ToString()
                Dim sumTotalHoras As Int32
                Dim totalHoras As String
                Dim dias As Int32 = sumaHoras.Days
                Dim hora As Int32 = sumaHoras.Hours
                Dim min As Int32 = sumaHoras.Minutes
                Dim seg As Int32 = sumaHoras.Seconds
                If dias > 0 Then
                    dias = dias * 24 '24 horas del dia
                    sumTotalHoras = dias + hora
                    totalHoras = sumTotalHoras & ":" & min & ":" & seg
                Else
                    totalHoras = hora & ":" & min & ":" & seg
                End If
                MessageBox.Show(totalHoras)  ' "78:42:11" horas totales
            Catch ex As Exception
                KryptonMessageBox.Show(ex.Message)
            End Try
        End Sub

    Saludos

    Gracias


    Mauricio Hernández


    • Marked as answer by mauriciohz Thursday, May 17, 2012 7:22 PM
    • Edited by mauriciohz Thursday, May 17, 2012 7:24 PM falta info...
    Thursday, May 17, 2012 7:22 PM
  • saludos los Datatable tienen un metodo que bien puede ser util en tu caso.

    revizalo y nos comentas si obtienes el mismo resultado.

    lblTotalInversion.Text = String.Format("{0:N2}", dttResumenValorizacion.Compute("Sum(Inversion)", ""))

    Donde Inversion en el campo de mi DataTable
    Friday, May 18, 2012 7:38 PM