Edad y meses en access - calculo automático
Mi programa solo me calcula la edad en años pero deseo en años y meses, lo logre con una macro; pero solo en años. He leído algunas soluciones para otros pero al aplicarlas con mi no me funcionan. ¿Alguna sugerencia?
Soy nuevo en access
2 Respuestas
Para una respuesta más concreta deberías decir en que formato quieres verlo. Si que en un cuadro de texto te ponga los años y en otro los meses, o si lo quieres en un cuadro de texto que te ponga, por ejemplo 20 años y 5 meses. Además no dices cuando lo quieres calcular, su cuando escribes la fecha de nacimiento o sí la tabla ya tiene fecha de nacimiento y quieres que te actualice el campo Edad.
Prefiero explicarte paso a paso como trabaja un ordenador. Si tengo un cliente
Y pulso el botón Calcular edad
Como los ordenadores no trabajan con fechas, sino con números, la edad real son 8049 días. Esta cantidad, si la divides por 365,34 días que tiene un año medio, te da los 22, pero le sobran 13 días que como no completan un mes medio, 30,27, por eso te aparece o meses. Otro ejemplo
Sobrarían unos días que no completan el siguiente mes.
El código es
Private Sub Comando17_Click() Edad = Date - FechaNac Años = Fix((Date - FechaNac) / 365.24) Quedan = Int(Edad - Años * 365.24) Meses = Fix(Quedan / 30.24) End Sub
Dicho esto, si concretas los puntos del principio se puede ajustar más la solución.
- Compartir respuesta
Otra forma que es la que suelo usar, e intuyo que es parecida a la que usaste para calcular la edad en años
1º/ Crea un módulo nuevo en tu base de datos y en él pega la siguiente función:
'-------------------------------------------------------------------------------------------- 'Función para calcular la edad en años y meses, o en días si es menor de un mes '-------------------------------------------------------------------------------------------- Public Function fncEdadDetalle(FechaNac As Variant) As String Dim vAño As Double Dim vMes As Double Dim vDia As Double If IsNull(FechaNac) Then fncEdadDetalle = "" Exit Function End If If FechaNac = Date Then fncEdadDetalle = "0 días" Exit Function End If 'Compruebas el mes If Month(FechaNac) > Month(Date) Then vAño = DateDiff("yyyy", FechaNac, Date) - 1 Else vAño = DateDiff("yyyy", FechaNac, Date) End If 'Compruebas el día If Day(FechaNac) > Day(Date) Then vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaNac), Date) - 1 If vMes < 0 Then vMes = 12 + vMes vAño = vAño - 1 End If Else vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaNac), Date) End If 'Si es menor de un mes, calculas la edad en días If vAño = 0 And vMes = 0 Then vDia = DateDiff("d", FechaNac, Date) 'Construyes la cadena de la edad If vAño = 1 Then fncEdadDetalle = vAño & " año" ElseIf vAño > 1 Then fncEdadDetalle = vAño & " años" End If If vMes = 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vMes & " mes" ElseIf vMes > 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vMes & " meses" End If If vDia = 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " día" ElseIf vDia > 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " días" End If End Function
2º/ Guarda los cambios en el módulo y ya tendrás la función accesible desde toda tu aplicación.
¿Cómo la usas? Pues depende un poco de lo que quieras (supondré que hay un campo en al tabla que se llama FNac):
1º/ Puedes hacerlo en una consulta, creando el campo Edad:
Edad: fncEdadDetalle(FNac)
Y luego usar esa consulta para hacer formularios o informes
2º/ Si no te interesa (que no debería, por ser un dato cambiante) guardar la edad en la tabla, puedes añadir un cuadro de texto a tus formularios/informes y como origen de control le pones:
=fncEdadDetalle(FNac)
3º/ Si por lo que sea te interesa guardar el valor en la tabla (en un campo Edad), en el evento "después de actualizar" del campo FNac, le generarías el siguiente código:
Private Sub FNac_AfterUpdate() Me.Edad=fncEdadDetalle(Me.FNac) End Sub
Si no te interesa que ponga la edad en días, si no se llega al mes de edad, simplemente quita en la función las siguientes lineas:
fncEdadDetalle = "0 días" 'Si es menor de un mes, calculas la edad en días If vAño = 0 And vMes = 0 Then vDia = DateDiff("d", FechaNac, Date) If vDia = 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " día" ElseIf vDia > 1 Then fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " días" End If
@Sveinbjorn El Rojo hola. Que tal, si lo que deseo es que tengo una base de datos de pacientes y deseo calcular la edad en un solo cuadro de texto que diga en años y meses. En mi tabla tengo un dato de FN_paciente y otro edad_paciente. Solo calculaba la edad por una macro pero la base también tiene niños de menos de un año y sale 0 de edad.Por cierto, si necesito que se grave en una tabla a pesar que sea cambiante. Porque los expedientes se fijan en el año que tenia cumplido al momento de la atención. ¿Debería poner los nombres tal cual ud me los esta dando? He intentado como ud me dijo pero me sale error
Vamos a ver, la función la has de poner tal cual ( o con los ajustes que indico al final)
Cuando la llames, has de usar el nombre de tu campo (Fn_paciente), y no FNac, que era solo un ejemplo.
Tener en la tabla el campo edad_paciente es totalmente innecesario y además menos eficiente, pues tendrás que estar actualizándolo cada día, lo que te obliga a usar consultas de actualización, o recordsets...
La edad puedes calcular y mostrar en una consulta con los mismos campos de la tabla, mas un nuevo campo con la edad, y usar esa consulta para tus formularios e informes en vez de la tabla. O bien puedes poner cuadros de texto en tus formularios e informes en los que se muestre la edad. Ambas opciones las tienes explicadas en mi anterior respuesta.
Gracias por tu recomendación. En una consulta me sale sin problemas los años y los meses. Tambien, Hice un cuadro de texto en el mismo formulario y funciono a la perfección.
Es cierto, lo que expresas que es innecesario tener en un tabla la edad. Pero ocupo saber en que edad se atendió el paciente. Los niños menores de un año se ven hasta 10 veces en el año y si es cambiante la edad no pudo saber en que mes de edad se atendió.
Tengo un formulario que son los datos generales del paciente (nombre, edad , dirección, identidad), luego abajo un tipo de subformulario con las atenciones que ha tenido cada paciente (los diagnósticos, la edad de atención y la fecha de atención, etc.) y allí manualmente debo poner la edad actual. Si tan solo también pudiera aplicar la edad de forma automática. Esta edad del subformulario de atenciones va a otra tabla que se llama ATENCIONES y allí es fija e incambiable.
Tengo problemas con el código en el evento "despues de actualizar" en campo FN_paciente
Private Sub FNac_AfterUpdate() Me.Edad=fncEdadDetalle(Me.FNac) End Sub
No me lo envia al campo edad_paciente. Lo cambie a esta forma, ud me dira si esta mal, pues son los nombres de mis tablas.
Private Sub FN_paciente_AfterUpdate() Me.Edad_paciente=fncEdadDetalle(Me.FN_paciente) End Sub
Si realmente los cuadros de texto del formulario se llaman así, el código:
Private Sub FN_paciente_AfterUpdate() Me.Edad_paciente=fncEdadDetalle(Me.FN_paciente) End Sub
es correcto.
La única explicación es que esos no sean los nombres. Lo puedes comprobar si sacas las propiedades de cada uno y te vas a la pestaña "Otras", propiedad "Nombre"
Sveinbjorn El Rojo hola: He podido sacar bien los meses y años, en el formulario, pero cada vez que cierro y vuelvo a entrar sale escrito en el campo #¿Nombre? .
Luego vuelvo escribir el origen del campo en diseño y vuelve a salir sin problema, pero al cerrar el formulario y la base, nuevamente lo tengo que volver a hacer para echarlo a andar. ¿Sabes por que? ¿Cometí algún error?
Pues no tengo ni idea, y lo que dices me suena muy, muy raro... Si el valor se lo vas a dar por código, asegúrate que en el origen de control del cuadro de texto (propiedades->Datos->origen de control) no tengas nada puesto, o si lo tienes, que sea un campo de la tabla/consulta sobre la que haces el formulario.
- Compartir respuesta
Comentario borrado por el autor - El Totorron
Comentario borrado por el autor - El Totorron
@julian , en realidad quería un solo cuadro que diga años y meses. Gracias por la info - El Totorron