PDA

Ver la Versión Completa : calcular la edad....


Goyo
04-07-2007, 19:42:47
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


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:


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
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
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:

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
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:

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
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
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...


TbEmpleadoscalculaEdad.Value :=trunc (trunc (date - dm.TbEmpleadosFechadeNacimiento.value) / 365);


graciar por su ayuda...
saludos:)