Calcular idade da pessoa...

Delphi

28/08/2012

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.
Carlos Magno

Carlos Magno

Curtidas 0

Respostas

William

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!!
GOSTEI 0
Carlos Magno

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?...
GOSTEI 0
William

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

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

William

28/08/2012

Olha cara vc pode disparar no evento OnExit do Edit2, mas antes verifica se existe valor no Edit2:

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

Marco Salles

28/08/2012

mas wllfl a função nativa dateutils.YearsBetween ja faz esta conta

GOSTEI 0
William

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

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?
GOSTEI 0
William

William

28/08/2012

Carlos está sobrando um parênteses na minha função, corrigi:

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

Carlos Magno

28/08/2012

Vou tentar aqui.
GOSTEI 0
Carlos Magno

Carlos Magno

28/08/2012

William...to tendo problemas para montar o código. Tá dando erro de incompatibilidade.
GOSTEI 0
William

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

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

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.


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

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 ....
GOSTEI 0
Carlos Magno

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
GOSTEI 0
POSTAR