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
1
Anónimo
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