Fórum Calcular idade da pessoa... #422689
28/08/2012
0
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
Curtir tópico
+ 0Posts
28/08/2012
William
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
28/08/2012
Carlos Magno
Como eu usaria essa função?...
Gostei + 0
28/08/2012
William
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; |
Gostei + 0
28/08/2012
Carlos Magno
Gostei + 0
28/08/2012
William
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.
Gostei + 0
28/08/2012
Marco Salles
Gostei + 0
28/08/2012
William
Gostei + 0
28/08/2012
Carlos Magno
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
28/08/2012
William
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); |
Gostei + 0
28/08/2012
Carlos Magno
Gostei + 0
28/08/2012
Carlos Magno
Gostei + 0
28/08/2012
William
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; |
Gostei + 0
28/08/2012
Marco Salles
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
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
Gostei + 0
28/08/2012
William
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
29/08/2012
Carlos Magno
Então vamos colocar esse tópico como resolvido
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)