MaximoAccess

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

Obrigado

Administração do MaximoAccess

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

    [Resolvido]Consulta retorna dia negativo

    Compartilhe

    RodriguesChqao
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Anónimo
    Mensagens : 104
    Registrado : 31/05/2016

    [Resolvido]Consulta retorna dia negativo

    Mensagem  RodriguesChqao em Seg Mar 27, 2017 4:55 pm

    Bom dia!

    Depois de inserir alguns dados no meu BD notei o seguinte erro com a consulta para calcular a diferença de datas.
    O estranho é que está acontecendo somente com alguns registros.

    Segue o problema:

    Dt_Validade = 2606/2017
    Dia de Hoje = 27/03/2017

    Fórmula para cálculo:
    Dias Restantes: DifData("yyyy";Agora();[Dt_Validade]) & " Ano(s)," & DifData("d";Mês(Agora());Mês([Dt_Validade])) & " Meses, " & DifData("d";Dia(Agora());Dia([Dt_Validade])) & " Dia(s)"

    O resultado deveria ser 0 ano(s), 3 meses e 1 Dia(s) e não 0 ano(s), 3 meses e -1 Dia(s)

    Gostaria de obter ajuda para solucionar o erro.

    obrigado
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 5580
    Registrado : 15/03/2013

    Re: [Resolvido]Consulta retorna dia negativo

    Mensagem  ahteixeira em Seg Mar 27, 2017 6:40 pm

    Olá Rodrigues,
    O simples era calcular apenas o nº de dias para expirar.
    No caso que apresentou deveria apresentar 2 meses e 30 dias.

    Encontrei código abaixo na net que resolve o pretendido:
    Código:
    Private Sub Test167419023674()
        Debug.Print Join(MyDateDiff(#2/2/2010#, #1/1/2013#))
    End Sub

    Private Function MyDateDiff(d1 As Date, d2 As Date) As Variant
    '  Origem: https://access-programmers.co.uk/forums/showthread.php?t=250591
    '   returns the difference between two dates in an array where
    '   array element (0) = year, (1) = month and (2) = day
        Dim dy As Long
        Dim dm As Long
        Dim dd As Long
        Dim tmp As Date
        
        If d1 > d2 Then     'if first date is greater
            tmp = d1        'the swap them
            d1 = d2
            d2 = tmp
        End If
        
        dy = DateDiff("yyyy", d1, d2)   'calc years
        tmp = DateAdd("yyyy", dy, d1)   'get remainder
        dm = DateDiff("m", tmp, d2)     'calc months
        tmp = DateAdd("m", dm, tmp)     'get remainder
        dd = DateDiff("d", tmp, d2)     'calc days
        
        If dm < 0 Then                  'if month value is negative
            dy = dy - 1                 'calc one less year
            dm = 12 + dm                'and get remaining months
        End If
        
        If dd < 0 Then                  'if day value is negative
            dm = dm - 1                 'calc one less month
            dd = DaysLastMonth(d2) + dd 'and get remaining days
        End If
        
        MyDateDiff = Array(dy, dm, dd)
        
    End Function

    Private Function DaysLastMonth(d1 As Date) As Integer
    '   returns the number of days in the month prior to d1
        Dim FirstOfThisMonth As Date
        
        FirstOfThisMonth = DateSerial(Year(d1), Month(d1), 1) 'find the first
        DaysLastMonth = Day(FirstOfThisMonth - 1)             'find the day before
    End Function
    Abraço

    RodriguesChqao
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Anónimo
    Mensagens : 104
    Registrado : 31/05/2016

    Re: [Resolvido]Consulta retorna dia negativo

    Mensagem  RodriguesChqao em Seg Mar 27, 2017 7:23 pm

    Desde já agradeço mas não entendo quase nada de VBA e estou tentando aprender na medida das necessidades, então:

    Devo inserir o código em um módulo?

    Como chamar o módulo na consulta?

    Obrigado!

    RodriguesChqao
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Anónimo
    Mensagens : 104
    Registrado : 31/05/2016

    Re: [Resolvido]Consulta retorna dia negativo

    Mensagem  RodriguesChqao em Seg Mar 27, 2017 7:35 pm

    O problema é a consulta tempo.

    A linha de nome completo Rodrigues e zzz estão com o cálculo certo, mas a linha de nome zzz está errada

    Segue o bd, anexo.

    Obrigado
    Anexos
    Credencial_11_.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (249 Kb) Baixado 5 vez(es)
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 5580
    Registrado : 15/03/2013

    Re: [Resolvido]Consulta retorna dia negativo

    Mensagem  ahteixeira em Qua Mar 29, 2017 10:43 am

    Olá Rodrigues, é isto que pretende:
    [Você precisa estar registrado e conectado para ver esta imagem.]

    Para isso altere a consulta no modo de estrutura SQL e colo código abaixo:
    Código:
    SELECT Tbl_Credencial.PG, Tbl_Credencial.ARMA, Tbl_Credencial.[Nome Completo], Tbl_Credencial.Dt_Exp, Tbl_Credencial.Dt_Validade, IIf(Date()>=([Dt_Validade]),0,DateDiff("d",Now(),[Dt_Validade])) AS [Dias Restantes], IIf(Date()>=([Dt_Validade]),0,AnoMesDia(Date(),[Dt_Validade])) AS [Tempo Restante], IIf(Date()>=([Dt_Validade]),"Credencial Vencida","Credencial em vigor") AS Situação
    FROM Tbl_Credencial
    ORDER BY Tbl_Credencial.Dt_Validade;

    Utilizei o módulo que estava na sua base de dados de exemplo.

    Abraço

    RodriguesChqao
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Anónimo
    Mensagens : 104
    Registrado : 31/05/2016

    Re: [Resolvido]Consulta retorna dia negativo

    Mensagem  RodriguesChqao em Qua Mar 29, 2017 12:49 pm

    Boa tarde!

    Resolve perfeitamente. Já testei na minha consulta e ficou perfeito.

    Se não for pedir demais vc poderia explicar a instrução sql na parte dos IIf e Date

    obrigado.
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 5580
    Registrado : 15/03/2013

    Re: [Resolvido]Consulta retorna dia negativo

    Mensagem  ahteixeira em Qui Mar 30, 2017 11:43 am

    Olá Rodrigo,
    A instrução IIf(Date()>=([Dt_Validade]),0,...) é para mostrar 0, nos que já estão vencidos.
    Apenas para isso.
    Não testei, mas se retirar essa parte deve mostrar o tempo decorrido a negativo.
    Abraço

    RodriguesChqao
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Anónimo
    Mensagens : 104
    Registrado : 31/05/2016

    Re: [Resolvido]Consulta retorna dia negativo

    Mensagem  RodriguesChqao em Qui Mar 30, 2017 12:34 pm

    obrigado!
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 5580
    Registrado : 15/03/2013

    Re: [Resolvido]Consulta retorna dia negativo

    Mensagem  ahteixeira em Qui Mar 30, 2017 1:07 pm

    cheers

      Data/hora atual: Qua Nov 14, 2018 7:05 am