Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   calcular la edad.... (https://www.clubdelphi.com/foros/showthread.php?t=45485)

Goyo 04-07-2007 19:42:47

calcular la edad....
 
Estoy realizando un pequeño sistemita para controlar empleados, lo que pretendo realizar es que cuando le escriba y/o seleccione la fecha de nacimiento, al momento de salir de este componente, me muestre automaticamente la edad en un DBEdit. Les comento que SI me muestra la edad, solo que despues de salir del campo DBDateTimeEditEh1 no me muestra la edad automaticamente, para que me pueda mostrar la edad tengo que volver al pulsar sobre el mismo campo para que me pueda mostrar la edad...

Utilizo tablas de Paradox y aqui les muestro el codigo que tengo en el evento OnExit del DBDateTimeEditEh1

Código Delphi [-]
procedure TCardexForm1.DBDateTimeEditEh1Exit(Sender: TObject);
var
 antiguedad : integer;
begin
  try
    if not varisnull(dm.TbEmpleadosFechadeNacimiento.value) and (dm.TbEmpleadosFechadeNacimiento.value <> 0) then
    begin
      //cálculo de la antigüedad de una variedad
      antiguedad := trunc (trunc (date - dm.TbEmpleadosFechadeNacimiento.value) / 365);
      dm.TbEmpleadosEdad.value := antiguedad;
    end;
  except
    //raise;  no se muetra el error ya que es un campo calculado
  end;
end;

Nota: El componente DBDateTimeEditEh1 es de la Libreria EhLib... mis campos que se involucran son: FechadeNacimiento y Edad

de antemano muchas gracias..

gabrielkc 04-07-2007 20:18:38

Los componentes Data Aware y sus problemitas y sus problemotas :(

Yo usaría un TEdit son unas cuantas lineas de código mas.... pero pues ya es a juicio de cada uno

jhonny 04-07-2007 20:21:20

Pregunta, ¿Tiene que ser al salir del Combo?, Porque si no, podría ser en el OnSetText del campo.

jhonny 04-07-2007 20:24:27

O también podrías aprovechar que estas usando ese componente de la biblioteca EhLib y usar su evento OnChange.

jhonny 04-07-2007 20:26:22

O pensándolo bien, mejor te sirva el OnUpdateData.

Goyo 04-07-2007 20:40:41

ya probe en OnChange y nada me muestra un error que mi tabla no esta en modo edicion... tambien puse el codigo en el evento OnsetText y me marco un error en varisnull.

ojala me puedan ayudar a solucionar este problema, la idea es mejorarlo y/o corregir el codigo... de antemano muchas gracias....

jhonny 04-07-2007 20:52:12

Pruebalo asi, en el OnChange:

Código Delphi [-]
 
var
 antiguedad : integer;
begin
  try
    if not varisnull(dm.TbEmpleadosFechadeNacimiento.value) and (dm.TbEmpleadosFechadeNacimiento.value <> 0) then
    begin
      //cálculo de la antigüedad de una variedad
      antiguedad := trunc (trunc (date - dm.TbEmpleadosFechadeNacimiento.value) / 365);
      dm.TbEmpleados.Edit;
      dm.TbEmpleadosEdad.value := antiguedad;
    end;
  except
    //raise;  no se muetra el error ya que es un campo calculado
  end;
end;

Goyo 04-07-2007 21:46:16

definitivamente No lo hace
 
ya lo probe con el evento OnChange de la manera que me sujeriste y no realiza nada, ni siquiere muestra algo en Dbedit (Edad)... con el evento OnExit del DBDateTimeEditEh1 si lo hace, solo que tiene que pulsar otra vez sobre el mismo componente, despues de haber salido, para que te muestre la fecha...
de todos modos muchas gracias por tus sugerencias...

jhonny 04-07-2007 21:52:03

Una pregunta, ¿Porque no haces un campo calculado en el DataSet para que uses el evento OnCalcFields?

Goyo 04-07-2007 21:57:30

ya lo realice se llama calcula Edad
 
Cita:

Empezado por jhonny
Una pregunta, ¿Porque no haces un campo calculado en el DataSet para que uses el evento OnCalcFields?

ya lo hice dentro del Dataset cree un campo llamado calculaEdad de tipo Integer... ahora que es lo debo hacer con el....
(TbEmpleadoscalculaEdad)
gracias...

Caral 04-07-2007 21:57:34

Hola
No se si esto te servira, es de truco mania:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);

  function Edad(FechaNacimiento:string):integer;
  var
     iTemp,iTemp2,Nada:word;
     Fecha:TDate;
  begin
    Fecha:=StrToDate(Edit1.text); // aqui se inserta la fecha en formato 07/09/1969
    DecodeDate(Date,itemp,Nada,Nada);
    DecodeDate(Fecha,itemp2,Nada,Nada);
     if FormatDateTime('mmdd',Date) <
        FormatDateTime('mmdd',Fecha) then Result:=iTemp-iTemp2-1
                                     else Result:=iTemp-iTemp2;
  end;

begin
  Label1.Caption:=intToStr(Edad('07/09/1969'));
end;
Creo que la diferencia seria que en vez de buscar la fecha en el edit, se busque en la tabla.
Saludos

gabrielkc 04-07-2007 22:00:13

Cita:

Empezado por Goyo
ya lo hice dentro del Dataset cree un campo llamado calculaEdad de tipo Integer... ahora que es lo debo hacer con el....

gracias...

En el evento OnCalcFields de tu DataSet llama el procedimiento que obtiene la edad y asignalo al valor del campo

gabrielkc 04-07-2007 22:03:36

en el OnCalcFields de tu dataset quedaría

FieldByName('CalculaEdad'):=trunc (trunc (date - dm.TbEmpleadosFechadeNacimiento.value) / 365);

jhonny 04-07-2007 22:04:33

Bien, entonces solo basta con que coloques tu codigo en el OnCalcFields del Dataset:
Código Delphi [-]
 
var
 antiguedad : integer;
begin
  try
    if not varisnull(dm.TbEmpleadosFechadeNacimiento.value) and (dm.TbEmpleadosFechadeNacimiento.value <> 0) then
    begin
      //cálculo de la antigüedad de una variedad
      antiguedad := trunc (trunc (date - dm.TbEmpleadosFechadeNacimiento.value) / 365);
      dm.TbEmpleados.Edit;
      dm.TbEmpleadosCalculaEdad.value := antiguedad;
    end;
  except
    //raise;  no se muetra el error ya que es un campo calculado
  end;
end;

gabrielkc 04-07-2007 22:06:40

Solo una correccion jhonny, me parece que para los campos calculados no es necesario que pongas la tabla en modo de edición.

jhonny 04-07-2007 22:23:10

Cita:

Empezado por gabrielkc
Solo una correccion jhonny, me parece que para los campos calculados no es necesario que pongas la tabla en modo de edición.

Tienes razón, :), debo echarle la culpa a algo, a ver, a ver... ahhh, ya se, eso fue culpa del Copiar y Pegar. :p

Goyo 04-07-2007 22:36:53

por fin quedo... solucionado
 
ahora ya solucione mi duda... gracias por su ayuda.. aqui pongo el codigo correcto que puse en el evento OnCalcsFields del DataSet, ahora si hace lo que queria, ahora solo en la pantalla donde me mostraba la edad (campo normal DBEdit) enlace el campo calculado calculaEdad... ahora si lo hace...

Código Delphi [-]
   TbEmpleadoscalculaEdad.Value :=trunc (trunc (date - dm.TbEmpleadosFechadeNacimiento.value) / 365);

graciar por su ayuda...
saludos:)


La franja horaria es GMT +2. Ahora son las 04:52:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi