PDA

Ver la Versión Completa : Edad!


y_a_p
01-12-2011, 14:22:13
Hola a todos nuevamente yo!, evidentemente hay algo q estoy haciendo mal cuando saco la edad y los meses porq no me dan bien los resultado, mi sistema esta hecho en Delphi 7, trabajo con BD SQL Manager 2008 y el motor Firebird, lo q busco es, después de haber sacado con la función MontsBetween la cantidad de meses q tiene un paciente desde la fecha de nacimiento hasta hoy, obtener a partir de esa cantidad de meses, por ejemplo: 37, la cantidad de años y meses q tiene ese paciente, por ejemplo: 3 años y 1 mes.Aquí les presento el código:
var
a,edad,m: Integer;
begin
a:=0;
DM.DSET_pac.Edit;
DM.DSET_pacMESES.Value:=MonthsBetween(Now, DM.DSET_pacMESES.Value);
edad:=DM.DSET_pacMESES.Value;
For m:=edad Downto 12 do
a:=a+1;
m:=m-11;
DM.DSET_pacEDAD.Value:=a;
DM.DSET_pacMESES.Value:=m;

DM= Data_Module.
DSET_pac= Tabla pacientes.
a= cantidad de años.
m= cantidad de meses.
Ambos obtenidos después del for, q son los q no me dan como debe ser.
edad= cantidad de meses obtenidos con la función MonthsBetween.
Debo contarles q en el OnShow del Alta de pacientes tengo la fecha para q aparezca por defecto con la fecha actual, y al mes y año inicializado en 0, al igual en la BD.
DM.DSET_pacMESES.Value:=0;
DM.DSET_pacEDAD.Value:=0;
DM.DSET_pacFECHA_DE_NACIMIENTO.Value:= Now;
Desde ya muchas gracias por su ayuda!!!

Casimiro Notevi
01-12-2011, 14:59:03
Por favor, recuerda poner títulos descriptivos a tus preguntas, Edad! no es ningún título que describa nada.

Caro
01-12-2011, 15:00:28
Hola y_a_p, es mejor que utilices las funciones de fecha:


var Anyos, Meses : Integer;
begin
Anyos := YearsBetween(Now, FechaInicio);
if Anyos > 0 then
FechaInicio := IncYear(FechaInicio, Anyos);

Meses := MonthsBetween(FechaInicio, Now);
showmessage('Edad :'+IntToStr(Anyos)+' Años '+IntToStr(Meses)+' Meses');


lo acomodas a tu codigo.

Saluditos

y_a_p
01-12-2011, 15:22:26
Voy a tener en cuanta lo del título, igual me gustaría entender q hace el código, me podrían decir q resultado emana la función IncYear igual cuando a fecha le asigno el valor del año y no me deja pasar de integer a date, desde ya muchas gracias!!!

Caro
01-12-2011, 15:42:17
Hola, IncYear incrementa en años a la fecha que le pasas como parámetro, te explico el codigo:


var Anyos, Meses : Integer;
begin
Anyos := YearsBetween(Now, FechaInicio);//Obtenemos la cantidad de años entre la fecha inicio y la fecha actual
if Anyos > 0 then
//si existen años se incrementa esa cantidad, a la fecha inicio para así saber los meses que faltan
FechaInicio := IncYear(FechaInicio, Anyos);

Meses := MonthsBetween(FechaInicio, Now); //obtenemos la cantidad de meses



Saluditos

y_a_p
01-12-2011, 15:50:35
Claro, pero deberías tener en cuenta q a los meses los calcula desde la fecha en q nacio, por lo tanto si tiene 3 años y 1 mes, no te calcula los 3 años y 1 mes te calcula 37 meses... cosa contraria con los años q te los calcula bien pero los meses q restan no los tiene en cuenta, no se si me explico...

ElDioni
01-12-2011, 16:51:24
Hola y_a_p,

creo que no has entendido lo que te proponía Caro, en la función FechaInicio:=IncYear(FechaInicio, Anyos); es lo siguiente:

A la FechaInicio (Caro la ha llamado así pero en realidad es la fecha de nacimiento del paciente) le está sumando los años resultantes después de hacer el YearsBetween y que hemos guardado en la variable Anyos.

Pongamos que la FechaInicio es 01/02/2008 y hoy es 01/03/2011 por lo tanto al hacer el YearsBetween tendremos guardado Anyos=3, luego a la fecha inicio le sumamos esos años por lo que tendríamos 01/02/2011, si ahora hacemosMeses := MonthsBetween(FechaInicio, Now); tendremos meses=1.

Espero que esto te haya despejado las dudas que tuvieras.

Saludos.

y_a_p
01-12-2011, 21:29:29
Ah, ahora si comprendo y si me sirvio mucho, estaba interpretando equivocadamente el código, muchísimas gracias!!! :)

Pedro-Juan
02-12-2011, 00:39:57
Hola.

Yo utilizo esta función que encontré por el foro:

function CalcularEdad(Fecha: TDateTime):String; // GeneralCode -> 015 -- Calcula la edad con la fecha de nacimiento (Años, meses y días)
var A, AA, M, MM, D, DD: Word;
Anio, Mes, Dia: double;
begin
DecodeDate(Fecha, A, M, D);
DecodeDate(Date, AA, MM, DD);
Anio := Int(AA - A);
if( M <= MM ) then
Mes := MM - M
else
begin
Mes := MM+12-M;
Anio := Anio -1;
end;
if( D <= DD ) then
Dia := DD - D
else
begin
Dia:=DD+MonthDays[IsLeapYear(AA),MM]-D;
Mes := Mes -1;
end;
if Mes < 0 then
begin
Anio := Anio - 1;
Mes := 12 + Mes;
end;
Result := Format('Años: %.0f, Meses: %.0f, Días: %.0f', [Anio, Mes, Dia]);
end;


Por si sirve. Un saludo.