Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Edad! (https://www.clubdelphi.com/foros/showthread.php?t=76875)

y_a_p 01-12-2011 14:22:13

Edad!
 
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:
Código Delphi [-]
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.
Código Delphi [-]
 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 Noteví 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:

Código Delphi [-]
 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

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

Código Delphi [-]
 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
Código Delphi [-]
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 hacemos
Código Delphi [-]
Meses := 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:

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 10:12:29.

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