Fórum Calcular idade da pessoa... #422689

28/08/2012

0

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

Responder

Posts

28/08/2012

William

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!!
Responder

Gostei + 0

28/08/2012

Carlos Magno

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?...
Responder

Gostei + 0

28/08/2012

William

Cara estou sem delphi, foi o q deu para montar:

1
2
3
4
5
6
7
8
9
10
11
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;
Responder

Gostei + 0

28/08/2012

Carlos Magno

Beleza.....como dispararia essa função ao sair do Edit2 para ir ao Edit3 e o resultado aparecesse no Edit3?
Responder

Gostei + 0

28/08/2012

William

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

1
2
3
4
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.
Responder

Gostei + 0

28/08/2012

Marco Salles

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

Responder

Gostei + 0

28/08/2012

William

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.
Responder

Gostei + 0

28/08/2012

Carlos Magno

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?
Responder

Gostei + 0

28/08/2012

William

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

1
2
3
4
5
6
7
8
9
10
11
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

1
2
var idade: integer;
idade := YearsBetween(Date, Data_Nascimento);
Responder

Gostei + 0

28/08/2012

Carlos Magno

Vou tentar aqui.
Responder

Gostei + 0

28/08/2012

Carlos Magno

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

Gostei + 0

28/08/2012

William

Deve ser problema na conversão do conteúdo do Edit2 para Date, tenta assim:

1
2
3
4
5
6
7
8
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;


Responder

Gostei + 0

28/08/2012

Marco Salles

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


1
2
3
4
5
6
7
8
9
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


1
2
3
4
5
6
7
8
9
10
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
Responder

Gostei + 0

28/08/2012

William

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 ....
Responder

Gostei + 0

29/08/2012

Carlos Magno

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar