 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Nov 28, 2017 7:40 am Assunto: [resolvido] Function Feriados, Problemas em 2018 |
|
|
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 |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9100 Localização: Sinop-MT
|
Enviada: Ter Nov 28, 2017 7:56 am Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Nov 28, 2017 8:19 am Assunto: |
|
|
é, 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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Nov 28, 2017 9:23 am Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Nov 28, 2017 9:31 am Assunto: |
|
|
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 |
|
 |
natanbh1 Colaborador

Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Nov 28, 2017 9:54 am Assunto: |
|
|
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 |
|
 |
renanbg Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012 Mensagens: 1158
|
Enviada: Ter Nov 28, 2017 10:17 am Assunto: |
|
|
Na verdade eu uso um TCalendar, mas a sua dica funcionou.
Obrigado. |
|
| Voltar ao Topo |
|
 |
danieldgm3 Novato

Registrado: Terça-Feira, 24 de Julho de 2018 Mensagens: 4
|
Enviada: Sáb Out 20, 2018 12:18 pm Assunto: função calendário |
|
|
| 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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|