Fórmula para calcular Edad

569 views
Skip to first unread message

Víctor Hugo Espínola Domínguez

unread,
Jul 16, 2014, 1:02:42 PM7/16/14
to publice...@googlegroups.com, mundovis...@googlegroups.com
Hola

Fórmula para calcular la edad en años de una persona:

nEdad  = INT((VAL(DTOS(DATE())) - VAL(DTOS(dNacimiento))) / 10000)


Saludos,
Víctor.
Lambaré - Paraguay.


Fernando D. Bozzo

unread,
Jul 16, 2014, 4:45:35 PM7/16/14
to publice...@googlegroups.com, mundovis...@googlegroups.com
Hola:

Les dejo una vieja rutina que tenía guardada, calcula exacto.
Como resultado de función devuelve el resultado con decimales, y en el array devuelve año, mes y día por separado.


Ejemplo de uso

SET PROCEDURE TO calc_edad.prg
DECLARE laYMD
(1)
? pertoymd( @laYMD, {^1969/11/25}, DATE() )
DISPLAY MEMORY LIKE laYMD




Guardar como CALC_EDAD.RG

PROCEDURE pertoymd        && (PeriodToYMD) Devuelve la cantidad de años, meses y días entre 2 fechas dadas. Paráms: @aYMD, dFechaD [,dFechaH] [,cTipoCalc]. NOTA: aYMD=array con años, meses y días. Si se indica YMD, PerToYMD devuelve años y decimas.
   
*********************************************************************************************************
   
*-- Devuelve la cantidad de años, meses o días que hay entre 2 fechas.
   
*-- Metodología:
   
*-- 1) Calculo los meses y dias hasta fin de año origen
   
*-- 2) Calculo los años intermedios entre las fechas origen y destino
   
*-- 3) Calculo los meses y dias desde principio de año destino
   
*-- 4) Redondeo los dias y meses restantes a años y meses si es posible
   
*********************************************************************************************************
   
* taDatos        : Tiene doble función:
   
*                -Si se pasa por referencia, se devuelve un array con el resultado.                        *
   
*                    col.1=Años, col.2=meses, col.3=días                                                    *
   
*                -Si se pasa "Y", "M", o "D" se devuelve el resultado de años, meses o días del cálculo.    *
   
* tdFechaDesde    : Fecha desde la cuál comenzar el cálculo
   
* tdFechaHasta    : (opc) Fecha final, Si no se indica se asume hoy.
   
*********************************************************************************************************
    LPARAMETERS taDatos
, tdFechaDesde, tdFechaHasta
    LOCAL lnRetorno
, lnDias, lnAño, lnMes, lnDiasAños, lnDiasMeses, lnAños, lnMeses, lnDiaOrigen, lnMesOrigen, ;
        lnA
ñoOrigen, lnAñoOrigen2, lnDiaDestino, lnMesDestino, lnAñoDestino, lnAñoDestino2, lcYMD, lnDOM

    IF TYPE
( "ALEN(taDatos, 1)" ) # "N"
       
*-- No es un array
        lcYMD    
= taDatos
    ELSE
       
*-- Es un array
        DECLARE taDatos
(3)
        lcYMD    
= ALEN(taDatos, 1)
    ENDIF

    IF EMPTY
(tdFechaHasta)
        tdFechaHasta    
= DATE()
    ENDIF

   
*-- Inicio nueva función
    lnDias    
= tdFechaHasta - tdFechaDesde
    lnA
ños    = ROUND(lnDias / 365.25, 0)

    IF GOMONTH
(tdFechaDesde, lnAños * 12) > tdFechaHasta
        lnA
ños = lnAños - 1
    ENDIF

    FOR lnMeses
= 1 TO 12
        IF GOMONTH
(tdFechaDesde, lnAños * 12 + lnMeses) > tdFechaHasta
            lnMeses
= lnMeses - 1
            EXIT
        ENDIF
    ENDFOR

    lnDias
= tdFechaHasta - GOMONTH(tdFechaDesde, lnAños * 12 + lnMeses)
   
*-- Fin nueva función

   
*-- Asigno los resultados
    IF VARTYPE
(lcYMD) # "C"
        lnRetorno
= lnAños + lnMeses / 12
        taDatos
(1)    = lnAños
        taDatos
(2)    = lnMeses
        taDatos
(3)    = lnDias
    ELSE
        DO CASE
        CASE lcYMD
= "Y"
            lnRetorno    
= lnAños
        CASE lcYMD
= "M"
            lnRetorno    
= lnMeses
        CASE lcYMD
= "D"
            lnRetorno    
= lnDias
        ENDCASE
    ENDIF

    RETURN lnRetorno

ENDPROC




Saludos!

Fidel Charny

unread,
Jul 16, 2014, 5:10:44 PM7/16/14
to publice...@googlegroups.com, mundovis...@googlegroups.com
No más, para hacer un poco de ruido, pego esta otra.

local ldNacim, objResp
ldNacim=date(1958,4,11)
objResp=CalcularEdad(ldNacim)
? objResp.tiempo
? objResp.dias
? objREsp.meses
? objResp.años
objResp=null

PROCEDURE CalcularEdad
LPARAMETERS tdFecha1
,tdFecha2
*!*    ----------------------------------------------------------------
*!*    Autor:            Fidel Charny (y los otros?!? )  
*!*    tdFecha1         Fecha inferior (nacimiento)
*!*    tdFecha2         Fecha superior (día de cálculo) * Default=Date()
*!*    Devuelve un objeto con las prop: dias,meses,años y tiempo (C)
*!*    ----------------------------------------------------------------
tdFecha2
=EVL(tdFecha2,DATE())
LOCAL lnAnos
,lnMeses,lnDias,lnAno2,lnMes2,lnDia1,lnDia2,;
    objEmpty
,lcString,ldTrans

* Verificar tdFEcha1 <= tdFEcha2
IF tdFEcha1
> tdFecha2
    ldTrans
=tdFEcha1
    tdFecha1
= tdFEcha2
    tdFecha2
= ldTrans
ENDIF

lnAnos
=Year(tdFecha2)-Year(tdFecha1) - 1
lnMeses
=12-Month(tdFecha1) + Month(tdFecha2) - 1

do case
   
case Day(tdFecha1) = Day(tdFecha2)
        lnMeses
= lnMeses+1
   
case Day(tdFecha2) > Day(tdFecha1)
        lnMeses
= lnMeses + 1
   
case Day(tdFecha2) < Day(tdFecha1)
       
*    lnMeses = lnMeses
endcase
if lnMeses >= 12
    lnMeses
=lnMeses - 12
    lnAnos
=lnAnos + 1
endif

if Day(tdFecha1)=Day(tdFecha2)
    lnDias
=0
else
    lnDia1
=Day(tdFecha1)
    lnDia2
=Day(tdFecha2)
   
if Day(tdFecha2) > Day(tdFecha1)
        lnDias
=Day(tdFecha2)-Day(tdFecha1)
   
else
        lnMes2
=month(tdFecha2)-1
        lnAno2
=Year(tdFecha2)
       
if lnMes2 = 0
            lnMes2
=12
            lnAno2
=lnAno2-1
        endif
        lnDias
=lnDia2 + DAY(Gomonth( Date( lnAno2 , lnMes2, 1) , 1) - 1) - lnDia1
    endif
endif

lcString
=TRANSFORM(lnAnos) + " Año" + IIF(lnAnos > 1,"s","")+ ", ";
   
+TRANSFORM(lnMeses) + " Mes" + IIF(lnMeses > 1,"es","")+ ", ";
   
+TRANSFORM(lnDias) + " Dia" + IIF(lnDias > 1,"s","")
   

objEmpty
=NEWOBJECT("Empty")
ADDPROPERTY
(objEmpty,"Tiempo",lcString)
ADDPROPERTY
(objEmpty,"Años",lnAnos)
ADDPROPERTY
(objEmpty,"Meses",lnMeses)
ADDPROPERTY
(objEmpty,"Dias",lnDias)

REturn objEmpty


Fidel Charny

unread,
Jul 16, 2014, 6:29:02 PM7/16/14
to mundovis...@googlegroups.com, publice...@googlegroups.com
Cómo es que apareció esto aquí?. Lo había puesto en Comunidad...
Humm, tal vez esté un poco perdido...

Fernando D. Bozzo

unread,
Jul 16, 2014, 6:43:08 PM7/16/14
to publice...@googlegroups.com, mundovis...@googlegroups.com
Porque hicieron crossposting con la pregunta, entonces la respuesta sale en ambos.

Fidel Charny

unread,
Jul 16, 2014, 6:53:56 PM7/16/14
to publice...@googlegroups.com, mundovis...@googlegroups.com
Ah... Si, parece que estamos en estereo (que antiguo!!!).

Víctor Hugo Espínola Domínguez

unread,
Jul 17, 2014, 5:08:30 PM7/17/14
to mundovis...@googlegroups.com
Siguiendo con el tema edad.

ldNacim        = Date(2007, 07, 18)
ldAlDia         = Date()

lnAaaaNacim  = Year(ldNacim)
lnMmNacim    = Month(ldNacim)
lnDdNacim     = Day(ldNacim)

lnAaaaAlDia  = Year(ldAlDia)
lnMmAlDia    = Month(ldAlDia)
lnDdAldia      = Day(ldAlDia)

lcDiasMes    = "31 31 " ;
                   + Iif(Day(Gomonth(Date(Year(ldAlDia), 1, 31), 1)) = 29, "29 ", "28 ") ;
                   + "31 30 31 30 31 31 30 31 30 31"

lnMmAlDia    = lnMmAlDia - Iif(lnDdAldia < lnDdNacim, 1, 0)

lnDdEdad      = lnDdAldia + Iif(lnDdAldia < lnDdNacim, Val(Getwordnum(lcDiasMes, lnMmAlDia + 1)), 0) - lnDdNacim
lnMmEdad    = lnMmAlDia + Iif(lnMmAlDia < lnMmNacim, 12, 0) - lnMmNacim
lnAaaaEdad  = lnAaaaAlDia - Iif(lnMmAlDia < lnMmNacim, 1, 0) - lnAaaaNacim

Messagebox( Textmerge( "<<lnAaaaEdad>> Años, <<lnMmEdad>> Meses, <<lnDdEdad>> Dias"))

Saludos,
Víctor.
Lambaré - Paraguay.



--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages