WITH CREATEOBJECT("age") CLEAR .CalcAge({^1988/2/29} , {^2006/9/14 }) ? .Years , .Months , .Days * CHECK with the correct definition Age = (((Birth+Y)+M)+D) * forward is precise ? GOMONTH(GOMONTH({^1988/2/29},.Years*12),.Months)+.Days * backward is approx ? GOMONTH(GOMONTH({^2006/9/14 } - .Days, -.Months), - .Years*12) * infact * respect to YMD Feb 28/29 are equals !! .CalcAge({^1988/2/28} , {^2006/9/14 }) ? .Years , .Months , .Days ENDWITH define class age as relation Years = NULL Months = NULL Days = NULL procedure CalcAge lparameters tdBirth, tdTarget PRIVATE dateStep WITH m.This .Years = YEAR(m.tdTarget)-YEAR(m.tdBirth) dateStep = GOMONTH(m.tdBirth,.Years*12) IF m.dateStep > m.tdTarget .Years = .Years - 1 dateStep=GOMONTH(m.tdBirth,.Years*12) ENDIF .Months = (MONTH(m.tdTarget) - MONTH(m.dateStep)) % 12 IF GOMONTH(m.dateStep,.Months) > m.tdTarget .Months = .Months -1 ENDIF .Days = m.tdTarget - GOMONTH(m.dateStep,.Months) ENDWITH ENDPROC ENDDEFINE