IPB

Bem-vindo, visitante ( Entrar | Registrar )

 
Reply to this topicStart new topic
Calcular Horas Com Dias Diferentes, como somar horas quando os dias são diferentes
Nelson Sousa
post Jul 19 2010, 09:50 AM
Post #1


Analista
****

Grupo: Administradores
Posts: 551
Registrado: 2-July 08
De: Muriaé - MG
Membro N°: 4



Olá,

Não há necessidade de um módulo exclusivo para a função. Você pode colocá-la dentro de um módulo já exitente em seu sistema. Fica a seu critério. No meu caso eu costumo agrupar as funções que trabalham com datas em um módulo, as financeiras em outro e por aí vai. Fica mais fácil pra eu localizar.
Quanto a atrapalhar a função do Roberto, creio que não atrapalhe.
Go to the top of the page
 
+Quote Post
Celso Garcia
post Jul 19 2010, 08:08 AM
Post #2


Calouro
*

Grupo: Membros
Posts: 18
Registrado: 1-December 09
De: Zona Sul - São Paulo - SP - Brasil
Membro N°: 2.300



Oi, Nelson.

Bom dia!

Devo estar fora esta semana, pelo menos até quarta (21.07) e assim que voltar vou testar este código que me passou.

Basta apenas criar um módulo com ele? Já estou usando o código que o Roberto me passou. Atrapalha alguma coisa?

Obrigado pela força.

Celso Garcia
Go to the top of the page
 
+Quote Post
Nelson Sousa
post Jul 16 2010, 04:26 PM
Post #3


Analista
****

Grupo: Administradores
Posts: 551
Registrado: 2-July 08
De: Muriaé - MG
Membro N°: 4



Olá,

Eu tenho aqui uma função que formata intervalos entre datas, veja se ajuda:

CODE
Function FormatInterval(ByVal Interval As Variant, Fmt As String)
' Formats the difference between two dates or sum of two times
' to show day as well as hours, minutes, and seconds.
'
' Supports the following formats:
'   D H                    5 Days 5 Hours
'   D H:MM                 5 Days 5:15
'   D HH:MM                5 Days 05:15
'   D H:MM:SS              5 Days 5:15:45
'   D HH:MM:SS             5 Days 05:15:45
'   H M                    125 Hours 15 Minutes
'   H:MM                   125:15
'   H:MM:SS                125:15:45
'   M S                    7515 Minutes 45 Seconds
'
Dim Days As Long, Hours As Long, Minutes As Long, Seconds As Long
'
' Check for Date or Double
'
  If varType(Interval) <> 7 And varType(Interval) <> 5 Then Exit Function
'
' Parse Days
'
  Days = Int(Interval)
  Interval = Interval - Days
  If Interval > #11:59:59 PM# Then
    Days = Days + 1
    Interval = 0#
  End If
'
' Parse Hours
'
  Interval = Interval * 24
  Hours = Int(Interval)
  Interval = Interval - Hours
  If Interval > 3599# / 3600# Then
    Hours = Hours + 1
    Interval = 0#
  End If
'
' Parse Minutes
'
  Interval = Interval * 60
  Minutes = Int(Interval)
  Interval = Interval - Minutes
  If Interval > 59# / 60# Then
    Minutes = Minutes + 1
    Interval = 0#
  End If
'
' Parse Seconds
'
  Seconds = Int(Interval * 60 + 0.5)
'
' Normalize
'
  If Seconds = 60 Then
    Minutes = Minutes + 1
    Seconds = 0
  End If
  If Minutes > 59 Then
    Hours = Hours + 1
    Minutes = Minutes - 60
  End If
  If Hours > 23 Then
    Days = Days + 1
    Hours = Hours - 24
  End If
'
' Create format
'
  Select Case Fmt
    Case "D H"
      FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Hours & IIf(Hours <> 1, " Hours", " Hour")
    Case "D H:MM"
      FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Hours & ":" & Format(Minutes, "00")
    Case "D HH:MM"
      FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Format(Hours, "00") & ":" & Format(Minutes, "00")
    Case "D H:MM:SS"
      FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Hours & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
    Case "D HH:MM:SS"
      FormatInterval = Days & IIf(Days <> 1, " Dias ", " Day ") & Format(Hours, "00") & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
    Case "H M"
      Hours = Hours + Days * 24
      FormatInterval = Hours & IIf(Hours <> 1, " Hours ", " Hour ") & Minutes & IIf(Minutes <> 1, " Minutes", " Minute")
    Case "H:MM"
      Hours = Hours + Days * 24
      FormatInterval = Hours & ":" & Format(Minutes, "00")
    Case "H:MM:SS"
      Hours = Hours + Days * 24
      FormatInterval = Hours & ":" & Format(Minutes, "00") & ":" & Format(Seconds, "00")
    Case "M S"
      Minutes = Minutes + (Hours + Days * 24) * 60
      FormatInterval = Minutes & IIf(Minutes <> 1, " Minutes ", " Minute ") & Seconds & IIf(Seconds <> 1, " Seconds", " Second")
    Case Else
      FormatInterval = Null
  End Select
End Function
Go to the top of the page
 
+Quote Post
Celso Garcia
post Jul 16 2010, 04:09 PM
Post #4


Calouro
*

Grupo: Membros
Posts: 18
Registrado: 1-December 09
De: Zona Sul - São Paulo - SP - Brasil
Membro N°: 2.300



Ok, Roberto.

Vou fazer isso, sim.

Caso eu tenha dúvidas vou te pedir ajuda, mas entendi o que fazer.

Obrigado.

Celso Garcia
Go to the top of the page
 
+Quote Post
Roberto Pires
post Jul 16 2010, 03:07 PM
Post #5


Analista
****

Grupo: Membros
Posts: 283
Registrado: 3-July 08
De: Fraiburgo-SC
Membro N°: 11



Celso,

Você pode formatar assim sem problemas se for apenas para exibição.

Para efetuar cálculos você teria que fazer uma modificação achando a fração dos minutos e segundos para o caso de valor/hora. Exemplo:

CODE
fracao_minutos = minutos / 60
fracao_segundos = segundos / 3600
HoraCalculo = Horas + fracao_minutos + fracao_segundos


Veja um exemplo de função que já calcula o custo do total, bastando informar a Hora Chegada,Hora Saída e o Valor da Hora.

CODE
Public Function CalculaCustoTotal(HI As Date, HF As Date, ValorHora As Double) As Double
On Error Resume Next

Intervalo = HF - HI

vdf = CDate(HF)
vdi = CDate(HI)
Interval = vdf - vdi

Horas = Int(CSng(Interval * 24))
minutos = Int(CSng(Interval * 1440)) Mod 60
segundos = Int(CSng(Interval * 86400)) Mod 60

fracao_minutos = minutos / 60
fracao_segundos = segundos / 3600
HoraCalculo = Horas + fracao_minutos + fracao_segundos

CalculaCustoTotal = FormatNumber(HoraCalculo * ValorHora, 2)

End Function


Uso na consulta:

CODE
CustoTotal: CalculaCustoTotal([CHEGADA] & " " & [HORA CHEGADA];[SAIDA] & " " & [HORA SAIDA];12,3)
Go to the top of the page
 
+Quote Post
Celso Garcia
post Jul 16 2010, 10:47 AM
Post #6


Calouro
*

Grupo: Membros
Posts: 18
Registrado: 1-December 09
De: Zona Sul - São Paulo - SP - Brasil
Membro N°: 2.300



Oi, Roberto.

Bom dia!

Por gentileza, me esclarece uma dúvida.

Eu formatei o campo INTERVALO como Hora Abreviada (00:00) e não surtiu efeito. Então formatei no "módulo criado" assim:

Public Function CalculaIntervalo(HI As Date, HF As Date) As String
On Error Resume Next

Intervalo = HF - HI

vdf = CDate(HF)
vdi = CDate(HI)
Interval = vdf - vdi

Horas = Int(CSng(Interval * 24))
minutos = Int(CSng(Interval * 1440)) Mod 60
segundos = Int(CSng(Interval * 86400)) Mod 60

CalculaIntervalo = Horas & " : " & Format(Interval, "nn")

End Function

Não tem problema, né?


Outra dúvida: Posso utilizar o campo INTERVALO para cálculos?

Por exemplo: INTERVALO 08:50 * R$ 12,30 (custo por hora)


Obrigado

Celso Garcia
Go to the top of the page
 
+Quote Post
Celso Garcia
post Jul 15 2010, 02:29 PM
Post #7


Calouro
*

Grupo: Membros
Posts: 18
Registrado: 1-December 09
De: Zona Sul - São Paulo - SP - Brasil
Membro N°: 2.300



Oi, Roberto.

Eu passei a manhã inteira tentando inverter a função para que desse certo e não estava conseguindo.

Na realidade para se saber o total de horas gastas temos que diminuir a Hora de Saída da Hora de Chegada, ou seja,

[HORA CHEGADA] - [HORA SAÍDA] = TOTAL HORAS GASTAS

e agora, neste teu post, você me deu a solução. Eu fiz esta inversão (que eu não havia feito) assim:

Intervalo: CalculaIntervalo([SAIDA] & " " & [HORA SAIDA];[CHEGADA] & " " & [HORA CHEGADA])

e deu certíssimo.


Já fiz alguns testes e não encontrei nenhum erro.


O arquivo "TESTE HORAS" está para download caso alguém se interesse em tirar as dúvidas ou usá-lo como exemplo.


Muito obrigado, Roberto, valeu pela força e por sua paciência, meu amigo.

(IMG:http://www.ativoaccess.com.br/forum/style_emoticons/default/rolleyes.gif) Celso Garcia (IMG:http://www.ativoaccess.com.br/forum/style_emoticons/default/rolleyes.gif)
Go to the top of the page
 
+Quote Post
Roberto Pires
post Jul 15 2010, 01:50 PM
Post #8


Analista
****

Grupo: Membros
Posts: 283
Registrado: 3-July 08
De: Fraiburgo-SC
Membro N°: 11



Celso,

Você deve estar invertendo a entrada dos Parâmetros na Função.

Na minha Função você deve passar primeiro a Data e Hora de Chegada assim:

CODE
Intervalo: CalculaIntervalo([CHEGADA] & " " & [HORA CHEGADA];[SAIDA] & " " & [HORA SAIDA])


Ou verifique na função se você não trocou a ordem de subtração das variáveis.
Go to the top of the page
 
+Quote Post
Celso Garcia
post Jul 15 2010, 10:30 AM
Post #9


Calouro
*

Grupo: Membros
Posts: 18
Registrado: 1-December 09
De: Zona Sul - São Paulo - SP - Brasil
Membro N°: 2.300



Oi, Roberto.

Bom dia!

Obrigado por sua paciência em me explicar.

Fiz como você citou e deu certo. Inclusive não estou mais usando os campos TOTALDIA e TOTALHORA que substitui pelo campo INTERVALO.

Um detalhe não bateu:
No INTERVALO (cálculo das horas) ele resulta em negativo ( -17 horas : -33 minutos : 0 segundos) e quando os horários tem minutos ( ex. 07:10 ou 17:00 ) ele acresce 01 hora.


Exemplo: data saída 15.07.2010 data chegada 16.07.2010 (dia seguinte)
................hora saída 07:00 hora chegada 07:10

................total de horas: 24:10 hrs ... mas no INTERVALO ele resulta em -25:10 hrs

............se mesmas datas
................hora saída 07:10 hora chegada 07:00

................total de horas: 23:50 hrs mas no INTERVALO ele resulta em -24:50 hrs

Estou tentando inverter e entender este resultado, mas tá meio difícil...

Tem alguma coisa que eu possa arrumar por aqui?

Grato,

Celso Garcia
Go to the top of the page
 
+Quote Post
Roberto Pires
post Jul 14 2010, 03:46 PM
Post #10


Analista
****

Grupo: Membros
Posts: 283
Registrado: 3-July 08
De: Fraiburgo-SC
Membro N°: 11



Celso,

Para testar essa função faz assim:

Cole a seguinte função em um novo módulo acessando: Menu-Criar-Macro-Módulo

CODE
Public Function CalculaIntervalo(HI As Date, HF As Date) As String
On Error Resume Next

Intervalo = HF - HI

vdf = CDate(HF)
vdi = CDate(HI)
interval = vdf - vdi

Horas = Int(CSng(interval * 24))
minutos = Int(CSng(interval * 1440)) Mod 60
segundos = Int(CSng(interval * 86400)) Mod 60

CalculaIntervalo = "Horas: " & Horas & "   Minutos: " & minutos & "   Segundos: " & segundos

End Function


Salve e adicione um novo campo na sua Consulta que está vinculada no Formulário assim:

CODE
Intervalo: CalculaIntervalo([CHEGADA] & " " & [HORA CHEGADA];[SAIDA] & " " & [HORA SAIDA])


Teste e modifique de acordo com sua necessidade.
Go to the top of the page
 
+Quote Post
Celso Garcia
post Jul 14 2010, 03:11 PM
Post #11


Calouro
*

Grupo: Membros
Posts: 18
Registrado: 1-December 09
De: Zona Sul - São Paulo - SP - Brasil
Membro N°: 2.300



Olá, Roberto.

Boa Tarde!

Não estou conseguindo colocar este código. No campo TotalDia eu abri o evento em "SUJO" e colei. Creio que esteja errado.

Tomei a liberdade de colocá-lo no 4Shared, caso você possa dar uma olhada.

http://www.4shared.com/file/y5JFrVsV/TESTE_HORAS.html

De qualquer modo, obrigado pela atenção

Celso Garcia
Go to the top of the page
 
+Quote Post
Roberto Pires
post Jul 14 2010, 02:04 PM
Post #12


Analista
****

Grupo: Membros
Posts: 283
Registrado: 3-July 08
De: Fraiburgo-SC
Membro N°: 11



Teste esse código:

CODE
Private Sub CalculaIntervalo()

Intervalo = Me.HORA_SAIDA - Me.HORA_CHEGADA

vdf = CDate(Me.HORA_SAIDA)
vdi = CDate(Me.HORA_CHEGADA)
interval = vdf - vdi

horas = Int(CSng(interval * 24))
minutos = Int(CSng(interval * 1440)) Mod 60
segundos = Int(CSng(interval * 86400)) Mod 60

MsgBox "Horas:  " & horas & vbCrLf & "Minutos: " & minutos & vbCrLf & "Segundos: " & segundos

End Sub


Ou veja esse tópico: Calcular Horas
Go to the top of the page
 
+Quote Post
Celso Garcia
post Jul 14 2010, 10:21 AM
Post #13


Calouro
*

Grupo: Membros
Posts: 18
Registrado: 1-December 09
De: Zona Sul - São Paulo - SP - Brasil
Membro N°: 2.300



Olá, amigos.
Bom dia!

Estou sem saber o que fazer.

Para um veículo que sai no dia 01.07.2010 às 08:00hrs e retorna no dia 01.07.2010 (mesmo dia) às 17:00hrs o total é de 09:00hrs trabalhadas. (já consegui fazê-lo)

Para um veículo que sai no dia 01.07.2010 às 08:00hrs e retorna no dia 02.07.2010 (dia seguinte) às 03:00hrs o total é de 17:00hrs trabalhadas. (também já consegui fazê-lo)

Usei o seguinte caminho:
Entrei no designe do formulário, fui em Editar Lista de Campos e criei um campo com esta fórmula:

TOTAL HORAS: SeImed([HORA CHEGADA]>[HORA SAIDA];[HORA CHEGADA]-[HORA SAIDA];([24 HORAS]-[HORA SAIDA]+[acerto])+[HORA CHEGADA])

Agora me surgiu um problema e não consegui resolvê-lo:

Para um veículo que sai no dia 01.07.2010 às 08:00hrs e retorna no dia 02.07.2010 (dia seguinte) às 17:00hrs o total é de 31:00hrs trabalhadas.

Como tenho dois campos DataSaída e Data Chegada, eu tentei subtrair o DataChegada e o DataSaída que deu certo. Consigo converter os dias (1 dia neste caso * 24) e aparece no campo TOTAL DIAS o número 24.
Porém, quando tento somar estes 24 + as horas trabalhadas dá erro

O que eu posso fazer?

Grato,

Celso Garcia
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 usuário(s) está(ão) lendo este tópico (1 visitantes e 0 usuários anônimos)
0 membros:

 

Modos de Exibição: Padrão · Mudar para: Linear+ · Mudar para: Outline


Versão Simples Horário: 19th December 2018 - 03:04 AM