Atualizar Idade

Delphi

20/09/2006

Senhores(as),
Estou usando o código abaixo(que peguei aqui no fórum) para calcular a Idade em anos e meses de uma pessoa... Ele funciona perfeitamente bem!
Mas gostaria de fazer com que num evento(tipo click num botão) ele calculasse a idade de todos cadastrados no Banco de Dados... do jeito que está ele só calcula quando eu Cadastro/Altero a data de nascimento(DBEdit6)... Desde já, meu obrigado a vcs!

procedure TFrmCadastro.DBEdit6Exit(Sender: TObject);
var
MesN, AnoN, MesA, IdadeAnos, IdadeMeses : Integer;
begin
MesN := MonthOf(DMNutricao.TblCadClientesDTNASCIMENTO.AsDateTime);
AnoN := YearOf(DMNutricao.TblCadClientesDTNASCIMENTO.AsDateTime);
MesA := MonthOf(Date);

IdadeAnos := YearOf(Date)- AnoN;
IdadeMeses := 0;

If MesN > MesA Then
Begin
IdadeAnos := IdadeAnos - 1;
IdadeMeses := 12 + (MesA - MesN);
End
Else
If MesN < MesA Then
Begin
IdadeMeses := MesA - MesN;
end;

DBEdit1.Text := IntToStr(IdadeAnos);
DBEdit3.Text := IntToStr(IdadeMeses);
DMNutricao.TblCadClientes.Post;

end;


Alexandretavares

Alexandretavares

Curtidas 0

Respostas

Micheus

Micheus

20/09/2006

[b:5f636f2347]alexandretavares[/b:5f636f2347], outra alternativa para cálculo da idade separada por ANO e MES :
var
  mes, ano :integer;
begin
  Mes := MonthsBetween(MonthsBetween(EndOfTheMonth(Date), DMNutricao.TblCadClientesDTNASCIMENTO.AsDateTime);
  Ano := Mes div 12;
  Mes := Mes mod 12;
  DBEdit1.Text := IntToStr(Ano);
  DBEdit3.Text := IntToStr(Mes);
end;


Mas gostaria de fazer com que num evento(tipo click num botão) ele calculasse a idade de todos cadastrados no Banco de Dados...
Supondo que o campo que está vinculado ao seu DBEdit1 seja TblCadClientesIDADE_ANO e ao DBEdit3 TblCadClientesIDADE_MES:
procedure TFrmCadastro.Botton1(Sender: TObject);
var
  Mes, Ano :Integer;
begin
  with DMNutricao do
  begin
    TblCadClientes.First; 
    while TblCadClientes.EOF do
    begin
      Mes := MonthsBetween(MonthsBetween(EndOfTheMonth(Date), TblCadClientesDTNASCIMENTO.AsDateTime);
      Ano := Mes div 12;
      Mes := Mes mod 12;

      TblCadClientes.Edit; 

      TblCadClientesIDADE_ANO.AsInteger := Ano;
      TblCadClientesIDADE_MES.AsInteger := Mes;

      TblCadClientes.Post; 
      TblCadClientes.Next; 
    end;
  end;
end;

Se os campos ANO e MES ficarem em outra tabela, então antes do comando Edit, ela deve ser posicionada e a tabela do exemplo onde são utilizados o Edit e Post devem ser substituidos por esta tabela.

[]s


GOSTEI 0
Alexandretavares

Alexandretavares

20/09/2006

Além da sua dica inteligente, gostei tb dessa frase Micheus :
´Há sempre, pelo menos, dois modos de fazer uma mesma coisa. Mesmo que sejam certo e errado´ (Eu)

Hoje a noite vou tentar tua dica e se tudo der certo, te envio msg...

Valeu!

Alexandre Tavares


GOSTEI 0
Alexandretavares

Alexandretavares

20/09/2006

Micheus, o código que vc me passou(logo abaixo) não fez nada com o banco de dados... ele simplesmente não alterou em nada as idades!
Por exemplo: eu tenho cadastros que tem a data de nascimento preenchida e não foram afetados em nada pelo código(não foi calculada a idade em Anos e Meses)! Alterei no proprio BD a data de nascimento de alguns registros e tb não fez nada...
Esqueci de te dizer que estou usando ADO(Access)

Já o código anterior que vc me passou, o qual uso no evento OnExit do campo DBEdit6, funcionou perfeitamente bem(inclusive bem mais simples que o código que eu usava antes pra fazer a mesma coisa)

Um abraço!
...........................................................................................................
procedure TFrmCadastro.Botton1(Sender: TObject);
var
Mes, Ano :Integer;
begin
with DMNutricao do
begin
TblCadClientes.First;
while TblCadClientes.EOF do
begin
Mes := MonthsBetween(MonthsBetween(EndOfTheMonth(Date), TblCadClientesDTNASCIMENTO.AsDateTime);
Ano := Mes div 12;
Mes := Mes mod 12;

TblCadClientes.Edit;

TblCadClientesIDADE_ANO.AsInteger := Ano;
TblCadClientesIDADE_MES.AsInteger := Mes;

TblCadClientes.Post;
TblCadClientes.Next;
end;
end;
end;


GOSTEI 0
Micheus

Micheus

20/09/2006

Micheus, o código que vc me passou(logo abaixo) não fez nada com o banco de dados... ele simplesmente não alterou em nada as idades! Por exemplo: eu tenho cadastros que tem a data de nascimento preenchida e não foram afetados em nada pelo código(não foi calculada a idade em Anos e Meses)! Alterei no proprio BD a data de nascimento de alguns registros e tb não fez nada... Esqueci de te dizer que estou usando ADO(Access)
[b:511473210e]exandretavares[/b:511473210e], saber que vc utiliza ADO já ajuda a melhorar um palpite. Vc poderia informar corretamente, quais componentes e o nome dos dataset´s e campos envolvidos. Como vc deve ter lido em meu post, eu apenas supús seus nomes.

Já o código anterior que vc me passou, o qual uso no evento OnExit do campo DBEdit6, funcionou perfeitamente bem
por esta afirmação, vemos que em, termos de cálculo, a rotida deveria estar correta. Alguma coisa relacionada a tabela sendo alterada é que deve estar gerando este efeito.

[]s


GOSTEI 0
Alexandretavares

Alexandretavares

20/09/2006

Eu realmente não sei o que tentar mais!!!
O que é que pode estar havendo com isso, que aparentemente está correto, [b:57396c86a6]e está qdo executo o código no evento OnExit de um Dbedit[/b:57396c86a6], e não funciona no Evento OnClick(para que ele atualize todo o BD) ???


GOSTEI 0
Micheus

Micheus

20/09/2006

[b:42af4fd45f]alexandretavares[/b:42af4fd45f], vc já acompanhou passo-a-passo(F8 ) a execução desta parte do código para confirmar os valores atribuidos nas linhas:
TblCadClientesIDADE_ANO.AsInteger := Ano;
TblCadClientesIDADE_MES.AsInteger := Mes;
Inspecionando seus valores(CTRL+F7) após a atribuição?

Não trabalho com ADO, mas dê uma verificada nas configurações de sua conexão.
Se vc utiliza TADOConnection, como estão definidas as propriedades IsolationLevel, Mode, Atributs?


GOSTEI 0
Alexandretavares

Alexandretavares

20/09/2006

Já acompanhei!


GOSTEI 0
Micheus

Micheus

20/09/2006

á acompanhei!
E....
Os valores são atribuidos na depuração e continuam após o post?

Vc talvez não precise comitar a transação (ADOConnection.CommitTrans)?

E quanto aos outros questionamentos:
Se vc utiliza TADOConnection, como estão definidas as propriedades IsolationLevel, Mode, Atributs?

Não estaria utilizando uma conexão somente leitura?


GOSTEI 0
POSTAR