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

Respuesta
3

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.

1 respuesta más de otro experto

Respuesta
2

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.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas