Curso Completo Base de datos

Sumar hora de un DataGridView

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • Sumar hora de un DataGridView

    Hola a todos de nuevo.
    Ya está de vuelta vuestra pesadilla.
    En esta ocasión lo que no consigo es sumar las horas de una columna de un DataGridView.
    Después de dar muchas vueltas por internet, he conseguiido algunos códigos, pero los resultados que arrojan no son buenos.
    Os adjunto el código utilizado y el resultado que devuelve, que podréis ver en la copia de pantalla que acompaño.
    Código:
     Dim horasTotal As TimeSpan
        For Each registro As DataGridViewRow In dtgLineas.Rows
           'horasTotal += TimeSpan.Parse(registro.Cells("HORAS").Value) -->esta línea da error
            horasTotal += registro.Cells("HORAS").Value
        Next
    txtTotalTiempo.Text = horasTotal.ToString
    Como vereis por el gráfico, el resultado que da es incomprensible y lo curioso es que he probado con otros códigos y dan el mismo resultado.
    No se si es que no se interpretar el dato o que ocurre, pero esto no me sirve.
    ¿Podéis echarme una mano?
    Muchas gracias.
    Archivos adjuntos

  • #2

    Tú sabes, amigo Miguel, que yo no avancé por los caminos del .Net; pero he visto un post que me da la impresión de que puede serte útil
    Código:
     Dim Horas As Integer=0  
     Dim Minutos As Integer=0  
     For Each row As DataGridViewRow In DataGridView1.Rows           
                Horas = Horas + Convert.ToDateTime(row.Cells("HORAS").Value).Hour  
               Minutos = Minutos + Convert.ToDateTime(row.Cells("HORAS").Value).Minute  
        
     Next
    
    txtTotalTiempo.text =String.Format("{0}:{1}",Horas+Fix(Minutos/60),MinutosMod60)
    Perdóname si lo que te indico es una burrada...

    (Para más inri, al copiar el texto se me han perdido los espacios... He tenido que reinventarlos, y es posible que ni siquiera eso haya sabido hacer...)
    José María Movilla Cuadrado
    ______________________
    Normas del foro
    www.foro.vb-mundo.com
    www.vb-mundo.com

    Comentario


    • #3
      Que alegría me da encontrarte de nuevo.
      Muchas gracias por tu ya acostumbrada ayuda.
      Verás, ocurre que este es uno de los códigos que también he probado, pero sigue dando error.

      Te adjunto el error que devuelve:

      System.InvalidCastException: 'No se puede convertir un objeto de tipo 'System.TimeSpan' al tipo 'System.IConvertible'.'

      Habrá que seguir investigando.
      Muchísimas gracias por tu ayuda y de nuevo te re`pito que me ha encantado volverte a encontrar en este medio.
      Un abrazo.

      Comentario


      • #4
        Ya lo siento, amigo... No entiendo ni patata de esos tipos de variables...
        Ojalá lo soluciones pronto.
        Abrazo fuerte.
        José María Movilla Cuadrado
        ______________________
        Normas del foro
        www.foro.vb-mundo.com
        www.vb-mundo.com

        Comentario


        • #5
          En realidad el resultado que presentas no es tan incompresible, está diciendo que el tiempo empleado es 1 dia 12 horas y 24 minutos, entiendo que el formato devuelto no te gusta.
          Supongo que la variable horasTotal de tipo Date, si es así prueba:
          Código:
                  txtTotalTiempo.Text = (horasTotal.DayOfYear - 1) * 24 + horasTotal.Hour & ":" & _
                              horasTotal.Minute.ToString("00") & ":" & _
                              horasTotal.Second.ToString("00")
          Edito para decir que funcionará siempre que el total de horas sea menor o igual que 365 días
          Última edición por gilman; 27-03-2019, 04:23 PM.
          Una visita a las Normas del foro nunca viene mal

          Comentario


          • #6
            Hola de nuevo a todos.
            Creo haber descubierto el significado del aparentemente extraño resultado de la columna de horas que mostraba en el ejemplo.
            En este caso la suma nos daba como resultado 1.2:24:00 y es que al resultar que la suma es superior a 24 horas, nos presenta las horas como fracción de días, es decir, este caso sería 1.12 días y 24 minutos.
            Un poco enrevesado, pero creo que esta es la razón, pues cuando la suma es inferior a 24 horas, el resultado de la suma es el que esperamos.
            No se si me habré explicado bien, pero creo que es así.
            Por favor, si alguien detectara que estoy en un error agradecería que nos lo hiciera saber.
            Gracias por todo y perdón por haberme anticipado un poco al plantear la pregunta.
            Saludos.
            Última edición por MiguelPG; 27-03-2019, 09:24 PM.

            Comentario


            • #7
              Hola otra vez.
              Ante todo quiero pedir disculpas a Gilman porque había enviado una respuesta y no me di cuenta de ello cuando envié mi anterior post ttratando de descifrar el resultado.
              Por lo que veo a través de la respuesta de Gilman, efectivamente, se trata de resumen de las hora en días.
              Dicho esto, comentar que he hecho lo que me dices amigo Gilman, pero me da un error. A continuación pongo de nuevo el código y tambien el error que me da.
              Código:
              Dim horasTotal As Date
              For Each registro As DataGridViewRow In dtgLineas.Rows
              horasTotal += registro.Cells("HORAS").Value
              Next
              
              txtTotalTiempo.Text = (horasTotal.DayOfYear - 1) * 24 + horasTotal.Hour & ":" &
                      horasTotal.Minute.ToString("00") & ":" &
                      horasTotal.Second.ToString("00")
              y el error que me devuelve es:
              System.InvalidCastException: 'La conversión de la cadena "16:21:000:00:00" en el tipo 'Date' no es válida.'
              Muchas gracias por vuestra ayuda.

              Comentario


              • #8
                en principio la sentencia
                Código:
                txtTotalTiempo.Text = (horasTotal.DayOfYear - 1) * 24 + horasTotal.Hour & ":" & _
                                    horasTotal.Minute.ToString("00") & ":" & _
                                    horasTotal.Second.ToString("00")
                No debería dar ese error, así que supongo que la sentencia que produce el error se produce en la sentencia:
                Código:
                horasTotal += registro.Cells("HORAS").Value
                y si es así es porque registro.Cells("HORAS").Value es un valor de tipo date, y para hacer la operación +=primero lo convierte en cadena para concatenarlo con horasTotal ya que el operador suma no esta definido para operandos de tipo Date.
                Si esto es así, prueba el siguiente código:
                Código:
                Dim horasTotal As Date
                
                For Each registro As DataGridViewRow In dtgLineas.Rows
                    horasTotal += New TimeSpan(CDate(registro.Cells("HORAS").Value).Hour, _
                                               CDate(registro.Cells("HORAS").Value).Minute, _
                                               CDate(registro.Cells("HORAS").Value).Second)
                Next
                
                txtTotalTiempo.Text = (horasTotal.DayOfYear - 1) * 24 + horasTotal.Hour & ":" & _
                                    horasTotal.Minute.ToString("00") & ":" & _
                                    horasTotal.Second.ToString("00")
                De todas formas deberías indicar en que sentencia se produce realmente el error
                Una visita a las Normas del foro nunca viene mal

                Comentario


                • #9
                  Hola de nuevo y muchas gracias Gilman por tu paciencia y atención.
                  He seguido tus indicaciones y he utilizado el siguiente código:
                  Código:
                      Private Sub sumatiempo()
                          Dim horasTotal As Date
                          For Each registro As DataGridViewRow In dtgLineas.Rows
                              horasTotal += New TimeSpan(CDate(registro.Cells("HORAS").Value).Hour,
                                                 CDate(registro.Cells("HORAS").Value).Minute,
                                                 CDate(registro.Cells("HORAS").Value).Second)
                          Next
                  
                  
                          txtTotalTiempo.Text = (horasTotal.DayOfYear - 1) * 24 + horasTotal.Hour & ":" &
                          horasTotal.Minute.ToString("00") & ":" &
                          horasTotal.Second.ToString("00")
                      End Sub
                  Al ejecutar me da error en la siguiente línea:

                  horasTotal += New TimeSpan(CDate(registro.Cells("HORAS").Value).Hour ,
                  CDate(registro.Cells("HORAS").Value).Minute,
                  CDate(registro.Cells("HORAS").Value).Second)

                  indicando:
                  Excepción no controlada.
                  System.InvalidCastException: 'La conversión del tipo 'TimeSpan' en el tipo 'Date' no es válida.'

                  Posiblemente (bueno, seguramente) que la culpa sea mía, pero no acabo de verlo.
                  El motivo por el que me interesa tener el resultado en horas es porque luego con ese dato tengo que hacer operaciones, como por ejemplo calcular el costo de las horas.

                  No se si habrá alguna cosa rara, porque la página del foro esta tarde, de repente, me está dando problemas.
                  Gracias de nuevo por todo.
                  Última edición por MiguelPG; 28-03-2019, 08:42 PM.

                  Comentario


                  • #10
                    Si la página anda rara.
                    Bueno, en cuanto al problema, es extraño, como la primera opción funcionaba, solo con el problema del formato, yo propuse solo como cambiar el formato, creo que el problema es el tipo de registro.Cells("HORAS").Value, comprueba que tipo, es me da que es de tipo String, ya que con tipos TimeSpan o Date, la solución que yo aportaba funciona, prueba el código siguiente, debería funcionar correctamente.
                    Código:
                        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                            MessageBox.Show("Calculado con TimeSpam: " & ConTimeSpan())
                            MessageBox.Show("Calculado con Date: " & ConDate())
                            MessageBox.Show("Calculado con String: " & ConString())
                        End Sub
                    
                        Private Function ConTimeSpan() As String
                            Dim Intervalos(2) As TimeSpan
                            Dim TotalHoras As Date
                            Intervalos(0) = New TimeSpan(10, 20, 25)
                            Intervalos(1) = New TimeSpan(12, 13, 25)
                            Intervalos(2) = New TimeSpan(5, 10, 25)
                            For i As Integer = 0 To 2
                                TotalHoras += Intervalos(i)
                            Next
                            Return (TotalHoras.DayOfYear - 1) * 24 + TotalHoras.Hour & ":" & _
                                        TotalHoras.Minute.ToString("00") & ":" & _
                                        TotalHoras.Second.ToString("00")
                        End Function
                    
                        Private Function ConDate() As String
                            Dim Intervalos(2) As Date
                            Dim TotalHoras As Date
                            Intervalos(0) = TimeSerial(10, 20, 25)
                            Intervalos(1) = TimeSerial(12, 13, 25)
                            Intervalos(2) = TimeSerial(5, 10, 25)
                            For i As Integer = 0 To 2
                                TotalHoras += New TimeSpan(Intervalos(i).Hour, _
                                                   Intervalos(i).Minute, _
                                                   Intervalos(i).Second)
                            Next
                            Return (TotalHoras.DayOfYear - 1) * 24 + TotalHoras.Hour & ":" & _
                                        TotalHoras.Minute.ToString("00") & ":" & _
                                        TotalHoras.Second.ToString("00")
                        End Function
                    
                        Private Function ConString() As String
                            Dim Intervalos(2) As String
                            Dim TotalHoras As Date
                            Intervalos(0) = "10:20:25"
                            Intervalos(1) = "12:13:25"
                            Intervalos(2) = "5:10:25"
                            For i As Integer = 0 To 2
                                Dim a() As String = Intervalos(i).Split(":")
                    
                                TotalHoras += New TimeSpan(a(0), _
                                                   a(1), _
                                                   a(2))
                            Next
                            Return (TotalHoras.DayOfYear - 1) * 24 + TotalHoras.Hour & ":" & _
                                        TotalHoras.Minute.ToString("00") & ":" & _
                                        TotalHoras.Second.ToString("00")
                        End Function
                    Si el tipo de registro.Cells("HORAS").Value es finalmente String, Prueba con el que aporta la función ConString.
                    Pero en ese caso no entiendo porque funcionó el primer código que aportas.
                    Una visita a las Normas del foro nunca viene mal

                    Comentario


                    • #11
                      Hola de nuevo y perdón por mi tardanza en responder.
                      YA FUNCIONA y todo gracias a ti Gilman.
                      Como siempre, seguí tus indicaciones y con el código que publico a continuación funcionó a la primera.
                      Aclarar que degLineas es un DataGridView que en una de sus columnas llamada HORAS muestra las horas de cada jornada trabajada.

                      Código:
                          Private Function Sumatiempo() As String
                              Dim Intervalos As TimeSpan
                              Dim TotalHoras As Date
                              For Each registro As DataGridViewRow In dtgLineas.Rows
                                  Intervalos = registro.Cells("HORAS").Value
                                  TotalHoras += Intervalos
                              Next
                              Return (TotalHoras.DayOfYear - 1) * 24 + TotalHoras.Hour & ":" &
                                              TotalHoras.Minute.ToString("00") & ":" &
                                              TotalHoras.Second.ToString("00")
                          End Function
                      Gracias de nuevo por tu ayuda.
                      Saludos cordiales para todos.

                      Comentario

                      Trabajando...
                      X