É a Idade...

Delphi

24/12/2006

Encontrei no fórum, uma série de dicas que servem para calcular a idade de uma pessoa, porém, todos tratando do assunto como Table... e no meu caso, estou utilizando Query.
Tenho no meu formulário o campo Nascimento e em seguida o campo Idade e o que quero fazer em meu sistema é na saída do Nascimento ele calcular somente a idade em anos.
Fiz algumas experiências com divisão por 365, mas em alguns casos não dá certo em virtude da existência de anos bissextos.

Conto com a ajuda de vocês amiguinhos.
Já agradeço desde agora.

Bjs a todos do Fórum, Feliz Natal e um Próspero ano novo.


Anjinho Loiro

Anjinho Loiro

Curtidas 0

Respostas

Tnaires

Tnaires

24/12/2006

Olá
Desculpe, não entendi muito bem... Quando você diz que quer usar Query, significa fazer o cálculo através de uma consulta SQL?
Caso positivo, no Paradox você pode fazer assim:
SELECT 2006 - EXTRACT(YEAR FROM CampoData)
FROM SuaTabela

Só não sei como pegar a data atual no Paradox...
Abraços


GOSTEI 0
Nerdex

Nerdex

24/12/2006

Achei isso:

Idade
// Programador - Paulo Alexsandro Freitas de Miranda <- The Programmer ->
// dprogrammer@ieg.com.br
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Mask;
 
type
  TForm1 = class(TForm)
  meNasc: TMaskEdit;
  Label1: TLabel;
  SpeedButton1: TSpeedButton;
  edIdade: TEdit;
  Label2: TLabel;
  BitBtn1: TBitBtn;
  Label3: TLabel;
  edDias: TEdit;
  function Bissexto(AYear: Integer): Boolean;
  function DiasDoMes(AYear, AMonth: Integer): Integer;
  function Idade2(DataNasc : TDate) : String;
  function Dias(Data : TDate) : String;
  function Idade(Nasc : TDate) : String;
  procedure SpeedButton1Click(Sender: TObject);
  procedure meNascKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  private
  { Private declarations }
  public
  { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
function TForm1.Bissexto(AYear: Integer): Boolean;
begin
  Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or (AYear mod 400 = 0));
end;
 
function TForm1.DiasDoMes(AYear, AMonth: Integer): Integer;
const
  DaysInMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
  Result := DaysInMonth[AMonth];
  if (AMonth = 2) and Bissexto(AYear) then Inc(Result);
end;
 
 
function TForm1.Idade2(DataNasc : TDate) : String;
Var Ano1, Mes1, Dia1 : Word;
  Ano2, Mes2, Dia2 : Word;
  Ano, Mes, Dia : Word;
  Idade : String;
  AuxDia1, AuxDia2 : Integer;
begin
  Idade := ´´;
  DecodeDate(DataNasc, Ano1, Mes1, Dia1);
  DecodeDate(Date, Ano2, Mes2, Dia2);
  AuxDia1 := Dia1;
  AuxDia2 := Dia2;
  if (Dia1 > Dia2) And ((Mes2 - Mes1) = 1) then begin
  Dia2 := Dia2 + DiasDoMes(Ano1, Mes1);
  Mes1 := Mes2;
  end else if (Dia1 > Dia2) And (Mes1 <> Mes2) then begin
  Dia2 := Dia2 + DiasDoMes(Ano1, Mes1);
  end else if (Mes1 = Mes2) And (Dia1 > Dia2) And (Ano1 <> Ano2) then begin
  Dia2 := Dia2 + DiasDoMes(Ano1, Mes1);
  Mes2 := Mes2 + 11;
  Ano1 := Ano1 + 1;
  end;
 
  if (Mes1 > Mes2) And (AuxDia1 <= AuxDia2) then begin
  Ano1 := Ano1 + 1;
  Mes2 := Mes2 + 12;
  end else if (Mes1 > Mes2) And (AuxDia1 > AuxDia2) then begin
  Ano1 := Ano1 + 1;
  Mes2 := Mes2 + 11;
  end;
 
  Ano := Ano2 - Ano1;
  Mes := Mes2 - Mes1;
  Dia := Dia2 - Dia1;
  if Ano > 1 then
  Idade := IntToStr(Ano) + ´ Anos´
  else if Ano = 1 then
  Idade := IntToStr(Ano) + ´ Ano´;
 
  if Mes > 1 then
  Idade := Idade + ´, ´ + IntToStr(Mes) + ´ Meses ´
  else if Mes <> 0 then
  Idade := Idade + ´, ´ + IntToStr(Mes) + ´ Mês ´;
 
  If Ano = 0 then
  Delete(Idade, 1, 1);
 
  if Dia > 1 then
  Idade := Idade + ´ e ´ + IntToStr(Dia) + ´ Dias´
  else if Dia <> 0 then
  Idade := Idade + ´ e ´ + IntToStr(Dia) + ´ Dia´;
 
  if (Mes = 0) And (Ano = 0) then
  Delete(Idade, 1, 3);
 
  if (Ano1 = Ano2) And (Mes1 = Mes2) And (Dia1 > Dia2) then
  Idade := ´0´;
 
  Result := Idade;
end;
 
 
function TForm1.Dias(Data : TDate) : String;
begin
  Result := FloatToStr(Date - Data);
end;
 
function TForm1.Idade(Nasc : TDate) : String;
Var AuxIdade, Meses, IdadeReal : String;
  MesesFloat : Real;
  IdadeInc : Integer;
begin
  AuxIdade := Format(´¬0.2f´, [(Date - Nasc) / 365.6]);
  Meses := FloatToStr(Frac(StrToFloat(AuxIdade)));
 
  if AuxIdade = ´0´ then begin
  Result := ´0,0´;
  Exit;
  end;
 
  if Meses[1] = ´-´ then
  Meses := FloatToStr(StrToFloat(Meses) * -1);
 
  Delete(Meses, 1, 2);
 
  if Length(Meses) = 1 then
  Meses := Meses + ´0´;
 
  if (Meses <> ´0´) And (Meses <> ´´) then
  MesesFloat := Round(((365.6 * StrToInt(Meses)) / 100) / 30)
  else
  MesesFloat := 0;
 
  if MesesFloat <> 12 then
  IdadeReal := IntToStr(Trunc(StrToFloat(AuxIdade))) + ´,´ + FloatToStr(MesesFloat)
  else begin
  IdadeInc := Trunc(StrToFloat(AuxIdade));
  Inc(IdadeInc);
  IdadeReal := IntToStr(IdadeInc) + ´,´ + ´0´;
  end;
 
  Result := IdadeReal;
end;
 
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  edDias.Text := Dias(StrToDate(meNasc.Text));
  edIdade.Text := Idade2(StrToDate(meNasc.Text));
end;
 
procedure TForm1.meNascKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 13 then begin
  SpeedButton1.Click;
  Key := 0;
  end;
end;
 
end.


Flw


GOSTEI 0
Brasidata

Brasidata

24/12/2006

Coloque esta função na sua Unit:

{Função para calcular a idade atual a partir da data do nascimento}
{by Marco Dell´Isola}

function CalculaIdade(DATA: TDateTime): Integer;
VAR COMPLETO : Integer;
begin
  result := 0;
  COMPLETO := StrToInt(FormatDateTime(´yyyy´,DATE)) - StrToInt(FormatDateTime(´yyyy´,DATA));
  if FormatDateTime(´mm´,DATE) > FormatDateTime(´mm´,DATA) then
    result := COMPLETO;
  if (FormatDateTime(´mm´,DATE) < FormatDateTime(´mm´,DATA)) then
    result := COMPLETO - 1;
  if FormatDateTime(´mm´,DATE) = FormatDateTime(´mm´,DATA) then
    if (FormatDateTime(´dd´,DATE) >= FormatDateTime(´dd´,DATA)) then
      result := COMPLETO
    else
      result := COMPLETO - 1;
end;


Criei esta função há um tempinho atrás e acho que pode ajudar.
Para usá-la, coloque no OnExit do Edit da data do nascimento o seguinte código:

EditIDADE.text := IntToStr(CalculaIdade(StrToDateTime(EditANIVERSARIO.Text)));


Substitua EditIDADE e EditANIVERSARIO pelos nomes dos seus respectivos edits. Mas tome o cuidado de verificar se a data de aniversário é válida ANTES de entregá-la como parâmeto para a função.

Depois conta pra gente se o problema foi resolvido
Abraço


GOSTEI 0
Tnaires

Tnaires

24/12/2006

Ué, se quiser calcular pelo Delphi mesmo, basta fazer:
YearOf(Date) - YearOf(Query1DataNascimento.AsDateTime);

:roll:


GOSTEI 0
Brasidata

Brasidata

24/12/2006

Ué, se quiser calcular pelo Delphi mesmo, basta fazer:
YearOf(Date) - YearOf(Query1DataNascimento.AsDateTime);


A idéia é até boa mas tem dois pequenos problemas:
Primeiro: Não consegui encontrar a função ´YearOf´ no Delphi (uso a versão 2006)
Segundo: Mesmo que eu encontrasse, seguindo essa lógica, uma pessoa que faz aniversário no final do ano já teria sua idade incrementada desde 01 de janeiro (Já que só o ano está sendo levado em conta), tendo assim uma idade falsa.

Na função que eu sugeri a precisão da idade é de 1 dia. A idade só será incrementada a partir do dia exato do aniversário.

Abraços a todos.


GOSTEI 0
Tnaires

Tnaires

24/12/2006

[b:a11b41e803]brasidata[/b:a11b41e803], você tem razão...
Não sei se a função YearOf existe no Delphi 2006. No Delphi 7, ela se localiza na Unit DateUtils.
Abraços


GOSTEI 0
Anjinho Loiro

Anjinho Loiro

24/12/2006

Vou fazer experiências com as sugestões de todos vcs. Quero agradecer a atenção de todos e se funcionar eu apareço para postar uma mensagem...


Obrigada e até a próxima...


GOSTEI 0
Brasidata

Brasidata

24/12/2006

Obrigado [b:e5140321b6]tnaires[/b:e5140321b6],

Encontrei a função [b:e5140321b6]YearOf[/b:e5140321b6] na Unit DateUtils do Delphi 2006 e apesar dela não ser o ideal para o cálculo de idade me servirá para outros fins. Agradeço pela dica, que mesmo de forma indireta, me será muito útil.

Feliz 2007!!!


GOSTEI 0
Brasidata

Brasidata

24/12/2006

Somando a dica do colega [b:17e839b367]tnaires[/b:17e839b367] com as minhas observações sobre a precisão da idade, encontrei na unit DateUtils uma função para substituir minha sugetão anterior como o mesmo efeito:

Simplesmente declare [b:17e839b367]DateUtils[/b:17e839b367] na clausula [b:17e839b367]Uses[/b:17e839b367] e implemente o seguinte código no [b:17e839b367]OnExit[/b:17e839b367] do seu campo (Edit ou DbEdit) com a data do nascimento:

EditIDADE.text := IntToStr(YearsBetween(StrToDateTime(EditNASCIMENTO.text),Date))


Substitua EditIDADE e EditNASCIMENTO pelos nomes dos seus respectivos edits.

Acho que assim ficará bem mais fácil e elegante.


GOSTEI 0
Facc

Facc

24/12/2006

é facil... é só trocar onde se encontra a table pela query... as propriedades são praticamente as mesmas entre elas...


GOSTEI 0
POSTAR