Calcular intervalo de datas em dias e exibir num label.
Galera do Fórum, estou de volta ! Ainda não obtive sucesso na minha implementação.
Vou explicar direito, com detalhes, talvez alguma alma caridosa possa me ajudar...
É o seguinte:
Tenho um FORM onde eu tenho que capturar a DataNasc de um Edit (EdtDatanasc). Quando eu pressionar o botao, eu comparo a data recebida com a data que tenho armazenada numa tabela. Se a data recebida for igual a data da tabela, blz !, exibo os demais campos nos labels. Agora, se data recebida for maior q a data da tabela, preciso calcular o intervalo em dias entre uma data e outra e exibir num dos meus labels. O restante dos labels ficam com as informações da linha comparativa.
Acontece que está dando um erro ferrado quando tento fazer isso. Às vezes é erro de mismatch, invalid date e outros q não lembro.
Estou fazendo isso aqui:
declaro no inicio do form:
datamenor, datamaior : TDate;
dias: Double;
Depois no botao:
modulo.query.Close;
modulo.query.ParamByName(´data´).AsString:= EdtDataNasc.Text;
modulo.query.Open;
datamaior := strtodate(EdtDataNasc.Text);
datamenor := strtodate(modulo.query.Fields[0].AsString); //Este campo e a data da minha tabela, que esta definida como alpha
If (datamaior > datamenor) then begin
dias := trunc(datamaior - datamenor);
Label1.Caption := floattostr(dias); //está certa esta conversão ???
Label2.Caption := modulo.query.Fields[2].AsString;
Label3.Caption := modulo.query.Fields[3].AsString;
Label4.Caption := modulo.query.Fields[4].AsString + ´ / ´
+ modulo.query.Fields[5].AsString;
Label5.Caption := modulo.query.Fields[6].AsString;
end else begin
Label1.Caption := modulo.query.Fields[1].AsString;
Label2.Caption := modulo.query.Fields[2].AsString;
Label3.Caption := modulo.query.Fields[3].AsString;
Label4.Caption := modulo.query.Fields[4].AsString + ´ / ´
+ modulo.query.Fields[5].AsString;
Label5.Caption := modulo.query.Fields[6].AsString;
end;
Já tentei mudar a var dias para integer, não funcionou.
Não sei se a conversao de double para string está correta.
Quando tiro do if, deixo só a atribuição quando a data é igual, fica tudo certo. O problema está no trunc.
ALGUEM PODE ME AJUDAR ??? :cry: :cry: :cry:
Valeu !!!
Ana Davis
Vou explicar direito, com detalhes, talvez alguma alma caridosa possa me ajudar...
É o seguinte:
Tenho um FORM onde eu tenho que capturar a DataNasc de um Edit (EdtDatanasc). Quando eu pressionar o botao, eu comparo a data recebida com a data que tenho armazenada numa tabela. Se a data recebida for igual a data da tabela, blz !, exibo os demais campos nos labels. Agora, se data recebida for maior q a data da tabela, preciso calcular o intervalo em dias entre uma data e outra e exibir num dos meus labels. O restante dos labels ficam com as informações da linha comparativa.
Acontece que está dando um erro ferrado quando tento fazer isso. Às vezes é erro de mismatch, invalid date e outros q não lembro.
Estou fazendo isso aqui:
declaro no inicio do form:
datamenor, datamaior : TDate;
dias: Double;
Depois no botao:
modulo.query.Close;
modulo.query.ParamByName(´data´).AsString:= EdtDataNasc.Text;
modulo.query.Open;
datamaior := strtodate(EdtDataNasc.Text);
datamenor := strtodate(modulo.query.Fields[0].AsString); //Este campo e a data da minha tabela, que esta definida como alpha
If (datamaior > datamenor) then begin
dias := trunc(datamaior - datamenor);
Label1.Caption := floattostr(dias); //está certa esta conversão ???
Label2.Caption := modulo.query.Fields[2].AsString;
Label3.Caption := modulo.query.Fields[3].AsString;
Label4.Caption := modulo.query.Fields[4].AsString + ´ / ´
+ modulo.query.Fields[5].AsString;
Label5.Caption := modulo.query.Fields[6].AsString;
end else begin
Label1.Caption := modulo.query.Fields[1].AsString;
Label2.Caption := modulo.query.Fields[2].AsString;
Label3.Caption := modulo.query.Fields[3].AsString;
Label4.Caption := modulo.query.Fields[4].AsString + ´ / ´
+ modulo.query.Fields[5].AsString;
Label5.Caption := modulo.query.Fields[6].AsString;
end;
Já tentei mudar a var dias para integer, não funcionou.
Não sei se a conversao de double para string está correta.
Quando tiro do if, deixo só a atribuição quando a data é igual, fica tudo certo. O problema está no trunc.
ALGUEM PODE ME AJUDAR ??? :cry: :cry: :cry:
Valeu !!!
Ana Davis
Ana Davis
Curtidas 0
Respostas
Edilcimar
02/11/2003
datanascimento := strtodate(edit1.text) utilize um try para validar a data
hoje := date();
dias := hoje - datanascimento
label1.caption := inttostr(dias);
hoje := date();
dias := hoje - datanascimento
label1.caption := inttostr(dias);
GOSTEI 0
Ana Davis
02/11/2003
Ok Edilcimar !
Mas nesse exemplo q vc fez está se considerando a data completa ? dd/mm/aaaa ?
Eu preciso só retornar o intervalo em dias.
P.ex.:
entrada: 04/06/1952
na tabela: 24/05/1952
valor a exibir: intervalo em dias entre 25/05/1952 e 04/06/1952 = 12 dias
Mas nesse exemplo q vc fez está se considerando a data completa ? dd/mm/aaaa ?
Eu preciso só retornar o intervalo em dias.
P.ex.:
entrada: 04/06/1952
na tabela: 24/05/1952
valor a exibir: intervalo em dias entre 25/05/1952 e 04/06/1952 = 12 dias
GOSTEI 0
Edilcimar
02/11/2003
veja a função DATETOSTR
GOSTEI 0
Ana Davis
02/11/2003
Gente, ainda não consegui resolver esse problema. Alguém se habilita ?
GOSTEI 0
Ltres
02/11/2003
Como ja havia dito em uma pergunta anterior. Use a função DaysBetween(datamaior, datamenor);!
Declare na Uses da unit :arrow: DateUtils
Depois coloque a função
Label1.Caption := IntToStr(DaysBetween(datamaior, datamenor));
Pronto.. Espero q seja isso :D
Declare na Uses da unit :arrow: DateUtils
Depois coloque a função
Label1.Caption := IntToStr(DaysBetween(datamaior, datamenor));
Pronto.. Espero q seja isso :D
GOSTEI 0
Bacalhau
02/11/2003
Ó estimada Ana, eu agora não posso experimentar mas as variaveis do tipo TDate e TDateTime, permitem os operadores soma e subtracção. Se eu tiver isto
var i : integer;
posso fazer isto
i := strtodate(´03/11/2003´) - strtodate(´02/11/2003´);
que vai dar 1.
Parece-me que a solução é mudar o double para integer e retirar o trunc
var i : integer;
posso fazer isto
i := strtodate(´03/11/2003´) - strtodate(´02/11/2003´);
que vai dar 1.
Parece-me que a solução é mudar o double para integer e retirar o trunc
GOSTEI 0