Ir para conteúdo
Fórum Script Brasil
  • 0

Cálculos De Horas


alexandremanowar

Pergunta

E ae pessoal

Estou desenvolvendo um projeto em vb.net estou usando winform.

Estou com seguinte problemas, é para uma empresa que os funcionários tem de 2 a 4 entradas no mesmo dia em horários diferentes, tipo assim:

Os caras entram as 7:00 e saí as 10:32, volta as 12:00 e saí as 14:50, entra 16:12 e saí as 19:25 entra 21:00 e saí as 23:48

ou pode ser que entre as 7:00 e saí as 12:00, depois entra as 14:24 e saí as 19:52, entra as 21:22 e saí as 23:50

ou entra as 7:00 e saí as 12:00 e depois entra as 15:30 e saí 23:40

AS entradas e saídas podem varias mas vai ser sempre de 2 a 4 entradas por dia, eu tenho que fazer um software que quando o cara for consultar o ponto mensal se o funcionário tiver passado de 8 horas trabalhas o software não mostre o ponto real que o funcionário fez mas mostre apenas 8 horas de trabalho ou seja quando for feita a consulta o programa soma todas as horas daquele dia e se passar de 8 horas ele reduz para 8 horas.

No banco de dados vai estar armazenado o horário real que o cara fez ma na tela apenas as 8 horas

Eu já tenho algo aqui estou quase chegando lá:

A horas são armazenadas da seguinte forma no meu banco: Tenho os campos:dia,horaentrada,minutoentrada,horasaida,minutosaida

Olha meu código como está:

If registro("dia") = 18 Then
                    Dim horaentrada = registro("horaentrada")
                    Dim horasaida = registro("horasaida")
                    Dim totalhoraentrada As Integer = totalhoraentrada + horaentrada
                    Dim totalhorasaida As Integer = totalhorasaida + horasaida
                    Dim totalhorafinal As Integer = totalhorasaida - totalhoraentrada
                    While i18 < 1
                        item = listafunc.Items.Add(registro("dia"))
                        i18 = i18 + 1
                    End While

                    If totalhorafinal <= 8 Then
                        item2 = registro("horaentrada") & ":" & registro("minutoentrada")
                        item.SubItems.Add(item2)
                        item3 = registro("horasaida") & ":" & registro("minutosaida")
                        item.SubItems.Add(item3)
                        MsgBox(totalhorafinal, MsgBoxStyle.Information, "ok")
                    Else
                        Dim horaroubo, horaroubo2 As Integer
                        ''MsgBox(totalhorafinal, MsgBoxStyle.Information, "ok")
                        horaroubo = totalhorafinal - 8
                        horaroubo2 = registro("horasaida") - horaroubo
                        item2 = registro("horaentrada") & ":" & registro("minutoentrada")
                        item.SubItems.Add(item2)
                        item3 = horaroubo2 & ":" & registro("minutosaida")
                        item.SubItems.Add(item3)
                    End If

                End If

Alguém pode me ajudar a arrumar esse código para calcular isso certinho?

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

Aí vai um exemplo com TimeSpan que simula aquele primeiro caso que você apresentou:

        Dim t1 As New TimeSpan(7, 0, 0) 'O cara entrou as 7h
        Dim t2 As New TimeSpan(10, 32, 0) 'O cara saiu as 10h32min
        Dim diferença1 As TimeSpan = t2.Subtract(t1) 'Subtrai
        Dim t3 As New TimeSpan(12, 0, 0) 'Entra novamente as 12h
        Dim t4 As New TimeSpan(14, 50, 0) 'Sai as 14h50min
        Dim diferença2 As TimeSpan = t4.Subtract(t3) 'Subtrai
        Dim t5 As New TimeSpan(16, 12, 0) 'Entra novamente as 16h12min
        Dim t6 As New TimeSpan(19, 52, 0) 'Sai novamente as 19h52min
        Dim diferença3 As TimeSpan = t6.Subtract(t5) 'Subtrai
        Dim t7 As New TimeSpan(21, 0, 0)  'Entra novamente as 21h
        Dim t8 As New TimeSpan(23, 48, 0) 'Sai as 23h48min
        Dim diferença4 As TimeSpan = t8.Subtract(t7) 'Subtrai

        MessageBox.Show(diferença1.ToString())
        MessageBox.Show(diferença2.ToString())
        MessageBox.Show(diferença3.ToString())
        MessageBox.Show(diferença4.ToString())

        Dim soma As TimeSpan = diferença1.Add(diferença2.Add(diferença3.Add(diferença4))) 'Total de horas trabalhadas
        Dim máximo As New TimeSpan(8, 0, 0) 'Máximo são 8 horas

        If soma.CompareTo(máximo) > 0 Then 'Se a soma for maior do que 8 horas
            MessageBox.Show(máximo.ToString())
        Else
            MessageBox.Show(soma.ToString())
        End If

No caso, como a soma dá 12h50min, você verá o 8h (por causa do If que testa isso).

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Cara valeu, legal essa função, entendi e estou testando, valeu mesmo pela força.

Os cálculos funcionam certo porém ainda falta algo, por exemplo ele deixa certinho mostrando 8 horas, mas eu tenho que listar na tela os horários do cara tipo, igual esse horário:

Esse é o horário original:

entrada 7:00 saída: 10:32

entrada:12:00 saída :14:50

entrada:16:12 sáida :19:52

entrada:21:00 saída 23:48

Esse horário ultrapassa as 8 horas de trabalho

Tenho que fazer com que o horário se ajuste para 8 horas de trabalho

Então o cálculo vai ser feito igual você fez se passar de 8 horas que é o caso desse valores vai ter que ajustar a listagem de modo que ela mostre apenas 8 horas, ou seja reduzir todos os horários acima de modo que eles totalizem 8 horas.

Cara já estou louco de tanto pensar e não consigo pensar em uma lógica para calcular isso!

Essa função que você me ensionou é muito melhor de trabalhar mas estou travando nesse final.

você tem alguma lógica para calcular isso?

Preciso de ajuda já estou nisso um tempão !!!!

Link para o comentário
Compartilhar em outros sites

  • 0

E ae Graymalkin beleza!

Cara acho que já faz umas duas semanas que peguei seu exemplo acima e não consigo montar uma lógica que faço o cálculo das horas reduzindo elas até formar as 8 horas. Cara que dificil já olhei vários tutorias para aprender ou achar uam idéia mas está dificil.

Eu tentei fazer mais ou menos assim pegar o total de horas divir por 4 e depois pegar o valor e subtrair por cada uma dos 4 valores. Mas não consegui nada. Fora outra coisas que tentei fazer!

você pode fazer um cálculo desse e me ensinar cara já estou sem idéia para fazer isso cara! Não sei mais o que fazer!

Parece pouco mas não cosigui cara tentei mas não consegui. Eu preciso de um cálculo que faça aquilo que postei acima!

você pode me ajudar cara?

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz um exemplo aqui pra ti:

Dim horários As New ArrayList
'                              Hora de entrada    Hora de saída
horários.Add(New TimeSpan() {New TimeSpan(7, 0, 0), New TimeSpan(10, 32, 0)})
horários.Add(New TimeSpan() {New TimeSpan(12, 0, 0), New TimeSpan(14, 50, 0)})
horários.Add(New TimeSpan() {New TimeSpan(16, 12, 0), New TimeSpan(19, 52, 0)})
horários.Add(New TimeSpan() {New TimeSpan(21, 0, 0), New TimeSpan(23, 48, 0)})

Dim inicial, final, subtotal, total As TimeSpan

total = New TimeSpan(0, 0, 0)
For Each horário As TimeSpan() In horários
    inicial = horário(0)
    final = horário(1)

    subtotal = final.Subtract(inicial)
    total = total.Add(subtotal)
    Debug.WriteLine(String.Format("Horário original: {0} -> {1}", inicial, final))
Next
Debug.WriteLine("Total original: " & total.ToString())

Dim máximo As New TimeSpan(8, 0, 0)
If total.CompareTo(máximo) > 0 Then
    Dim diferença As TimeSpan = total.Subtract(máximo)
    Dim minutos As Double = diferença.TotalMinutes
    Dim cada As Double = minutos / horários.Count

    For Each horário As TimeSpan() In horários
        'mudando a hora final, retirando o excedente
        horário(1) = horário(1).subtract(New TimeSpan(0, cada, 0))
    Next
End If

total = New TimeSpan(0, 0, 0)
For Each horário As TimeSpan() In horários
    inicial = horário(0)
    final = horário(1)

    subtotal = final.Subtract(inicial)
    total = total.Add(subtotal)
    Debug.WriteLine(String.Format("Horário modificado: {0} -> {1}", inicial, final))
Next
Debug.WriteLine("Novo total: " & total.ToString())

Veja os totais e os horários na janela de depuração. Você vai reparar que o novo total do exemplo acima vai dar 08:02:00, ou seja, vai passar dois minutos do máximo. Isso ocorre por que a divisão entre os minutos excedentes e o total de horários não é exata. Você pode arrendondar essa divisão (na variável "cada") utilizando Math.Ceiling(), ou fazer um novo loop daquele dividindo o excedente para os horários novamente e recalculando. Aí vai depender se pode ou não ter variações para cima e para baixo dos valores.

Certo? wink.gif

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Cara valeu pela força mais uma vez!

Eu estou estudando o código que você fez e estou com dúvida nessa parte:

If total.CompareTo(máximo) > 0 Then
            Dim diferença As TimeSpan = total.Subtract(máximo)
            Dim minutos As Double = diferença.TotalMinutes
            Dim cada As Double = minutos / horários.Count

            For Each horário As TimeSpan() In horários
                'mudando a hora final, retirando o excedente
                horário(1) = horário(1).subtract(New TimeSpan(0, cada, 0))
            Next
        End If

Olha o que eu entendi:

essa linha:Dim minutos As Double = diferença.TotalMinutes converte a hora excedente em minutos

essa linha: Dim cada As Double = minutos / horários.Count é onde eu estou com dúvidas ela converte em horas de novo acredito que estou entendendo errado!.

essa linha:horário(1) = horário(1).subtract(New TimeSpan(0, cada, 0)) eu entendi claro que ela tira o excedente mas a variável ficou apenas no lugar do minuto???? não teria que ser hora e minuto.

Por exemplo no exemplo que postei acima vou ter que retirar uma média de 4:12 minutos de cada saída?

O código funciona muito bem mas eu quero entender! Desculpe se estou encomodando cara. Esse é o único meio que tenho de entender ou aprender algo é aqui no fórum.

você pode me explicar esse pedaço?

AS demois partes do código estou entendeo bem!

Valeu pela força mais uma vez

Link para o comentário
Compartilhar em outros sites

  • 0

Cara valeu pela força mais uma vez!

Eu estou estudando o código que você fez e estou com dúvida nessa parte:

Ok. Vamos lá! smile.gif

Olha o que eu entendi:

essa linha:Dim minutos As Double = diferença.TotalMinutes converte a hora excedente em minutos

Exato.

essa linha: Dim cada As Double = minutos / horários.Count é onde eu estou com dúvidas ela converte em horas de novo acredito que estou entendendo errado!.

A variável "cada" é do tipo Double, ou seja, ela vai guardar um número de ponto flutuante, não um tempo. Se em minutos ficou 290 e existem 4 horários (horários.Count), o total armazenado em "cada" será 72,5 (ou seja, 290 / 4).

essa linha:horário(1) = horário(1).subtract(New TimeSpan(0, cada, 0)) eu entendi claro que ela tira o excedente mas a variável ficou apenas no lugar do minuto???? não teria que ser hora e minuto.

Porque são os minutos que temos, no caso, 72,5.

Por exemplo no exemplo que postei acima vou ter que retirar uma média de 4:12 minutos de cada saída?

Vai tirar aproximadamente 01:12:00 (o que são exatamente os 72 minutos acima, já que o 0,5 some porque o parâmetro passado tem que ser um inteiro).

Esclarecido agora? wink.gif Qualquer coisa, pergunta aí de novo que eu explico melhor.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

E ae Graymalkin beleza !

Cara estudei aqui o esquema e cheguei na solução que eu precisava! Consegui fazer o ajuste de horas e jogar no ListView.

Cara valeu mesmo pela força, você me ajudou muito, estou aprendendo legal aqui no fórum.

Para quem tiver o mesmo problema, é só estudar estudar os exemplos que o Graymalkin deixou e esse mais esse exemplo que estou postando:

Esse código faz uma consulta no banco e pega os valores para o cálculo e exibe em um ListView

Dim consultarelatorio As New SqlCommand("select * from pontofunc where funcionario = '" & Trim(func) & "' and  ano = " & Trim(ano) & " and mes = " & Trim(mesport) & "", sqlcon)
            Dim da2 As New SqlDataAdapter(consultarelatorio)
            Dim ds2 As New DataSet
            da2.Fill(ds2)

            listafunc.View = View.Details
            Dim coluna(8) As ColumnHeader
            coluna(0) = New ColumnHeader
            coluna(0).Text = "DIA"
            coluna(1) = New ColumnHeader
            coluna(1).Text = "ENTRADA"
            coluna(2) = New ColumnHeader
            coluna(2).Text = "SAÍDA"
            coluna(3) = New ColumnHeader
            coluna(3).Text = "ENTRADA"
            coluna(4) = New ColumnHeader
            coluna(4).Text = "SAÍDA"
            coluna(5) = New ColumnHeader
            coluna(5).Text = "ENTRADA"
            coluna(6) = New ColumnHeader
            coluna(6).Text = "SAÍDA"
            coluna(7) = New ColumnHeader
            coluna(7).Text = "ENTRADA"
            coluna(8) = New ColumnHeader
            coluna(8).Text = "SAÍDA"
            listafunc.Columns.AddRange(coluna)

            Dim item As ListViewItem
            Dim horarios As New ArrayList
            Dim registro
            Dim i As New Integer
            For Each registro In ds2.Tables(0).Rows
                If registro("dia") = 21 Then
                    'aqui armazena os valores 
                    horarios.Add(New TimeSpan() {New TimeSpan(registro("horaentrada"), registro("minutoentrada"), 0), New TimeSpan(registro("horasaida"), registro("minutosaida"), 0)})

                End If

            Next

            Dim entrada, saida, subtotal, total As TimeSpan

            total = New TimeSpan(0, 0, 0)
            For Each horário As TimeSpan() In horarios
                'esse é o horário real
                entrada = horário(0)
                saida = horário(1)
                'aqui é a diferença entre entrada e saída original
                subtotal = saida.Subtract(entrada)
                total = total.Add(subtotal)

            Next


            'aqui define o limete de 8 horas
            Dim máximo As New TimeSpan(8, 0, 0)
            If total.CompareTo(máximo) > 0 Then
                Dim diferença As TimeSpan = total.Subtract(máximo)
                Dim minutos As Double = diferença.TotalMinutes
                'aqui divide o horário excedente pela quantidade de horas
                Dim cada As Double = minutos / horarios.Count

                For Each horário As TimeSpan() In horarios
                    'mudando a hora final, retirando o excedente
                    'ou seja pegando a hora excedente e retirando da saida
                    horário(1) = horário(1).subtract(New TimeSpan(0, cada, 0))
                Next
            End If

            total = New TimeSpan(0, 0, 0)
            For Each horario As TimeSpan() In horarios
                'aqui os horários já estão reajustados
                entrada = horario(0)
                saida = horario(1)

                'aqui mostra a diferença de horas dos horários reajustados
                subtotal = saida.Subtract(entrada)
                total = total.Add(subtotal)

                While i < 1
                    item = listafunc.Items.Add(registro("dia"))
                    i = i + 1
                End While
                item.SubItems.Add(entrada.ToString)
                item.SubItems.Add(saida.ToString)



            Next



        End If

At+

Valeu

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...