Calcular edad en años, meses, días

Estoy haciendo una base de datos de mascotas, y quisiera calcular la edad de las mismas. Leyendo he aprendido a obtenerla o en meses, o en años, o en días, pero no he conseguido obtenerlas todas juntas.
En resumen, tengo si nació el 20/02/2010 y hoy es 06/04/2011 quiero ke me diga:
1 año, 2 meses, 3 semanas y 4 dias.
Lo de las semanas es solo cuando son cachorros, solo me interesa si son menores de digamos 3 meses.
Se que esto se hace programando, pero es que soy novato y no tengo ni idea. Uso Access 2010.

1 respuesta

Respuesta
1
Supongamos que la tabla se llama Edad con los campos FechaNacimiento, Años, Meses, Semanas y Días. La función sería:
Function calculoEdad()
Dim db As Database
Dim rs As Recordset
Dim vAño As Double
Dim vMes As Double
Dim vSemana As Double
Dim vDia As Double
Set db = CurrentDb
Set rs = db.OpenRecordset("Select * from Edad")
Do While Not rs.EOF
If Month(rs!FechaNacimiento) > Month(Date) Then
vAño = DateDiff("yyyy", rs!FechaNacimiento, Date) - 1
Else
vAño = DateDiff("yyyy", rs!FechaNacimiento, Date)
End If
If Day(rs!FechaNacimiento) > Day(Date) Then
vMes = DateDiff("m", DateAdd("yyyy", vAño, rs!FechaNacimiento), Date) - 1
Else
vMes = DateDiff("m", DateAdd("yyyy", vAño, rs!FechaNacimiento), Date)
End If
vSemana = Int(DateDiff("d", DateAdd("m", vAño * 12 + vMes, rs!FechaNacimiento), Date) / 7)
vDia = DateDiff("d", DateAdd("m", vAño * 12 + vMes, rs!FechaNacimiento), Date) Mod 7
rs.Edit
rs!Años = vAño
rs!Meses = vMes
rs!Semanas = vSemana
rs!Dias = vDia
rs.Update
rs.MoveNext
Loop
End Function
Me cuentas.
Hola Angeles, gracias de nuevo por contestar.
Tengo varias dudas.
La primera: Mi tabla mascotas tiene varios campos, uno de ellos es FechaNacimiento. Mi pregunta es, ¿tengo qué generarme campos diferentes para Años, Mes, semanas, días y en Edad poner lo que me has puesto antes; o solamente me creo un campo Edad? ¿Y otra pregunta, donde exactamente escribo todo ese código?
Y ya la última pregunta, he estado leyendo y parece ser que los campos calculados es tontería guadarlos en tablas, ya que cada vez que se visualizan cambian. Como me estoy haciendo un formulario con una "ficha" de cada mascota donde me aparece toda su información, ¿no sería mejor poner estos cálculos allí? de ser así, ¿Cómo sería?.
Muchísimas gracias de nuevo, me estas haciendo un gran favor. Saludos
Efectivamente el código está hecho para actualizar los campos Años, Meses, Semanas, Días de la tabla Edad.
Puedes ejecutar el código de varias formas:
En la pestaña módulos abres un módulo nuevo y escribes la función, si lo quieres ejecutar desde aquí, picarías en la flecha que hay en la parte superior.
Si no, guardarías el módulo (da igual el nombre) y abrirías una macro nueva, en acción pondrías EjecutarCódigo y en nombre de la función CalculoEdad, al ejecutar la macro se ejecutaría el código.
También podrías hacerlo desde un formulario, te creas un botón, cuando salte el asistente le dices cancelar, después con botón derecho sobre el botón irías a Generar Evento ---> Generador de código, es ahí donde tendrías que escribir el código.
Efectivamente no es bueno guardar campos calculados en la tabla y menos si son edades, ya que tendrías que actualizarlo diariamente. El código era, principalmente, para que supieras como calcular años, meses, semanas y días.
En tú caso yo haría lo siguiente:
Supongamos que la tabla se llama Mascotas, con los campos IdMascota (Un código que identifique, inequívocamente a la mascota ---> nº de teléfono por ejemplo) FechaNacimiento, Raza...
Creamos un formulario independiente (no lo bases en ninguna tabla ni consulta)
Insertamos un cuadro combinado, en las propiedades de ese cuadro combinado:
Nombre: selMascota
Origen de la fila: Select IdMascota from Mascotas order by IdMascota
Al hacer clic: Procedimiento de Evento ---> picas en el cuadrado de la derecha, el de los ... y pones Me. Refresh (Para que actualice el formulario al seleccionar un código en el cuadro)
Dim vAño As Double
Dim vMes As Double
Dim vSemana As Double
Dim vDia As Double
If Month(Form!txtFechaNacimiento) > Month(Date) Then
vAño = DateDiff("yyyy", Form!txtFechaNacimiento, Date) - 1
Else
vAño = DateDiff("yyyy", Form!txtFechaNacimiento, Date)
End If
If Day(Form!txtFechaNacimiento) > Day(Date) Then
vMes = DateDiff("m", DateAdd("yyyy", vAño, Form!txtFechaNacimiento), Date) - 1
Else
vMes = DateDiff("m", DateAdd("yyyy", vAño, Form!txtFechaNacimiento), Date)
End If
vSemana = Int(DateDiff("d", DateAdd("m", vAño * 12 + vMes, Form!txtFechaNacimiento), Date) / 7)
vDia = DateDiff("d", DateAdd("m", vAño * 12 + vMes, Form!txtFechaNacimiento), Date) Mod 7
Form!txtAños.Value = vAño
Form!txtMeses.Value = vMes
Form!txtSemanas.Value = vSemana
Form!txtDias.Value = vDia
5 cuadros de texto que llamaremos txtFechaNacimiento, txtAños, txtMeses, txtSemanas y txtDias
En el cuadro txtFechaNacimiento, en origen del registro ponemos:
=DBúsq("[FechaNacimiento]";"[Mascotas]";"IdMascota=Form!selMascota.Value")
Es decir búscame en el campo FechaNacimiento de la tabla Mascotas el registro cuyo IdMascota sea igual al seleccionado en el cuadro combinado selMascota.
Los otros cuadros de texto los actualiza en el cuadro combinado en la acción Al hacer clic.
Me cuentas.
Muchísimas gracias Ángeles, eres un sol!
Por fin lo he conseguido (aunque he he tenido que pelearme un poquito con el Access jaja)
Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas