Selecciona datos de un combo según resultado edad

Me surge la siguiente duda que no consigo resolver.

Trabajo en Acccess 2003

Tengo una tabla con los campos idInfantil, Niño/a,FeNace, Edad y Rango

El Rango es un cuadro combinado con los campos "0 a 5 meses", "6 a 9 meses", 10 a 12 meses"...

Al insentar "FeNace" me devuelve la edad en meses, hasta ahí bien.

Lo que quiero es que si el resaltado de los meses es por ejemplo "7" que me inserte en el campo "Rango" el resultado "6 a 9 meses"

Lo he itentado haciendo una macro en el campo "Edad" con la opción después de actualizar para que

El criterio del rango quede seleccionado en el campo.

Puse condiciones según el campo a elegir

[edad]>=0 y [edad]<=5       estblecer valor       [Edad]    expersión  "0 a 5 meses"

[edad]>=6 y [edad]<=9      establecer valor      [Edad]    expresión   "6 a 9 meses"

Y así sucesivamente

Pero no hay forma

Una

1 respuesta

Respuesta
2

En el formulario en el que introduces los datos a la tabla, en el evento "después de actualizar"del campo "FeNace" le generas el siguiente código:

Me. Recalc
Select Case Me.Edad
Case 0 To 5
Me.Rango="0 a 5 meses"
Case 6 To 9
Me.Rango="6 a 9 meses"
Case ...
'Y así con el resto
End Select

En vez del Me.Recalc, puedes aprovechar para poner ahí la fórmula que te calcula la edad.

Muchas gracias, 

Ha sido una respuesta perfecta

Un abrazo

Buenas,

Referente a esta pregunta.

Cómo podría automatizar el rango según vayan pasando los meses, de manera que un niño que esta en el rango de 0 a 5,99 y entra en el rango de 6 a 8,99,  cambie el rango bien al abrirse el formulario, (que es un subformulario)

Private Sub Fe_Nace_AfterUpdate()
Me.Recalc
Select Case Me.Texto23
Case 0 To 5, 99
Me.Rango = "0 a 6 meses"
Case 6 To 8, 99
Me.Rango = "6 a 9 meses"
Case 9 To 11, 99
Me.Rango = "9 a 12 meses"
Case 12 To 17, 99
Me.Rango = "12 a 18 meses"
Case 18 To 23, 99
Me.Rango = "18 a 24 meses"
Case 24 To 35, 99
Me.Rango = "2 a 3 años"
Case 36 To 1000000
Me.Rango = "mayor de 3 años"

End Select

Otra duda: Por que me puede fallar el calculo del rango cuando con el formulario abierto que alberga el subformulario de los rangos y sin embargo sólo desde el subformulario abierto independiente funciona perfectamente

La edad la calculo en un campo de texto a través de

=Int((Fecha())-[Fe_nace])/30

Muchas gracias

OK, lo primero, si quieres mejorar un poco tu código, lo puedes escribir así:

Private Sub Fe_Nace_AfterUpdate()
Dim laEdad as Integer
laEdad=Int((Fecha())-[Fe_nace])/30
Select Case laEdad
Case Is <6
Me.Rango = "0 a 6 meses"
Case Is <9
Me.Rango = "6 a 9 meses"
Case Is <12
Me.Rango = "9 a 12 meses"
Case Is<18
Me.Rango = "12 a 18 meses"
Case Is<24
Me.Rango = "18 a 24 meses"
Case Is <36
Me.Rango = "2 a 3 años"
Case Else
Me.Rango = "mayor de 3 años"
End Select

Porque verás:

1º/ al usar la función Int() en el cálculo, el resultado va a ser siempre un número entero, y ya no tiene mucho sentido que uses decimales para establecer los intervalos. En su lugar, puedes usar la sintaxis que te indico ahora.

2º/ No te hace falta definir un intervalo que vaya hasta el 100000, para eso está el "Case Else", que se ejecutará cuando no se cumpla ninguna otra condición del Select.

3º/ He sustituido el Me. Recalc por la fórmula por si tarda en actualizarse el cuadro de texto y no te toma los valores correctamente (además que va a ser más rápido)

En cuanto a la duda en sí, has de poner el mismo código en el evento "al activar registro" del formulario (o subformulairo) en el que tengas el campo Fe_nace. Otra opción es llamar al código existente desde el mismo evento "al activar registro", así:

Private Sub Form_Current()
Fe_Nace_AfterUpdate
End Sub

De esta forma, cada vez que entres en un registro, se te actualizará el rango automáticamente.

Por último comentarte que cada vez estoy menos en esta web. Si quieres consultarme nuevas dudas, puedes hacerlo en el foro que co-administro: https://nksvaccessolutions.com/Foro/ 

Muchas gracias por tus aclaraciones.

Pero hay algo que no me funciona, me da este error.

El campo donde debería salir la edad es "Edad", he probado a cambiar "laEdad" por "Edad" en el código pero sigue dando el error de la fecha. Y si cambio "Fecha" por "Ahora" en el código resalta la palabra "Ahora".

¿Qué falla?

Gracias nuevamente

No me fijé en que la expresión la tenías en un control (cuadro de texto), y al pasarla a VBA hay que usar las funciones con su nombre en inglés. Solución: Cambia el Fecha por Date y listo:

laEdad=Int((Date())-[Fe_nace])/30

Buenas tarde, 

Ya me sabe mal hasta preguntar, pero no se que es lo que falla.

Si pongo esto en al cargar del subformulario que es donde creo que tiene que ir

Private Sub Form_Current()
Fe_Nace_AfterUpdate
End Sub

Me da este error 

y al depurar me sale esto

Si no pongo nada al cargar el formulario con el subformulario arrancan bien, aunque no se si actualizará los registros según vayan pasando los días.

Muchas gracias de nuevo y perdón por las molestias.

No te preocupes, tu pregunta las veces que haga falta para resolver el "problema".

Por el código de error que muestras, intuyo que solo te salta en aquellos registros en los que aún no hay un valor en el campo Fe_Nace y por eso no puede hacer los cálculos. Si estoy en lo cierto, la solución es mu sencilla, tanto como añadir una línea al código (la que te pongo en negrita):

Private Sub Fe_Nace_AfterUpdate()
Dim laEdad as Integer
If IsNull(Me.Fe_Nace) Then Exit sub
laEdad=Int((Date())-[Fe_nace])/30
Select Case laEdad
Case Is <6
Me.Rango = "0 a 6 meses"
Case Is <9
....
End Sub

El evento Form_Current es "al activar el registro", "al cargar" es Form_Load, y son dos eventos distintos: El primero se ejecuta cada vez que se activa un registro, es decir, cuando el registro se carga (al moverte por ellos o al abrir y cargar el formulario). El segundo solo se ejecuta al cargar el formulario después de abrirlo (abrir el formulario es otro evento distinto (Form_Open)), pero no implica para nada (y menos con el código que estamos usando) que se actualicen todos los registros. Sí se podría usar el evento "al cargar" para actualizar todos los registros, pero requeriría una programación diferente y algo más "complicada".

A ver si con esa línea queda solucionado, y si no, o miramos otras opciones, o me haces llegar una copia de la BD (sin datos "sensibles") y miro dónde está el error.

Buenas otra vez

Por fin!!! me funciona

En el Current puse esto, para calcular la edad y que la copiase a la tabla.

Private Sub Form_Current()

Me.Edad = Texto_Edad
Fe_Nace_AfterUpdate

End Sub

Poniendo el campo "Edad" en lugar de "Texto_Edad" que un campo calculado - =Int((Ahora())-[Fe_Nace])/30 - si me deja ver la edad al momento, pero si pongo el campo edad sólo refleja el resultado en registros antiguos, todos los nuevos se quedan en blanco incluso reiniciando la base de datos. Pero bueno, me apaño.

Por cierto, para entrar en : https://nksvaccessolutions.com/Foro/ me dice que no existo si intento recuperar contraseña después de crear perfil porque no deja entrar y si lo intento crear me dice que el email ya existe.

Y muchas gracias por todo, sobre todo por explicar el porqué de las cosas

Carlos

Envía un mail a [email protected] desde el correo que te dice que ya estás registrado y te miro a ver por qué no te deja entrar, y te paso los datos de acceso.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas