Usei num programa e vinha funcionando normalmente.
Porém, ao chegar no dia 29/3/2005 e calcular a diferença entre está data e por exemplo 30/03/2005( e também 31/3/2005) a função fornece -1 como diferença entre número de dias entre as datas.
Percebi que existe algo falhando quando fazemos diferença entre está data 29 e datas perto delas 30 e 31.
Outro exemplo de erro,seria 29/05/2005 e 31/05/2005, neste caso o programa está apresentando 1 dia de diferença.
Outro exemplo seria 29/10/2005 e 31/05/2005, que apresenta 1 dia como diferença.
Existem outros.
Estou usando no clique de um panel da seguinte forma:
procedure TfrmDiferenca.PanelCalcularClick(Sender: TObject);
Var
DataFinal: TDate;
DataInicial: TDate;
Anos1,Meses1,Dias1: Integer;
begin
Try
If txtDataInicial.Text = '' Then
begin
MessageBox(handle,'É necessário ter a data inicial validada !','FALTA A DATA INICIAL',MB_IconExclamation);
txtDataInicial.SetFocus;
abort;
end;
If txtDataFinal.Text = '' Then
begin
MessageBox(handle,'É necessário ter a data final validada !','FALTA A DATA FINAL',MB_IconExclamation);
txtDataFinal.SetFocus;
abort;
end;
DataFinal:= StrToDate(txtDataFinal.Text);
DataInicial:= StrToDate(txtDataInicial.Text);
EntreDatas( DataFinal,DataInicial,Anos1,Meses1,Dias1);
txtAnos1.Text := IntToStr(anos1);
txtMeses1.Text := IntToStr(meses1);
txtDias1.Text := IntToStr(dias1);
Except
If txtDataInicial.Text = '' Then
//Não faz nada.
Else If txtDataFinal.Text = '' Then
//Não faz nada.
Else
Messagebox(handle,'Um erro inesperado ocorreu.'+#13+ 'Por favor, contate o desenvolvedor do programa informando o erro.','ERRO',MB_IconStop);
end;
end;
Pergunta
Paulo Nobre
Prezado Colaboradores
peguei uma Procedure(função) dentro desses programas de dicas , que achei muito interessante para
calcular o número de anos meses e dias entre duas datas.
//A função:
---------------------------------------------------------------
Procedure EntreDatas(DataFinal,DataInicial : TDate ; var Anos,Meses,Dias : Integer) ;
//
// Retorna a diferença em Dias,Meses e Anos entre 2 datas
//
Function Calcula(Periodo : Integer) : Integer ;
var
intCont : Integer ;
begin
intCont := 0 ;
Repeat
Inc(intCont) ;
DataFinal := IncMonth(DataFinal,Periodo * -1) ;
Until DataFinal < DataInicial ;
DataFinal := IncMonth(DataFinal,Periodo) ;
Inc(intCont,-1) ;
Result := intCont ;
End ;
begin
if DataFinal <= DataInicial then
begin
Anos := 0 ;
Meses := 0 ;
Dias := 0 ;
exit ;
end;
Anos := Calcula(12) ;
Meses := Calcula(1) ;
Dias := Round(DataFinal - DataInicial) ;
end;
----------------------------------------------------------------
Usei num programa e vinha funcionando normalmente.
Porém, ao chegar no dia 29/3/2005 e calcular a diferença entre está data e por exemplo 30/03/2005( e também 31/3/2005) a função fornece -1 como diferença entre número de dias entre as datas.
Percebi que existe algo falhando quando fazemos diferença entre está data 29 e datas perto delas 30 e 31.
Outro exemplo de erro,seria 29/05/2005 e 31/05/2005, neste caso o programa está apresentando 1 dia de diferença.
Outro exemplo seria 29/10/2005 e 31/05/2005, que apresenta 1 dia como diferença.
Existem outros.
Estou usando no clique de um panel da seguinte forma:
---------------------------------------------------------------
---------------------------------------------------------------
Alguém que tenha conhecimanto de funções com datas poderia dizer
se há algum erro com a função?
Será que a minha chamada a ela está errada?
Alguém têm uma outra função que eu poderia usar na minha procedure?
Agradeço desde já a atenção.
A função foi feita, segundo o programa por
Fábio Macedo Garcia
Analista Programador - Delphi
fabio@copaninfo.com.br
Mandei um email para ele mas, não obtive resposta até agora.
Link para o comentário
Compartilhar em outros sites
22 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.