ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Feriados

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Seg Out 01, 2018 4:50 pm    Assunto: Feriados Responder com Citação

Amigos, estou com a seguinte situação.

Uso uma função que achei aqui no forum para impedir que sejam feitos cadastros nos feriados e finais de semana.

Nesta função já estão definidos todos os feriados fixos e moveis.

Funciona super bem, porém o cliente gostaria de abrir a agenda em alguns feriados

Ex: No dia 15/11 gostaria de trabalhar para folgar no dia 16/11. Isso foge da função e não gostaria de fazer via banco, pois seriam muitas consultas diarias.

Alguma sugestão?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Out 02, 2018 8:20 pm    Assunto: Responder com Citação

Boa noite,

Não sei se vou conseguir ajudar mas onde são armazenados os feriados utilizados nessa função que você citou?


Editado pela última vez por imex em Sáb Set 30, 2023 5:43 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qua Out 03, 2018 10:11 am    Assunto: Responder com Citação

bom dia imex.

Os feriados (fixos, móveis e finais de semana), estão todos dentro da function.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Out 03, 2018 11:24 am    Assunto: Responder com Citação

Bom dia,

Os feriados estão fixos dentro do código da função? O usuário não tem consegue preencher os feriados?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Qui Out 04, 2018 7:50 am    Assunto: Responder com Citação

Isso, tudo está fixo.

Fiz assim para não ter que fazer uma consulta no banco a cada vez que um agendamento for realizado, pois isso implicaria em centenas de consultas diarias.

Tem alguma sugestão de personalização?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Out 04, 2018 5:22 pm    Assunto: Responder com Citação

Se puder, poste como está sua função para analisarmos.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Sex Out 05, 2018 9:00 am    Assunto: Responder com Citação

Bom dia natanbh1.

Segue função

Código:
function Feriado(Data: TDate): String;
var
  dia, mes, ano: Word;
begin
  Result := EmptyStr;

  dia := DayOf(Data);
  mes := MonthOf(Data);

  // Feriados Fixos
  if ((dia = 1) and (mes = 1)) then
    Result := 'Ano Novo'
  else if ((dia = 21) and (mes = 4)) then
    Result := 'Tiradentes'
  else if ((dia = 1) and (mes = 5)) then
    Result := 'Dia do Trabalho'
  else if ((dia = 7) and (mes = 9)) then
    Result := 'Independência do Brasil'
  else if ((dia = 12) and (mes = 10)) then
    Result := 'Nossa Sra. Aparecida'
  else if ((dia = 2) and (mes = 11)) then
    Result := 'Finados'
  else if ((dia = 15) and (mes = 11)) then
    Result := 'Proclamação da República'
  else if ((dia = 25) and (mes = 12)) then
    Result := 'Natal';

  ano := YearOf(Data);

  if Result = EmptyStr then
    if DayOfWeek(Data) = 1 then
      Result := 'Domingo'
    else if DayOfWeek(Data) = 7 then
      Result := 'Sábado';
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Out 05, 2018 9:50 am    Assunto: Responder com Citação

Bom dia,

Essa função não tinha os feriados móveis?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Out 05, 2018 10:30 am    Assunto: Re: Feriados Responder com Citação

renanbg escreveu:
Ex: No dia 15/11 gostaria de trabalhar para folgar no dia 16/11. Isso foge da função e não gostaria de fazer via banco, pois seriam muitas consultas diarias.

Alguma sugestão?


Não sei se é a melhor maneira, mas imaginei alterar a função para adicionar mais 2 parâmetros:

    - Array de Datas para incluir exceções de "Feriados".
    - Array de Datas para remover exceções de "Feriados".

Adaptando sua função:

    1º parâmetro: Continua sendo a data a ser testada.
    2º parâmetro: Array de Datas que serão incluídas na lista de "Feriados"
    3º parâmetro: Array de Datas que serão removidas da lista de "Feriados"

Código:
function Feriado(Data: TDate; IncluiExcecoes, RemoveExcecoes: array of TDate): String;
var
  dia, mes: Word;
  i: Integer;
begin
  Result := EmptyStr;

  dia := DayOf(Data);
  mes := MonthOf(Data);

  // Feriados Fixos
  if ((dia = 1) and (mes = 1)) then
    Result := 'Ano Novo'
  else if ((dia = 21) and (mes = 4)) then
    Result := 'Tiradentes'
  else if ((dia = 1) and (mes = 5)) then
    Result := 'Dia do Trabalho'
  else if ((dia = 7) and (mes = 9)) then
    Result := 'Independência do Brasil'
  else if ((dia = 12) and (mes = 10)) then
    Result := 'Nossa Sra. Aparecida'
  else if ((dia = 2) and (mes = 11)) then
    Result := 'Finados'
  else if ((dia = 15) and (mes = 11)) then
    Result := 'Proclamação da República'
  else if ((dia = 25) and (mes = 12)) then
    Result := 'Natal';

  if Result = EmptyStr then
    if DayOfWeek(Data) = 1 then
      Result := 'Domingo'
    else if DayOfWeek(Data) = 7 then
      Result := 'Sábado';

  for i := Low(IncluiExcecoes) to High(IncluiExcecoes) do
    if (dia = DayOf(IncluiExcecoes[i])) and (mes = MonthOf(IncluiExcecoes[i])) then
      Result := 'Feriado';

  for i := Low(RemoveExcecoes) to High(RemoveExcecoes) do
    if (dia = DayOf(RemoveExcecoes[i])) and (mes = MonthOf(RemoveExcecoes[i])) then
      Result := EmptyStr;
end;

Exemplo de uso:

Código:
  // Removendo feriado do dia "15/11" e ao mesmo tempo testando se é feriado (logicamente, não será)
  ShowMessage(Feriado(StrToDate('15/11/18'), [], [StrToDate('15/11/18')]));

  // Incluindo feriado do dia "16/11" e ao mesmo tempo testando se é feriado (logicamente, será)
  ShowMessage(Feriado(StrToDate('16/11/18'), [StrToDate('16/11/18')], []));


Creio que pode ser melhorada a função, mas segue sugestão.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Sex Out 05, 2018 11:33 am    Assunto: Responder com Citação

NO caso eu teria que compilar uma nova versão do sistema cada vez que o usuario quiser fazer alguma modificação?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Out 05, 2018 11:48 am    Assunto: Responder com Citação

Não. Neste caso, antes de testar a data o usuário informaria quais são as datas que serão consideradas como feriado ou não fora estas datas fixas.

Neste exemplo que postei, o usuário estaria considerando/informando o dia 15/11 como "Não Feriado" e 16/11 como "Feriado".

renanbg escreveu:
Ex: No dia 15/11 gostaria de trabalhar para folgar no dia 16/11.

Código:
 // Removendo feriado do dia "15/11" e ao mesmo tempo testando se é feriado (logicamente, não será)
  ShowMessage(Feriado(StrToDate('15/11/18'), [], [StrToDate('15/11/18')]));

  // Incluindo feriado do dia "16/11" e ao mesmo tempo testando se é feriado (logicamente, será)
  ShowMessage(Feriado(StrToDate('16/11/18'), [StrToDate('16/11/18')], []));

 //  Aqui estamos  fazendo os 2 procedimentos acima, em uma única linha
ShowMessage(Feriado(StrToDate('16/11/18'), [StrToDate('16/11/18')], [StrToDate('15/11/18')]));

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Sex Out 05, 2018 1:05 pm    Assunto: Responder com Citação

Tá, então eu devo criar uma tabela para inserir essas datas?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Sáb Out 06, 2018 1:27 pm    Assunto: Responder com Citação

Amigo, uma tabela é o mais correto, visto que deve ter sim, uma forma de o usuário cadastrar, pois são muitos feriados e eles variam de município para município, então não dá para colocar no código, pois isto engessa sua aplicação, pois terá de recompilar para um cliente específico.

Além do mais, o custo da busca é pequeno, pois a tabela em si não tem nada mais do que alguns bytes e isto não pesará de forma alguma a aplicação, mesmo que esta esteja em rede.



bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Seg Out 08, 2018 4:46 pm    Assunto: Responder com Citação

Certo, irei avaliar isso.

Uma pergunta: Como fazer no caso dos feriados móveis?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Out 10, 2018 11:35 pm    Assunto: Responder com Citação

Estes são calculados através de cálculos, eis uma forma:

https://www.devmedia.com.br/funcao-para-calcular-feriados-moveis/21886



bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB