Calcular idade da pessoa...
Bom dia....já pesquisei em vários tópicos deste fórum e de vários outros para encontrar uma forma de solucionar meu problema mas nenhum deu resultado satisfatório. Então vamos ver se alguém me ajuda.
Tenho dois campos na tabela:
DATANASC é do tipo data;
IDADE é do tipo numérico;
E dois campos no form:
Edit2 para inserir a data de nascimento (está com máscara);
Edit3 para receber a idade após o cálculo da mesma;
O problema está em como calcular isso.
Tenho dois campos na tabela:
DATANASC é do tipo data;
IDADE é do tipo numérico;
E dois campos no form:
Edit2 para inserir a data de nascimento (está com máscara);
Edit3 para receber a idade após o cálculo da mesma;
O problema está em como calcular isso.
Carlos Magno
Curtidas 0
Respostas
William
28/08/2012
Colega tem uma função muito legal no delphi, "DecodeDate" essa função tem a finalidade de separar dia, mês e ano em variáveis separadas, vc tem q passar 3 parâmetros:
1 - data
3 variáveis que vão receber dia, mês e ano.
Vc isola o ano de nascimento e uma variável e o ano atual em outra variável, depois subtrai um ano pelo outro e compara com a idade.
Claro tem q analisar se a questão de resíduos de meses podem dar uma diferença!!
1 - data
3 variáveis que vão receber dia, mês e ano.
Vc isola o ano de nascimento e uma variável e o ano atual em outra variável, depois subtrai um ano pelo outro e compara com a idade.
Claro tem q analisar se a questão de resíduos de meses podem dar uma diferença!!
GOSTEI 0
Carlos Magno
28/08/2012
Bem.....como é para um programinha para gerar receituário oftalmológico, os meses não são importantes. O importante é a idade para se ter uma referência para o tipo de lente a prescrever.
Como eu usaria essa função?...
Como eu usaria essa função?...
GOSTEI 0
William
28/08/2012
Cara estou sem delphi, foi o q deu para montar:
Function VerificaData(dataNasc: Tdate): integer;
var
anoN, mes, dia : word;
anoA, mesA, diaA : word;
begin
Decodedate( (dataNasc,anoN,mes,dia );
Decodedate( dataAtual,anoA,mesA,diaA );
//Subtrai Ano atual por Ano de nascimento e retorna a diferença.
result := anoA - anoN;
end;
GOSTEI 0
Carlos Magno
28/08/2012
Beleza.....como dispararia essa função ao sair do Edit2 para ir ao Edit3 e o resultado aparecesse no Edit3?
GOSTEI 0
William
28/08/2012
Olha cara vc pode disparar no evento OnExit do Edit2, mas antes verifica se existe valor no Edit2:
Só tem um problema, essa função recebe um parâmetro do tipo TDate e o Edit2 está em texto.
if Edit2.text <> '' then
begin
VerificaData(Parâmetro);
end;
Só tem um problema, essa função recebe um parâmetro do tipo TDate e o Edit2 está em texto.
GOSTEI 0
Marco Salles
28/08/2012
mas wllfl a função nativa dateutils.YearsBetween ja faz esta conta
GOSTEI 0
William
28/08/2012
Muito bem lembrando Marco, realmente não lembrei dessa Unit DateUtils, essa função YearsBetween() facilita muito a vida de quem precisa calcular diferença entre anos.
GOSTEI 0
Carlos Magno
28/08/2012
Duas perguntas, William:
1 - Tem aspas em algum ponto?....porque aqui está dando erro () expected but, found);
2 - Desculpe o jeguinho aqui....mas qual o parametro?
1 - Tem aspas em algum ponto?....porque aqui está dando erro () expected but, found);
2 - Desculpe o jeguinho aqui....mas qual o parametro?
GOSTEI 0
William
28/08/2012
Carlos está sobrando um parênteses na minha função, corrigi:
Esse parâmetro seria da data de nascimento que vc quer calcular, mas tem q ser do tipo TDate.
Acho melhor usar a função que o Marco indicou, YearsBetween() ela recebe 2 parâmetros e retorna a diferença entre as datas:
1 - Data Atual
2 - Data de nascimento
Function VerificaData(dataNasc: Tdate): integer; var anoN, mes, dia : word; anoA, mesA, diaA : word; begin Decodedate(dataNasc,anoN,mes,dia); Decodedate(dataAtual,anoA,mesA,diaA); //Subtrai Ano atual por Ano de nascimento e retorna a diferença. result := anoA - anoN; end;
Esse parâmetro seria da data de nascimento que vc quer calcular, mas tem q ser do tipo TDate.
Acho melhor usar a função que o Marco indicou, YearsBetween() ela recebe 2 parâmetros e retorna a diferença entre as datas:
1 - Data Atual
2 - Data de nascimento
var idade: integer; idade := YearsBetween(Date, Data_Nascimento);
GOSTEI 0
Carlos Magno
28/08/2012
Vou tentar aqui.
GOSTEI 0
Carlos Magno
28/08/2012
William...to tendo problemas para montar o código. Tá dando erro de incompatibilidade.
GOSTEI 0
William
28/08/2012
Deve ser problema na conversão do conteúdo do Edit2 para Date, tenta assim:
try
dataN := StrToDate(Edit2.text);
Edit3.text := IntTotStr(YearsBetween(Date, dataN));
except
on e: EConvertError do
ShowMessage('Não foi possível efetuar a conversão: ' +
e.Message);
end;
GOSTEI 0
Marco Salles
28/08/2012
engraçado will que a mairia das funçoes que envolve operações com data da unidade DateUtils trabalha com média
Isto sempre causou um desconforto pois a diferença de anos entre 01/01/2012 a 31/12/2012 pela nossa lógica é de zero
anos , porém pelo helphi do delphi traduzido pelo google diz o seguinte
Perceba que admite dois valores .. O Zero ´para ano Não Bissexto e UM para ano Bissexto
sou conhecidor desta lógica do Delphi e o que muitos ja mencionaram como BUG , por não ter conhecimento do Helphi
que te alerta sobre essas variaçoes na função
Porém se vc utilizar esta função , com o parãmetro Date , a parte fracionaria sera zero e a média entre as datas
ficara dentro da nossa lógica
Deixo so levantado esta questão , por que ja vi casos de erro de programa de deficil depuração por não conhecimento
do Helphi do Delphi
[]sds
Isto sempre causou um desconforto pois a diferença de anos entre 01/01/2012 a 31/12/2012 pela nossa lógica é de zero
anos , porém pelo helphi do delphi traduzido pelo google diz o seguinte
Retorna o número aproximado de anos entre dois valores TDateTime especificados.
Chame YearsBetween para obter a diferença, em anos, entre dois valores TDateTime. Porque anos não são todas do mesmo tamanho (por exemplo, anos bissextos), YearsBetween retorna uma aproximação baseada em uma suposição de 365,25 dias por ano. Fracionários anos não são contados. Assim, por exemplo, YearsBetween reporta a diferença entre 1 de Janeiro e 31 de Dezembro de 0 em anos não-bissextos e 1 em anos bissextos.
YearsBetween retorna sempre um resultado positivo e, portanto, os valores dos parâmetros são intercambiáveis.
Chame YearsBetween para obter a diferença, em anos, entre dois valores TDateTime. Porque anos não são todas do mesmo tamanho (por exemplo, anos bissextos), YearsBetween retorna uma aproximação baseada em uma suposição de 365,25 dias por ano. Fracionários anos não são contados. Assim, por exemplo, YearsBetween reporta a diferença entre 1 de Janeiro e 31 de Dezembro de 0 em anos não-bissextos e 1 em anos bissextos.
YearsBetween retorna sempre um resultado positivo e, portanto, os valores dos parâmetros são intercambiáveis.
Perceba que admite dois valores .. O Zero ´para ano Não Bissexto e UM para ano Bissexto
sou conhecidor desta lógica do Delphi e o que muitos ja mencionaram como BUG , por não ter conhecimento do Helphi
que te alerta sobre essas variaçoes na função
var
dataini,datafim:Tdatetime;
begin
dataini:=strtodatetime('01/01/2011');
datafim:=strtodatetime('31/12/2011 23:59:59');
Showmessage(inttostr(dateutils.YearsBetween(dataini,datafim))); // Retorna Um como devido
dataini:=strtodatetime('01/01/2012');
datafim:=strtodatetime('31/12/2012 23:59:59'); // retorna UM *** DEvido a Média por 2012 é Bissexto
Showmessage(inttostr(dateutils.YearsBetween(dataini,datafim)));Porém se vc utilizar esta função , com o parãmetro Date , a parte fracionaria sera zero e a média entre as datas
ficara dentro da nossa lógica
var
dataini,datafim:Tdate; //parâmetro TDate
begin
dataini:=strtodatetime('01/01/2011');
datafim:=strtodatetime('31/12/2011');
Showmessage(inttostr(dateutils.YearsBetween(dataini,datafim))); //retorna zero
dataini:=strtodatetime('01/01/2012');
datafim:=strtodatetime('31/12/2012');
Showmessage(inttostr(dateutils.YearsBetween(dataini,datafim))); // retorna zero
end;Deixo so levantado esta questão , por que ja vi casos de erro de programa de deficil depuração por não conhecimento
do Helphi do Delphi
[]sds
GOSTEI 0
William
28/08/2012
Realmente vc está certo mais uma vez Marco, acompanhei seu raciocínio e me causa um certo espanto tamanha discrepância no uso do 2 tipos de parâmetros(TDate e TDateTime)!
No primeiro post dessa dúvida mencionei um provável problema que podeira ocorrer com resíduos de meses, mas confesso que não foi sabendo dessa diferença q vc citou acima e simplesmente por raciocínio lógico.
Mas sua observação é válida e serve como aprendizado ....
No primeiro post dessa dúvida mencionei um provável problema que podeira ocorrer com resíduos de meses, mas confesso que não foi sabendo dessa diferença q vc citou acima e simplesmente por raciocínio lógico.
Mas sua observação é válida e serve como aprendizado ....
GOSTEI 0
Carlos Magno
28/08/2012
william...resolvi meu problema de outra forma. Transformei o campo de data de nascimento em um campo alfa numérico apenas para inserir o dia e o mês. Criei um outro campo numérico para receber o ano e com uma formula um terceiro campo me retorna o resultado da formula.
Então vamos colocar esse tópico como resolvido
Então vamos colocar esse tópico como resolvido
GOSTEI 0