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


+2
Alexandre Neves
andre lindolfo
6 participantes

    [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    avatar
    andre lindolfo
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 139
    Registrado : 17/04/2012

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  andre lindolfo 6/5/2012, 19:30

    Olá amigos,

    Recentemente o nosso amigo Alexandre me ajudou num caso.
    Queria calcular os dias úteis entre duas data, excluindo os finais de seman e os feriados nacionais e estaduais.
    Agora o que estou precisando e que, com uma data eu informo a qtd de dias uteis e o access me retorna com uma data futura (excluindo finais de semana e feriados nacionais e estaduais).
    Posto abaixo o código do Alexandre, pois acredito que ajudará muita gente.
    Acredito também que com isso fique mais fácil resolver este meu problema atual (data futura).

    Segue o código do mestre Alexandre.

    Option Compare Database
    Option Explicit

    ' 'criada por Alexandre Neves
    ' 'www.esnips.com\web\AlexandreNeves

    Enum NomeEstado
    PAC = 1
    PAL = 2
    PAP = 3
    PAM = 4
    PBA = 5
    PCE = 6
    PDF = 7
    PES = 8
    PGO = 9
    PMA = 10
    Pmt = 11
    PMS = 12
    PMG = 13
    PPA = 14
    PPB = 15
    PPR = 16
    PPE = 17
    PPI = 18
    PRJ = 19
    PRN = 20
    PRS = 21
    PRO = 22
    PRR = 23
    PSC = 24
    PSP = 25
    PSE = 26
    PTO = 27
    End Enum

    Function DiasUteisBrasileiros(DataInicial As Date, DataFinal As Date, Optional Estado As NomeEstado) As Integer
    Dim DataAtual As Date
    DiasUteisBrasileiros = 0
    For DataAtual = DataInicial To DataFinal
    If Not FeriadoBrasileiro(DataAtual, Estado) And Weekday(DataAtual) <> 1 And Weekday(DataAtual) <> 7 Then DiasUteisBrasileiros = DiasUteisBrasileiros + 1
    Next
    End Function

    Function PascoaB(intAno As Integer) As Date
    ' 'criada por Alexandre Neves
    ' 'www.esnips.com\web\AlexandreNeves
    Dim X As Byte, y As Byte
    Dim a As Byte, b As Byte, c As Byte, d As Byte, e As Byte

    If intAno > 1581 And intAno < 1600 Then X = 22: y = 2
    If intAno > 1599 And intAno < 1700 Then X = 22: y = 2
    If intAno > 1699 And intAno < 1800 Then X = 23: y = 3
    If intAno > 1799 And intAno < 1900 Then X = 23: y = 4
    If intAno > 1899 And intAno < 2000 Then X = 24: y = 5
    If intAno > 1999 And intAno < 2100 Then X = 24: y = 5
    If intAno > 2099 And intAno < 2200 Then X = 24: y = 6
    If intAno > 2199 And intAno < 2300 Then X = 25: y = 7

    a = intAno Mod 19
    b = intAno Mod 4
    c = intAno Mod 7
    d = ((20 * a) + X) Mod 30
    e = ((2 * b) + (4 * c) + (6 * d) + y) Mod 7
    If (d + e) < 10 Then
    PascoaB = DateSerial(intAno, 3, d + e + 22)
    Else
    PascoaB = DateSerial(intAno, 4, d + e - 9)
    End If
    If PascoaB = DateSerial(intAno, 4, 26) Then PascoaB = DateAdd("d", -7, PascoaB)
    If PascoaB = DateSerial(intAno, 4, 25) And d = 28 And a > 10 Then PascoaB = DateAdd("d", -7, PascoaB)
    End Function

    Function FeriadoBrasileiro(dtData As Date, Optional strNomeEstado As NomeEstado) As Boolean
    ' 'criada por Alexandre Neves
    ' 'www.esnips.com\web\AlexandreNeves
    FeriadoBrasileiro = False
    Select Case Format(dtData, "dd-mm")
    Case "01-01"
    FeriadoBrasileiro = True
    Case "21-04"
    FeriadoBrasileiro = True
    Case "01-05"
    FeriadoBrasileiro = True
    Case "07-09"
    FeriadoBrasileiro = True
    Case "12-10"
    FeriadoBrasileiro = True
    Case "02-11"
    FeriadoBrasileiro = True
    Case "15-11"
    FeriadoBrasileiro = True
    Case "25-12"
    FeriadoBrasileiro = True
    End Select

    If dtData = DateAdd("d", -47, PascoaB(Year(dtData))) Then FeriadoBrasileiro = True
    If dtData = DateAdd("d", -2, PascoaB(Year(dtData))) Then FeriadoBrasileiro = True
    If dtData = PascoaB(Year(dtData)) Then FeriadoBrasileiro = True
    If dtData = DateAdd("d", 49, PascoaB(Year(dtData))) Then FeriadoBrasileiro = True
    If dtData = DateAdd("d", 56, PascoaB(Year(dtData))) Then FeriadoBrasileiro = True
    If dtData = DateAdd("d", 60, PascoaB(Year(dtData))) Then FeriadoBrasileiro = True

    If Not IsMissing(strNomeEstado) Then
    Select Case strNomeEstado
    Case PAC
    If Format(dtData, "dd-mm") = "15-06" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "06-08" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "05-09" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "17-11" Then FeriadoBrasileiro = True
    Case PAL
    If Format(dtData, "dd-mm") = "24-06" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "29-06" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "16-09" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "20-11" Then FeriadoBrasileiro = True
    Case PAP
    If Format(dtData, "dd-mm") = "19-03" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "05-10" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "20-11" Then FeriadoBrasileiro = True
    Case PAM
    If Format(dtData, "dd-mm") = "05-09" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "20-11" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "08-12" Then FeriadoBrasileiro = True
    Case PBA
    If Format(dtData, "dd-mm") = "28-06" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "02-07" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "20-11" Then FeriadoBrasileiro = True
    Case PDF
    If Format(dtData, "dd-mm") = "21-04" Then FeriadoBrasileiro = True
    Case PES
    If Format(dtData, "dd-mm") = "23-05" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "28-10" Then FeriadoBrasileiro = True
    Case PGO
    If Format(dtData, "dd-mm") = "26-07" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "28-10" Then FeriadoBrasileiro = True
    Case PMA
    If Format(dtData, "dd-mm") = "28-07" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "28-12" Then FeriadoBrasileiro = True
    Case Pmt
    If Format(dtData, "dd-mm") = "20-11" Then FeriadoBrasileiro = True
    Case PMS
    If Format(dtData, "dd-mm") = "11-10" Then FeriadoBrasileiro = True
    Case PPA
    If Format(dtData, "dd-mm") = "15-08" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "08-12" Then FeriadoBrasileiro = True
    Case PPB
    If Format(dtData, "dd-mm") = "05-08" Then FeriadoBrasileiro = True
    Case PPR
    If Format(dtData, "dd-mm") = "08-09" Then FeriadoBrasileiro = True
    Case PPE
    If Format(dtData, "dd-mm") = "06-03" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "24-06" Then FeriadoBrasileiro = True
    Case PPI
    If Format(dtData, "dd-mm") = "13-03" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "19-10" Then FeriadoBrasileiro = True
    Case PRJ
    If Format(dtData, "dd-mm") = "21-01" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "23-04" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "18-10" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "28-10" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "20-11" Then FeriadoBrasileiro = True
    Case PRN
    If Format(dtData, "dd-mm") = "29-06" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "03-10" Then FeriadoBrasileiro = True
    Case PRS
    If Format(dtData, "dd-mm") = "20-09" Then FeriadoBrasileiro = True
    Case PRO
    If Format(dtData, "dd-mm") = "04-01" Then FeriadoBrasileiro = True
    Case PRR
    If Format(dtData, "dd-mm") = "05-10" Then FeriadoBrasileiro = True
    Case PSC
    If Format(dtData, "dd-mm") = "11-08" Then FeriadoBrasileiro = True
    Case PSP
    If Format(dtData, "dd-mm") = "09-07" Then FeriadoBrasileiro = True
    If Format(dtData, "dd-mm") = "20-11" Then FeriadoBrasileiro = True
    Case PSE
    If Format(dtData, "dd-mm") = "08-07" Then FeriadoBrasileiro = True
    Case PTO
    If Format(dtData, "dd-mm") = "05-10" Then FeriadoBrasileiro = True
    End Select
    End If
    End Function


    No meu caso teve uma adaptação pois não uso a abreviação do estado (duas letras) no meu caso tenho uma letra "P" na frente. Para resolver isso o Alexandre me passou este outro código. Ele converte a minha sigla para um número e este é que é usado na função acima.

    Function Estado(strEstado As String) As NomeEstado
    Select Case strEstado
    Case "PAC"
    Estado = 1
    Case "PAL"
    Estado = 2
    Case "PAP"
    Estado = 3
    Case "PAM"
    Estado = 4
    Case "PBA"
    Estado = 5
    Case "PCE"
    Estado = 6
    Case "PDF"
    Estado = 7
    Case "PES"
    Estado = 8
    Case "PGO"
    Estado = 9
    Case "PMA"
    Estado = 10
    Case "PMT"
    Estado = 11
    Case "PMS"
    Estado = 12
    Case "PMG"
    Estado = 13
    Case "PPA"
    Estado = 14
    Case "PPB"
    Estado = 15
    Case "PPR"
    Estado = 16
    Case "PPE"
    Estado = 17
    Case "PPI"
    Estado = 18
    Case "PRJ"
    Estado = 19
    Case "PRN"
    Estado = 20
    Case "PRS"
    Estado = 21
    Case "PRO"
    Estado = 22
    Case "PRR"
    Estado = 23
    Case "PSC"
    Estado = 24
    Case "PSP"
    Estado = 25
    Case "PSE"
    Estado = 26
    Case "PTO"
    Estado = 27
    End Select
    End Function


    Peço a ajudar dos feras de plantão.
    []s
    André Lindolfo
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 8498
    Registrado : 05/11/2009

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Alexandre Neves 6/5/2012, 20:02

    Novamente, André,

    Enquanto trabalhava, ia pensando que seria mais fácil do que julgava e escrevi o seguinte código:
    Function DataFutura(DataInicial As Date, DiasUteis As Integer, Optional Estado As NomeEstado) As Date
    'criada por Alexandre Neves
    'em 2012-05-01
    Dim Dias As Integer

    DataFutura = DataInicial
    For Dias = 1 To DiasUteis
    Incrementa:
    DataFutura = DateAdd("d", 1, DataFutura)
    If FeriadoBrasileiro(DataFutura, Estado) Or Weekday(DataFutura) = 1 Or Weekday(DataFutura) = 7 Then GoTo Incrementa
    Next
    End Function

    Não testei

    avatar
    andre lindolfo
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 139
    Registrado : 17/04/2012

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  andre lindolfo 6/5/2012, 20:54

    Ola Alexandre,

    Desculpe a minha ignorância...
    E só copiar e colar no módulo?
    Ele já irá procurar os feriados nacionais e depois os estaduais naquela outra função que vc escreveu? É isso?

    Coloquei na consulta e está me retornando com datas futuras.
    Apenas acrescentei o NZ para [dtInicial] que no meu caso é o campo [DtFornec].

    []s do norte para vc (Vila Real/Murça aldeia do Fiolhoso.)
    Vou analisar os dados e depois retorno.

    avatar
    andre lindolfo
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 139
    Registrado : 17/04/2012

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  andre lindolfo 8/5/2012, 16:05

    Alexandre,

    MAis um ponto..

    Está funcionando.

    Muito bom e obrigado
    avatar
    RANGEL.GAC
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 12
    Registrado : 30/07/2012

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Ajuda

    Mensagem  RANGEL.GAC 27/3/2013, 14:19

    Poderia passar o arquivo funcionando para que eu possa analisar? Obrigado
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 8498
    Registrado : 05/11/2009

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Alexandre Neves 27/3/2013, 18:23

    Boa tarde, Rangel, e bem-vindo ao fórum
    Não altere o título, principalmente quando o tema foi aberto por outro colega.


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo
    avatar
    RANGEL.GAC
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 12
    Registrado : 30/07/2012

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  RANGEL.GAC 28/3/2013, 12:53

    Desculpe, não sei como mudei, deve ser no título então????
    Aurino
    Aurino
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 10
    Registrado : 09/06/2014

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty VB - Incrementar Data sem Feriados Nacional sem Fins de Semanas e sem Data da Tabela de Recessos

    Mensagem  Aurino 10/6/2014, 15:04

    Srs. bom dia!

    Primeiro, sou novo por aqui e entendo bem pouco de VB.

    > Preciso calcular a DataFutura com base em uma DataInicial. A quantidade de dias a ser incrementando está no campo Duracao, na mesma tabela.

    < A data futura deve: >
    >> Excluir os Sábados e Domingos
    >> Excluir os Feriados Nacionais
    >> Excluir os Recessos Internos (vários durante o ano) definidos na Tabela FeriadosInternos, campo DataFeriado.

    Tentei adaptar dos exemplo que vocês postaram aqui, mas não tenho conhecimento suficiente e não consegui.
    Alguém pode adaptar o código para mim?

    Obrigado,

    PS.
    o ARQUIVO MDB está anexo, se alguém quiser verificar:
    DataInicial = Formulários![frm_etapas_ssl] coluna "Programado";
    Duracao = Formulários![frm_etapas_ssl] coluna "Dur.Prev.";
    Destino do Incremento = Formulários![frm_etapas_ssl] coluna "Realizado";
    Tabela FeriadosInternos = tb_feriados_eln


    ============================================================================================================
    Após algum tempo de trabalho consegui resolver a demanda. Segue Código completo, quem sabe alguém tem a mesma necessidade.
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    'Início do módulo # Crie um novo módulo ou cole no seu módulo

    Option Compare Database
    Public vrDiasAdic As Integer 'variável pública para a função IncrmDU
    Public vrManipData As Date 'variável pública para a função IncrmDU
    Public vrCarrFunc As Date 'variável pública para a função IncrmDU
    Public A%, B%, c%, d%, e%, f%, g%, h%, i%, j%, k%, l%, m%, p%, q% 'variável pública para a função DataCheck
    Public intAno As Integer, intConta As Integer 'variável pública para a função DataCheck
    Public Pascoa As Date, varData(14) As Date 'variável pública para a função DataCheck
    Public vrMsg As VbMsgBoxResult

    Public Function IncremDU(prmData As Variant) As Integer 'Inicia função. Contribuição: Gertrudes Filho - Mat. 7368
       Dim vrDB As DAO.Database 'Cria variável local
       Dim rs As DAO.Recordset 'Cria variável local
       Dim vrLoopCtrl As Integer 'Cria variável local
       If IsNull(prmData) Then 'Verifica se o campo que será manipulado está vazio
           MsgBox "O campo 'Recebimento da NF/Programado' não pode ficar vazio!" & vbCrLf & "Informe uma Data Válida ou Clique no Botão 'Cancelar'.", vbOKOnly + vbExclamation, "Erro de Preenchimento..." 'Mensagem alertando o usuário que o campo não pode ficar vazio - Adaptado apartir da publicação do usuário Criquio Calavera no forum http://maximoaccess.forumeiros.com/
           Exit Function 'Se o campo que será manipulado está vazio, encerra a função
       End If
       Set vrDB = CurrentDb() 'Carrega variável local
       prmData = DateValue(prmData) 'Certifica-se de que o parámetro prmData será carregado com a informação tipo data
       vrManipData = prmData 'Transfere o conteúdo do parâmetro prmData para a variável vrManipData, para manipulação
       vrLoopCtrl = 0 'Carrega a variável que controla o Loop
       Set rs = vrDB.OpenRecordset("select * from tb_feriados_eln") 'Carrega a variável com dados básicos para evitar erros
       If vrDiasAdic <> 0 Then
           Do While vrLoopCtrl <> vrDiasAdic 'Inicia o Loop quando a quantidade de dias a serem incrementados é diferente de zero
               Set rs = vrDB.OpenRecordset("select * from tb_feriados_eln where tb_frd_data = #" & Format([vrManipData], "mm-dd-yyyy") & "#") 'Vefica se a data informada coincide com alguma data na tabela de feriados da Eln
               If rs.EOF Then 'Se a data informada não for um feriado da Eln executa as ações abaixo
                   If ((Format(vrManipData, "ddd") <> "Dom") And (Format(vrManipData, "ddd") <> "Sáb")) Then 'Verifica se data informada é fim de semana
                       If DataCheck(vrManipData) = False Then 'Verifica se a data informada coincide com um feriado oficial, passando a data pela Função DataCheck
                           vrLoopCtrl = vrLoopCtrl + 1 'Se a data informada não for fim de semana, feriado oficial ou feriado interno o controle do Loop é incrementado
                       End If
                   End If
               End If
                   vrManipData = DateAdd("d", 1, vrManipData) 'Se a data informada não for fim de semana, feriado oficial ou feriado interno um dia útil é incrementado à data informada
           Loop
       Else
           Do While vrLoopCtrl <= vrDiasAdic 'Inicia o Loop quando a quantidade de dias a serem incrementados é igual a zero
               Set rs = vrDB.OpenRecordset("select * from tb_feriados_eln where tb_frd_data = #" & Format([vrManipData], "mm-dd-yyyy") & "#") 'Vefica se a data informada coincide com alguma data na tabela de feriados da Eln
               If rs.EOF Then 'Se a data informada não for um feriado da Eln executa as ações abaixo
                   If ((Format(vrManipData, "ddd") <> "Dom") And (Format(vrManipData, "ddd") <> "Sáb")) Then 'Verifica se data informada é fim de semana
                       If DataCheck(vrManipData) = False Then 'Verifica se a data informada coincide com um feriado oficial, passando a data pela Função DataCheck
                           vrLoopCtrl = vrLoopCtrl + 1 'Se a data informada não for fim de semana, feriado oficial ou feriado interno o controle do Loop é incrementado
                       End If
                   End If
               End If
                   vrManipData = DateAdd("d", 1, vrManipData) 'Se a data informada não for fim de semana, feriado oficial ou feriado interno um dia útil é incrementado à data informada
           Loop
       End If
    '    If vrDiasAdic = 0 Then vrManipData = DateAdd("d", 1, vrManipData) 'Verifica se a quantidade de dias a serem incrementados é igual a zero, se positivo incrementa um dia à data
       rs.Close 'Fecha Dbase
       Set rs = Nothing 'Limpa a variável
    End Function

    Public Function DataCheck(Data) As Boolean
       On Error GoTo Err_DataCheck
    '   Esta função tem como objetivo verificar se a data inserida
    '   é um feriado brasileiro, retornando True em caso positivo.
       If IsNull(Data) Then Exit Function
       DataCheck = False
       intAno = Year(CDate(Data))
    '   Calcula a data da Páscoa
       If intAno >= 1583 Then  ' Jean Baptiste Joseph Delambre (1749-1822)
           A = intAno Mod 19
           B = Fix(intAno / 100)
           c = intAno Mod 100
           d = Fix(B / 4)
           e = B Mod 4
           f = Fix((B + 8) / 25)
           g = Fix((B - f + 1) / 3)
           h = (19 * A + B - d - g + 15) Mod 30
           i = Fix(c / 4)
           k = c Mod 4
           l = (32 + 2 * e + 2 * i - h - k) Mod 7
           m = Fix((A + 11 * h + 22 * l) / 451)
           p = Fix((h + l - 7 * m + 114) / 31)
           q = (h + l - 7 * m + 114) Mod 31
           Pascoa = DateSerial(intAno, p, q + 1)
       Else  ' Calendário Juliano
           A = intAno Mod 4
           B = intAno Mod 7
           c = intAno Mod 19
           d = (19 * c + 15) Mod 30
           e = (2 * A + 4 * B - d + 34) Mod 7
           f = Fix((d + e + 114) / 31)
           g = (d + e + 114) Mod 31
           Pascoa = DateSerial(intAno, f, g + 1)
       End If
    '   Define feriados móveis
       varData(0) = Pascoa - 48   ' Segunda-feira de Carnaval
       varData(1) = Pascoa - 47   ' Terça-feira de Carnaval
       varData(2) = Pascoa - 2    ' Paixão de Cristo
       varData(3) = Pascoa        ' Páscoa
       varData(4) = Pascoa + 60   ' Corpus Christi
    '   Feriados Nacionais (lei 662/1949 - Texto atualizado - http://www.planalto.gov.br/ccivil_03/leis/L0662.htm)
       varData(5) = CDate("01/01/" & intAno)   ' Confraternização Universal
       varData(6) = CDate("21/04/" & intAno)   ' Tiradentes
       varData(7) = CDate("01/05/" & intAno)   ' Dia do trabalho
       varData(8) = CDate("07/09/" & intAno)   ' Independência
       varData(9) = CDate("12/10/" & intAno)   ' Padroeira do Brasil
       varData(10) = CDate("02/11/" & intAno)  ' Finados
       varData(11) = CDate("15/11/" & intAno)  ' Proclamação da República
       varData(12) = CDate("25/12/" & intAno)  ' Natal
    '   Feriados Distritais
       varData(13) = CDate("21/04/" & intAno)  ' Fundação de Brasília
       varData(14) = CDate("30/11/" & intAno)  ' Dia do Evangélico
    '   Insira aqui os feriados regionais e altere o tamanho da matriz
    '   Verifica data
       For intConta = 0 To UBound(varData)
           If CDate(Data) = varData(intConta) Then 'Veifica se a data informada coincide com um feriado oficial
               DataCheck = True 'Se a data informada coincidir com um feriado oficial a Função fica positiva
           End If
       Next
    Sai:
       Exit Function
    Err_DataCheck:
       MsgBox "Erro: " & Err.Number & " - " & Err.Description 'Instrui a Função a exibir uma mensagem ao usuário em caso de erro
       End Function

    'Fim do módulo


    ##Manipulando a data##

    Private Sub sub_btn_teste_data_Click()
    vrDiasAdic = campo_data_inicial
    campo_data_destino = IncremDU(campo_data_inicial)
    campo_data_destino = vrManipData - 1
    End Sub

    ##

    Abr@ço!
    Anexos
    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) AttachmentPrssGstContrato.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (537 Kb) Baixado 140 vez(es)


    Última edição por aurino.s.a em 12/6/2014, 15:56, editado 6 vez(es)
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3900
    Registrado : 04/04/2010

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Avelino Sampaio 10/6/2014, 15:30

    Olá! Seja benvindo!

    Veja se este meu artigo ajuda:

    http://www.usandoaccess.com.br/tutoriais/tuto62.asp?id=1#inicio

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Ricardo84
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 78
    Registrado : 18/01/2014

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Ricardo84 9/8/2014, 23:16

    Olá, é a primeira vez que peço aqui ajuda (através de tópicos) e desde já digo que já fiquei esclarecido com muitos dos exemplos aqui expostos.
    Não tenho qq tipo de formação em acess e decidi fazer uma base de dados no meu trabalho. Basicamente seria para guardar a informação dos meus colegas num só sitio.Com a ajuda de vários tópicos daqui e dias de pesquisa no youtube lá fui aprendendo como fazer algumas coisas. A base de dados está quase pronta, mas queria ver se consigo fazer esta situação funcionar. Contar os dias de férias das pessoas, descontando feriados e fins de semana.

    Será que posso pedir que me ajudem um bocado em relação a este tópico?

    Já estive a tentar perceber as duas funções aqui representadas e não consigo perceber como posso adaptar a minha base de dados. Não tenho campos Estado, mas queria calcular dois feriados municipais e 2 regionais. (feriados regionais da Região da Madeira, Portugal e Feriados municipais do Funchal, ilha da Madeira e Porto Santo, ilha de Porto Santo)

    Se houvesse uma BD de exemplo com o código do Alexandre Neves, utilizado pelo André, ajudaria de certeza. O outro código representado, nao sei se é bem o que quero e não consegui perceber o funcionamento da base de dados.

    Desde já agradeço a ajuda, que pelo que vi anteriormente, é sempre dada de boa vontade.
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 8498
    Registrado : 05/11/2009

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Alexandre Neves 10/8/2014, 07:58

    Bom dia, e bem-vindo ao fórum
    Fiz parte do código mas não guardo as bd's envolvidas nem me recordo da estrutura utilizada. Poderá algum colega disponibilizar.
    No entanto, e porque a sua bd tem estrutura própria, disponibilize-a para se tentar ajudar.


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo
    avatar
    Ricardo84
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 78
    Registrado : 18/01/2014

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Ricardo84 16/8/2014, 01:38

    Obrigado Alexandre Neves pela disponibilidade, mas entretanto encontrei um exemplo publicado pelo JPaulo que já consegui aplicar. É baseado numa tabela, o que acaba por tornar a gestão de feriados mais fácil. Tenho de introduzir uma data e para evitar de estar a atualizar a data dos feriados todos os anos criei uma Update Query que atualiza a data para o corrente ano. O que fiz foi criar uma consulta (ConsFeriadoAtualizaData) para formatar a data que introduzi na TabFeriados para dd-mm-Ano(Agora()), mas como a função não reconhecia esse campo (talvez por ser calculado), apesar de contar os dias, não descontava feriados, então criei uma consulta de atualização baseada na ConsFeriadoAtualizaData para atualizar o campo DataFeriado da TabFeriados.
    Até aqui, não tenho critérios para dizer se é feriado no Funchal ou em Porto Santo (apenas campos Sim/Não), mas depois disso já criei. No entanto, a Páscoa e a sexta feira Santa têm de ser atualizados manualmente, mas é mais fácil do que se o Governo Português se lembrar de cortar mais feriados e a pessoa que me vem render nas minhas funções não souber nada de Access.

    Não sei se esta é a maneira ideal, mas acho que se torna mais fácil de gerir. Como disse, não tenho formação em Access, tirando videoaulas no Youtube e ver exemplos nos foruns. Se bem que isto já é ter alguma formação Very Happy 

    Peço dscp pela demora a responder, mas não tem sido fácil vir cá.

    Obrigado pela disponibilidade.



    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 8498
    Registrado : 05/11/2009

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Alexandre Neves 17/8/2014, 22:56

    Boa noite,
    Sobre saber pouco de Access, o fórum foi criado para quem precisa, ou seja, quem pouco sabe é que dá mais razão do fórum existir.
    Ainda hão-de ouvir chamar-nos AccessManíacos!
    Fique com duas funções por mim criadas para automatizar a Páscoa e a Sexta-feira Santa

    Function Pascoa(intAno As Integer) As Date
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' código criado por Alexandre Neves, do Fórum MaximoAccess '
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim x As Byte, y As Byte
    Dim a As Byte, B As Byte, C As Byte, D As Byte, E As Byte

    If intAno > 1581 And intAno < 1600 Then x = 22: y = 2
    If intAno > 1599 And intAno < 1700 Then x = 22: y = 2
    If intAno > 1699 And intAno < 1800 Then x = 23: y = 3
    If intAno > 1799 And intAno < 1900 Then x = 23: y = 4
    If intAno > 1899 And intAno < 2000 Then x = 24: y = 5
    If intAno > 1999 And intAno < 2100 Then x = 24: y = 5
    If intAno > 2099 And intAno < 2200 Then x = 24: y = 6
    If intAno > 2199 And intAno < 2300 Then x = 25: y = 7

    a = intAno Mod 19
    B = intAno Mod 4
    C = intAno Mod 7
    D = ((19 * a) + x) Mod 30
    E = ((2 * B) + (4 * C) + (6 * D) + y) Mod 7
    If (D + E) < 10 Then
    Pascoa = DateSerial(intAno, 3, D + E + 22)
    Else
    Pascoa = DateSerial(intAno, 4, D + E - 9)
    End If
    If Pascoa = DateSerial(intAno, 4, 26) Then Pascoa = DateAdd("d", -7, Pascoa)
    If Pascoa = DateSerial(intAno, 4, 25) And D = 28 And a > 10 Then Pascoa = DateAdd("d", -7, Pascoa)
    End Function

    Function SextaFeiraSanta(ByVal intAno As Integer) As Date
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' código criado por Alexandre Neves, do Fórum MaximoAccess '
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    SextaFeiraSanta = DateAdd("d", -2, Pascoa(intAno))
    End Function


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo
    avatar
    Ricardo84
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 78
    Registrado : 18/01/2014

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Ricardo84 17/8/2014, 23:53

    Obrigado Alexandre, pela disponibilidade e pela função.

    Já agora, tentei enviar MP, mas pelos vistos não tenho conseguido, quando vou ver a mensagem está na caixa A Enviar e a caixa Enviadas está vazia. Isso te a ver com as permissões de usuário ou estou a fazer alguma coisa mal? É que tenho uma questão para colocar sobre uma função de um grupo de opções e tentei enviar uma msg ao JPaulo, mas pelos vistos não consegui e tb não tenho permissão para criar tópicos...
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 8498
    Registrado : 05/11/2009

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Alexandre Neves 18/8/2014, 08:22

    Bom dia,
    Sobre a abertura de dúvidas, não vejo razão para não o fazer. Vê o botão para criar "Novo Tópico"? Informe se não o encontrar.
    Quanto a mensagens privadas, já bloqueei e desbloqueei várias. Os bloqueios são justificados pelas mensagens privadas que me direccionam mas que, na verdade, se tratam de assuntos públicos. Eu gasto tempo a responder "Publique a dúvida para todos aprendam. Se todos resolverem por mensagens privadas, qual o conteúdo do fórum?"
    O fórum foi criado para ajuda aos necessitados mas a regra é que seja de acesso partilhado por todos.


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo
    avatar
    Ricardo84
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 78
    Registrado : 18/01/2014

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Ricardo84 18/8/2014, 22:30

    Já o via, mas nem quis experimentar, visto que no meu perfil dizia que não podia criar novos tópicos, fiquei com receio de violar alguma regra do forum. vou colocar a minha questão no tópico... Obrigado
    avatar
    Ricardo84
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 78
    Registrado : 18/01/2014

    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Ricardo84 19/8/2014, 00:33

    Já agora Alexandre, fica aqui a minha questão sobre a função do grupo de opções. Por acaso na minha BD funcionou bastante pior, devo ter feito alguma coisa mal... Mas dps vejo

    Conteúdo patrocinado


    dias uteis - [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais) Empty Re: [Resolvido]Calcular data futura com dias úteis (sem finais de semana e feriados nacionais e estaduais)

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 22/11/2024, 11:08