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 

[resolvido] Function Feriados, Problemas em 2018

 
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: Ter Nov 28, 2017 7:40 am    Assunto: [resolvido] Function Feriados, Problemas em 2018 Responder com Citação

Amigos, estou usando essa função para feridos.

Código:
function Feriado(Data: TDate): String;
var
  dia, mes, ano: Word;
  pascoa, carnaval, paixao, corpus: TDate;
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);

  // feriados móveis
  pascoa   := BuscaPascoa(ano);
  carnaval := IncDay(pascoa, -47);
  paixao   := IncDay(pascoa, -2);
  corpus   := IncDay(pascoa, 60);

  if Data = pascoa then
    Result := 'Páscoa'
  else if Data = carnaval then
    Result := 'Carnaval'
  else if Data = paixao then
    Result := 'Paixão de Cristo'
  else if Data = corpus then
    Result := 'Corpus Christi';

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


Verifico assim:

Código:
  // verifica se é feriado ou final de semana
  if Feriado(Calendario.Date) <> EmptyStr then
  begin
    Mensagem := Feriado(Calendario.Date)+ ' não possui agenda disponível!';
    Application.MessageBox(PCHAR(Mensagem), 'Fisio Soft RM', MB_ICONWARNING + MB_OK);
    Exit;
  end;


Se tento agendar algo para 2018, não importa o dia, da esse erro:

0/4/2018 is not a valid date and time


Editado pela última vez por renanbg em Ter Nov 28, 2017 10:19 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Ter Nov 28, 2017 7:56 am    Assunto: Responder com Citação

debuga a funcao feriados e BuscaPascoa, provavelmente ela deve ta com problema

coloca showmessage nelas pra ver qual data nao esta correta, mas acho q deve ser problema na buscapascoa
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
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: Ter Nov 28, 2017 8:19 am    Assunto: Responder com Citação

é, está na BuscaPascoa, que é a função abaixo.

Você conhece alguma outra que funcione? OU saberia se tem como ajustar essa?

Código:
function BuscaPascoa(Ano: Word): TDate;
var
 n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12: Integer;
 mes, dia: Word;
begin
  n1  := ano mod 19;
  n2  := trunc(ano/100);
  n3  := ano mod 100;
  n4  := trunc(n2/4);
  n5  := n2 mod 4;
  n6  := trunc((n2+8)/25);
  n7  := trunc((n2-n6+1)/3);
  n8  := (19*n1+n2-n4-n7+15) mod 30;
  n9  := trunc(n3/4);
  n10 := n3 mod 4;
  n11 := (32+2*n5+2*n9-n8-n10) mod 7;
  n12 := trunc((n1+11*n8+22*n11)/451);

  mes := trunc((n8+n11-7*n12+114)/31);
  dia := (n8+n11-7*n12+114) mod 31;

  Result := IncDay(StrToDateTime(IntToStr(dia) + '/' + IntToStr(mes) + '/' + IntToStr(ano)),1);
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: Ter Nov 28, 2017 9:23 am    Assunto: Responder com Citação

Faça um teste trocando sua função buscaPascoa por esta:

Código:
function BuscaPascoa(Ano: Word): TDate;
var
  R1, R2, R3, R4, R5: LongInt;
  FPascoa: TDateTime;
  VJ, VM, VD: Word;
begin
  R1 := Ano mod 19;
  R2 := Ano mod 4;
  R3 := Ano mod 7;
  R4 := (19 * R1 + 24) mod 30;
  R5 := (6 * R4 + 4 * R3 + 2 * R2 + 5) mod 7;
  FPascoa := EncodeDate(Ano, 3, 22);
  FPascoa := FPascoa + R4 + R5;
  DecodeDate(FPascoa, VJ, VM, VD);
  case VD of
    26:
      FPascoa := EncodeDate(Ano, 4, 19);
    25:
      if R1 > 10 then
        FPascoa := EncodeDate(Ano, 4, 18);
  end;
  Result := FPascoa;
end;

_________________
''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: Ter Nov 28, 2017 9:31 am    Assunto: Responder com Citação

Bom dia.

Agora não da erro, mas não calcula os feriados moveis.

Ex: sexta-feira santa em 2018 é no dia 30/03 e o sistema não alerta

Debugando essa parte da function, quando chega na linha paixao, obtenho a data 30/03/2018 e paixao 30/03/2018, mas o cursor pula para a proxima linha ao inves de cair no result.

Citação:
if Data = pascoa then
Result := 'Páscoa'
else if Data = carnaval then
Result := 'Carnaval'
else if Data = paixao then
Result := 'Paixão de Cristo'
else if Data = corpus then
Result := 'Corpus Christi';
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: Ter Nov 28, 2017 9:54 am    Assunto: Responder com Citação

Acho que você está usando um DateTimePicker para verificação.

Neste caso, a data que vem do DateTimePicker nunca bate com a data a ser comparada, acho que por causa da hora.

Para contornar isso, eu faça uma dupla conversão de Data para String e String para Data (gambiarra rsrs).

Teste:

Código:
  // verifica se é feriado ou final de semana
  if Feriado(StrToDate(DateToStr(Calendario.Date))) <> EmptyStr then
  begin
    mensagem := Feriado(Calendario.Date) + ' não possui agenda disponível!';
    Application.MessageBox(PCHAR(mensagem), 'Fisio Soft RM', MB_ICONWARNING + MB_OK);
    Exit;
  end;

_________________
''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: Ter Nov 28, 2017 10:17 am    Assunto: Responder com Citação

Na verdade eu uso um TCalendar, mas a sua dica funcionou.

Obrigado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
danieldgm3
Novato
Novato


Registrado: Terça-Feira, 24 de Julho de 2018
Mensagens: 4

MensagemEnviada: Sáb Out 20, 2018 12:18 pm    Assunto: função calendário Responder com Citação

Também queria agradecer a dica. estava com o mesmo problema na área de seleção de atividades na área de calendários do meu site. O usuário selecionava uma data no site de calendário de 2019, próxima de um feriado, por exemplo, e ele não conseguia preencher a atividade programada. agora funciona. quem quiser ver, https://calendario2019brasil.com.br/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
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