Série da semana: Primeiros passos no React

Veja mais

IDADE COM ANOS, MESES E DIAS.

14/01/2016

4

Recebi o seguinte código para calcular a idade, contudo quando informo a uma data do mês 06/2015 por exemplo e a data final 31/03/2016 ele me retorna a idade de 2 meses e os dias..

//Calcular Idade
Function CalculaIdade(DataIni, DataFim : TDateTime) : string;
var Idade : String;
Resto : Integer;
iDia, iMes, iAno, fDia, fMes, fAno : Word;
nDia, nMes, nAno, DiaBissexto : Double;
begin
DecodeDate(DataIni,iAno,iMes,iDia);
DecodeDate(DataFim,fAno,fMes,fDia);
nAno := iAno-fAno;

if nAno > 0 then

nAno := nAno - 1
else
if(fMes = iMes)and(fDia < iDia)then
nAno := nAno - 1;

if fMes < iMes then
begin
nMes := 12 - (iMes-fMes);
if fDia < iDia then nMes := nMes - 1;
end
else if fMes = iMes then
begin
nMes := 0;
if fDia < iDia then nMes := 11;
end
else if fMes > iMes then
begin
nMes := fMes - iMes;
if fDia < iDia then nMes := nMes - 1;
end;
nDia := 0;

if fDia > iDia then nDia := fDia - iDia;
if fDia < iDia then nDia := (DataFim-IncMonth(DataFim,-1))-(iDia-fDia);
Result := '';
if nAno = 1 then Result := FloatToStr(nAno)+ ' Ano '
else if nAno > 1 then Result := FloatToStr(nAno)+ ' Anos ';

if nMes = 1 then Result := Result + FloatToStr(nMes)+ ' Mês '
else if nMes > 1 then Result := Result + FloatToStr(nMes)+ ' Meses ';

if nDia = 1 then Result := Result + FloatToStr(nDia)+ ' Dia '
else if nDia > 1 then Result := Result + FloatToStr(nDia)+ ' Dias ';

end;



procedure Tfrm_cadastro.db_edit_nascimentoExit(Sender: TObject);
var I,F:tdate;
begin
f:=(StrToDate('31/03/2016'));
i:=(StrToDate(db_edit_nascimento.Text));
lbl_idade.Caption:= CalculaIdade(f,i);

end;
Responder

Post mais votado

15/01/2016

Reescrevi sua função, utilizando funções do próprio delphi, vê se te ajuda:

function CalculaIdade(DataIni, DataFim: TDateTime): string;
var
  qtdDias, qtdMeses, qtdAnos : Integer;
  strDias, strMeses, strAnos : string;

  dataAuxiliar: TDate;
begin
  qtdDias:= 0;
  qtdMeses := 0;
  qtdAnos := 0;

  qtdMeses := MonthsBetween(DataIni, IncDay(DataFim));

  if qtdMeses = 0 then
    qtdDias := DaysBetween(DataIni, DataFim)
  else
  begin
    dataAuxiliar := IncMonth(DataIni, qtdMeses);
    qtdDias := DaysBetween(dataAuxiliar,DataFim);
  end;

  if qtdMeses >= 12 then
  begin
    qtdAnos := Trunc(qtdMeses / 12);
    qtdMeses := qtdMeses - (qtdAnos * 12);
  end;

  if qtdMeses = 1 then
    strMeses := '1 mês'
  else if qtdMeses <> 0 then
    strMeses := Format('%d meses', [qtdMeses]);

  if qtdAnos = 1 then
    strAnos := '1 ano'
  else if qtdAnos <> 0 then
    strAnos := Format('%d anos', [qtdAnos]);

  if qtdDias = 1 then
    strDias := '1 dia'
  else if qtdDias <> 0 then
    strDias := Format('%d dias', [qtdDias]);

  if qtdAnos <> 0 then
    Result := strAnos;

  if qtdMeses <> 0 then
    Result := Result + ' ' + strMeses;

  if qtdDias <> 0 then
    Result := Result + ' ' + strDias;
end;
Responder

Mais Posts

14/01/2016

Raylan Zibel

Alguém tem essa função de calculo de idade retornando as semanas também?
Responder

14/01/2016

Wilter Porto

Amigo não sei que vc está curtindo, mas acontece que trabalho em uma Secretaria de Educação e as crianças de creche só podem ser matriculadas com base em sua idade com anos e meses. Preciso corrigir este código até domingo, pois começaremos o atendimento na segunda.
Responder

15/01/2016

Wilter Porto

Ainda está com erro.

Quando coloquei a data 25/06/2015 e deu a idade 9 meses 555 dias.

Outra coisa também preciso armazenar a Idade em anos no banco.

E tenho no edit da data de nascimento preciso limitar a data máxima permitida. coloquei o código

if dm_conexoes.tbl_cadastro.FieldByName('data_nascimento').AsDateTime > 15/07/2015
then
begin
ShowMessage('Data inválida. A data de nascimento não pode ser maior que 15/07/2015!');
db_edit_nascimento.Clear;
db_edit_nascimento.SetFocus;
exit;
end
else

Contudo todas as datas que coloco inclusive 10/05/2015 exibe a mensagem de data inválida.
Responder
Deve ter alguma coisa a mais errada ai, pq fiz o teste aqui e deu 6 meses e 21 dias certinho. Como vc esta chamando a função ?

No "if dm_conexoes.tbl_cadastro.FieldByName('data_nascimento').AsDateTime > 15/07/2015 then" tenta colocar :
"if dm_conexoes.tbl_cadastro.FieldByName('data_nascimento').AsDateTime > StrToDate('15/07/2015') then"
Responder

15/01/2016

Wilter Porto

procedure Tfrm_cadastro.db_edit_nascimentoExit(Sender: TObject);
var DataI,DataF : TDate;

begin
DataF:=(StrToDate('31/03/2016'));
DataI:=(StrToDate(db_edit_nascimento.Text));
lbl_idade.Caption:= CalculaIdade(DataF,DataI);
end;
Responder
A função é CalculaIdade(DataIni, DataFim) primeiro vem a data inicial e depois a data final, você esta colocando invertido ai, troca para :
lbl_idade.Caption:= CalculaIdade(DataI,DataF);
Responder

15/01/2016

Wilter Porto

Deu certo e agora como faço para pegar o valor de anos e armazenar no banco.
Responder

16/01/2016

Wilter Porto

Preciso armazenar o anos da criança no banco de dados, como faço para obter este valor?
Responder