MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


3 participantes

    [Resolvido]Ainda o problema das contas com horas

    avatar
    jess
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 77
    Registrado : 17/09/2010

    [Resolvido]Ainda o problema das contas com horas Empty [Resolvido]Ainda o problema das contas com horas

    Mensagem  jess 2/10/2010, 17:53

    Há algum tempo que estou a desenvolver uma base na qual tenho um botão que leva a um código para calcular a diferença entre uma hora final e outra inicial. Ou seja, calcular o tempo a que uma tarefa está a decorrer.
    O código que utilizei para gerir a qestão das horas é o seguinte, que encontrei numa busca pela net:

    Function GetElapsedTime(interval)

    Dim totalhours As Long, totalminutes As Long, totalseconds As Long
    Dim days As Long, hours As Long, minutes As Long, Seconds As Long

    days = Int(CSng(interval))
    totalhours = Int(CSng(interval * 24))
    totalminutes = Int(CSng(interval * 1440))
    totalseconds = Int(CSng(interval * 86400))
    hours = totalhours Mod 24
    minutes = totalminutes Mod 60
    Seconds = totalseconds Mod 60

    GetElapsedTime = days * 24 + hours & " Horas " & minutes & _
    " Min. " & Seconds & " Seg. "

    End Function

    Depois foi criar o botão de comando com o seguinte código:

    MsgBox (GetElapsedTime(Now() - [Hora]))


    Isto funciona bem desde que os campos hora estejam no formato DD-MM-YYYY H:M
    Tenho estes campos a abrir com a hora do sistema neste formato. Se for necessário alterar a hora ou data e não ficar neste formato dá erro de overflow.
    Também não consegui usar apenas as horas porque não dá certo quando a hora final corresponde a um dia diferente da inicial.
    Já procurei muito e não encontro solução mais simples para isto. Para além disso eu sou um mero utilizador que gosta de meter o nariz na programação Very Happy
    Alguém tem alguma ideia melhor e mais funcional que esta?

    Cumprimentos

    jess
    vieirasoft
    vieirasoft
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7304
    Registrado : 11/05/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  vieirasoft 2/10/2010, 18:32

    Amigo Jess

    Veja se este exemplo lhe serve
    Este tem 3 campos: 1 para a hora de inicio altura em que abre o formulário, 1 para a hora de fim que é inserida quando se clica no botão de gravar e 1 campo para calcular a diferença

    http://dl.dropbox.com/u/8157744/BD_teste_da_hora.zip


    Abraço
    avatar
    jess
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 77
    Registrado : 17/09/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  jess 2/10/2010, 19:03

    Caro vieirasoft

    Mais uma vez o meu obrigado pela sua pronta resposta a mais uma dúvida.
    Este seu exemplo, quando o passei para a minha base, retorna valores do tipo 103,23445347358.
    Para além disso não me resolve outro problema que é o da possibilidade da tarefa ser realizada ao longo de vários dias. Aí a fórmula não reconhece as horas que correspondem a 5 dias de intervalo, por exemplo.
    No código que mostrei atrás essas contas são feitas mas se um utilizador alterar a data ou hora para um formato diferente, dá logo erro. Não posso bloquear o campo porque pode haver a necessidade de efectuar um registo mais tarde e aí a hora tem que ser corrigida. Já tentei colocar máscara de introdução mas também dá erro.
    vieirasoft
    vieirasoft
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7304
    Registrado : 11/05/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  vieirasoft 2/10/2010, 19:14

    Jess

    Porque não formata o campo para hora unicamente? Não é isso que lhe interessa?
    vieirasoft
    vieirasoft
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7304
    Registrado : 11/05/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  vieirasoft 2/10/2010, 19:22

    Jess

    Tente assim

    Function GetElapsedTime(interval)

    Dim totalhours As Long, totalminutes As Long, totalseconds As _
    Long
    Dim days As Long, hours As Long, Minutes As Long, Seconds As Long

    days = Int(CSng(interval))
    totalhours = Int(CSng(interval * 24))
    totalminutes = Int(CSng(interval * 1440))
    totalseconds = Int(CSng(interval * 86400))
    hours = totalhours Mod 24
    Minutes = totalminutes Mod 60
    Seconds = totalseconds Mod 60

    GetElapsedTime = days & " Days " & hours & " Hours " & Minutes & _
    " Minutes " & Seconds & " Seconds "

    End Function

    Na caixa de texto

    OrigemDoControle: =GetElapsedTime([Hora de término]-[Hora de início])
    avatar
    jess
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 77
    Registrado : 17/09/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  jess 2/10/2010, 19:30

    Sim, é a hora que interessa mas perante a possibilidade de haver intervalos de, por exemplo, 72 horas ou mais, não consegui resolver esse problema. Se uma tarefa tiver o seu final 4 ou 5 dias depois do início, fico com o problema de contabilizar todas essas horas. O campo "Hora" tem o seu valor atribuído pela instrução now() quando o formulário abre. A instrução now() entra em conta com a data e hora, pelo que entendi. Quando alguém modifica a hora manualmente, não introduz a data mas apenas a hora. Esse facto leva ao erro porque o código do botão que pede o intervalo de tempo, aplica esta fórmula: GetElapsedTime(now()-[Data])
    Não consegui dar a volta a isto sem ter sempre presentes data e hora. Tive que criar msgbox com aviso para manterem o formato DD-MM-YYYY H:M quando alteram a hora.
    avatar
    jess
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 77
    Registrado : 17/09/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  jess 2/10/2010, 19:36

    Caro vieirasoft

    O código que apresenta é semelhante ao que eu encontrei na net aquando das minhas buscas. alterei-o multiplicando "days" por 24 e adicionando "hours" de modo a ter o resultado em horas, minutos e segundos.
    Este código foi de facto o melhor que encontrei para resolver o meu problema. Seria excelete se a base fosse apenas para ser usada por mim. O meu receio são os utilizadores mais incautos devido ao rigor que exige no campo "Hora"
    vieirasoft
    vieirasoft
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7304
    Registrado : 11/05/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  vieirasoft 2/10/2010, 19:43

    amigo

    vou fazer aqui uns testes a ver se encontro solução e depois retorno
    vieirasoft
    vieirasoft
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7304
    Registrado : 11/05/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  vieirasoft 2/10/2010, 21:22

    Caro Jess

    Este problema de misturar data ehora no mesmo campo já vem de longe. Não estou a ver ao vivo a aplicação, mas se você puder separar era a solução melhor. Da forma que4 está vai dar dores de cabeça. Tente um caminho mais fácil. Grandes códigos não significam grandes soluções. Eu nunca misturo nas minhas aplicações no mesmo campo a data e a hora. Como diz o Mestre JPaulo, o simples é o óbvio.
    JPaulo
    JPaulo
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 11026
    Registrado : 04/11/2009

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  JPaulo 3/10/2010, 20:04

    Você quer o resultado ultrapassando a barreira das 24 horas ?

    Não necessita de código, veja o simples:

    Num campo vazio da sua consulta para teste;

    Resultado: DifData("h";[DataHoraInicio];[DataHoraFim]) & ":" & Format((DifData("n";[DataHoraInicio];[DataHoraFim]) Mod 60);"00")



    .................................................................................
    Contribua com o maximoaccess nos links abaixo, ajude a melhorar este que é o seu site na NET.

    Pay-Pal R$ Aqui
    Pay-Pal € Aqui

    Ou ainda: Aqui (Novo)

    Sucesso e Bons Estudos
    Success and Good Studies

    [Resolvido]Ainda o problema das contas com horas Folder_announce_new Utilize o Sistema de Busca do Fórum...
    [Resolvido]Ainda o problema das contas com horas Folder_announce_new 102 Códigos VBA Gratuitos...
    [Resolvido]Ainda o problema das contas com horas Folder_announce_new Instruções SQL como utilizar...
    avatar
    jess
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 77
    Registrado : 17/09/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  jess 3/10/2010, 20:09

    Obrigado aos 2 mestres pela ajuda. Só agora pude dar uma espreitadela ao fórum mas não estou em condições de testar agora. Quando tiver feedback voltarei ao contacto.

    Cumprimentos

    jess
    JPaulo
    JPaulo
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 11026
    Registrado : 04/11/2009

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  JPaulo 3/10/2010, 20:36

    O que lhe passei acima é o simples, mas se o seu problema persistir utilize este código;

    Public Function DuracaoEntreDataHora(strDataInicio As Date, strDataFim As Date, _
    Optional strTotalDias As Boolean = False) As String
    'Retorna a duração de tempo entre duas data / hora
    'No formato hh: nn: ss
    'Ultrapassa a barreira das 24 horas

    Dim strHora As Date
    Dim strDias As Long
    Dim strTDias As String
    Dim strTHoras As String
    ' subtrai um dia à data de inicio se for maior que a de fim
    If strDataFim < strDataInicio Then
    If Int(strDataInicio) + Int(strDataFim) = 0 Then
    strDataInicio = strDataInicio - 1
    End If
    End If
    ' extrai a duração das datas em tempo
    strHora = strDataFim - strDataInicio
    ' encontra os dias
    strDias = Int(strHora)
    strTDias = CStr(strDias)
    ' encontra as horas
    strTHoras = Format(strHora, "hh")
    If strTotalDias Then
    DuracaoEntreDataHora = strDias & ":" & strTHoras & Format(strHora, ":nn:ss")
    Else
    DuracaoEntreDataHora = Format((Val(strTDias) * 24) + Val(strTHoras), "00") & _
    Format(strHora, ":nn:ss")
    End If
    End Function


    Num campo vazio da sua consulta para teste;

    Resultado: DuracaoEntreDataHora([DataHoraInicio];[DataHoraFim])



    .................................................................................
    Contribua com o maximoaccess nos links abaixo, ajude a melhorar este que é o seu site na NET.

    Pay-Pal R$ Aqui
    Pay-Pal € Aqui

    Ou ainda: Aqui (Novo)

    Sucesso e Bons Estudos
    Success and Good Studies

    [Resolvido]Ainda o problema das contas com horas Folder_announce_new Utilize o Sistema de Busca do Fórum...
    [Resolvido]Ainda o problema das contas com horas Folder_announce_new 102 Códigos VBA Gratuitos...
    [Resolvido]Ainda o problema das contas com horas Folder_announce_new Instruções SQL como utilizar...
    avatar
    jess
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 77
    Registrado : 17/09/2010

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  jess 4/10/2010, 17:44

    Boa noite JPaulo

    A primeira solução que apresentou funciona na perfeição. Pergunto entretanto se dá para colocar a data hora do sistema no lugar de DataHoraFim?
    Quanto ao código que apresentou como alternativa dá-me sempre errodefunção com nº errado de argumentos.
    Já tentei dar a volta à questão mas deve-me estar a escapar algo.

    Cumprimentos

    jess
    JPaulo
    JPaulo
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 11026
    Registrado : 04/11/2009

    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  JPaulo 4/10/2010, 18:45

    Na sua primeira pergunta dá sim:

    Resultado: DifData("h";[DataHoraInicio];Now()) & ":" & Format((DifData("n";[DataHoraInicio];Now()) Mod 60);"00")


    Na segunda;

    Vou efectuar testes amanhã e depois retorno, mas eu tenho essa função a funfar desde 2006 e não apresenta qual problema.


    .................................................................................
    Contribua com o maximoaccess nos links abaixo, ajude a melhorar este que é o seu site na NET.

    Pay-Pal R$ Aqui
    Pay-Pal € Aqui

    Ou ainda: Aqui (Novo)

    Sucesso e Bons Estudos
    Success and Good Studies

    [Resolvido]Ainda o problema das contas com horas Folder_announce_new Utilize o Sistema de Busca do Fórum...
    [Resolvido]Ainda o problema das contas com horas Folder_announce_new 102 Códigos VBA Gratuitos...
    [Resolvido]Ainda o problema das contas com horas Folder_announce_new Instruções SQL como utilizar...

    Conteúdo patrocinado


    [Resolvido]Ainda o problema das contas com horas Empty Re: [Resolvido]Ainda o problema das contas com horas

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 23/11/2024, 14:24