Poner en un formulario access el dato de un campo de otra tabla

Tengo un formulario llamado [TIEMPOS CONSULTA] desde el que voy metiendo los datos en una tabla llamada [TIEMPOS]. En dicho formulario quería insertar un cuadro de texto que a medida que fuera metiendo los tiempos, me pusiera en él el campo [CIERRE_META] de otra tabla llamada [CATEGORIAS]. Imagino que será con DLookup pero el problema que tengo es que esas dos tablas no tienen relación directa por lo que no sé como puedo hacer. Os anexo las relaciones de las tablas, a ver si me podéis ayudar.

1 respuesta

Respuesta
2

DLookup puede buscar datos en tablas/consultas no relacionadas, solo has de indicarle el criterio para que te localice un registro determinado (el tercer parámetro de la función), si no lo haces, te devolverá el valor del campo indicado del primer registro.

Perdón que no había subido la foto de relaciones. Yo lo que quiero es que al meter el [DORSAL] en la tabla [TIEMPOS] me ponga en mi cuadro de texto el campo [CIERRE_META] de la tabla [CATEGORIAS].

Perdón de nuevo no es al meter [DORSAL] en la tabla [TIEMPOS] es al meter [DORSAL] en mi formulario [TIEMPOS CONSULTA].

De nuevo te digo, para usar DLookUp no hace falta que las tablas estén relacionadas, simplemente has de decirle de qué registro concreto quieres el dato, o te cogerá el primero de la tabla.

Por ejemplo, si quieres el valor del campo "Cierre_meta" del primer registro de la tabla Categorías, pondrías:

Me.CIERRE_META=DLookUp("Cierre_meta","Categorias")

Como supongo que no es el caso, y tendrás más de un registro en "Categorias", tendrás que especificar de qué registro lo quieres, indicando el orden, la categoria... (cómo sabes a qué categoría corresponde cada tiempo lo sabes tu, yo no... que desconozco tu formulario).

Por ejemplo, si en tu formulario estás metiendo tiempos de la categoría 50:

Me.CIERRE_META=DLookUp("Cierre_meta","Categorias","[Categorías]=50")

Como idea, te diré que puedes poner como criterio el resultado de otro DLookup, y usar uno para buscar la categoria a la que corresponde el dorsal activo y eso como criterio para buscar el tiempo:

Me.CIERRE_META=DLookUp("Cierre_meta","Categorias","[Categorías]=" & DLookUp("Categoria","[Datos Prueba]","Dorsal=" & Me.Dorsal))

¡Ojo! Todo esto suponiendo que tanto Dorsal como Categorias son numéricos, si no, ya sabes cómo iría...

Buffff, gracias pero no doy dado con la solución Sveinbjorn … te explico y pongo código a ver que hago mal, me imagino que los # de las fechas o algo así será, pero no doy encontrado solución. Yo lo que pretendo es que según inserte una línea en un formulario con el campo DORSAL me ponga la HORA_LLEGADA (eso lo hace), me abra y me cierre la consulta clasificaciones (igual ni hace falta yo lo quiero para que me refresque el campo TIEMPO de dicha consulta). Quiero que en el cuadro de texto CIERRE me ponga el TIEMPO pero no me pone nada, si pongo otros campos de esa consulta si me los pone sin problema, por ejemplo NOMBRE Y APELLIDOS o CATEGORÍAS.  (Ya se que no debía poner esos nombres, la tengo hecha de hace tiempo).

Nota: cree la consulta CLASIFICACIONESOK sobre la consulta CLAFICIACIONES por si estaba ahí el problema ya que TIEMPO era un tiempo calculado (TIEMPO: [hora_salida]-[hora_llegada]).

Private Sub Form_AfterInsert()
Hora_llegada = Now
DoCmd.OpenQuery "Clasificaciones"
DoCmd.Close acQuery, "clasificaciones", acSaveYes
Cierre = DLookup("[tiempo]", "[clasificacionesok]", "[DORSAL]=" & Me.Dorsal)
End Sub

Si en la consulta "clasificacionesok" tienes los campos "tiempo" y "DORSAL", y éste es numérico, y en tu formulario tienes un control llamado "Dorsal", la expresión es correcta y tendría que funcionarte.

Lo que yo no haría sería poner ese código en ese evento del formulario, sino que lo haría en "después de actualizar" de un campo, por ejemplo "Dorsal".

Disculpa por tardar en contestar Sveinbjorn. A ver … después de hacer cientos de pruebas, pensar que era un problema de formatos etc. llego a hacer comparaciones en el mismo formulario con el siguiente código:

Private Sub Dorsal_BeforeUpdate(Cancel As Integer)
Nombre = DLookup("[NOMBRE]", "[DATOS PRUEBA]", "DORSAL=" & Me.Dorsal)
Tiempo = DLookup("[TIEMPO]", "[CLASIFICACIONESOK]", "DORSAL=" & Me.Dorsal)
End Sub

El cuadro de texto NOMBRE funciona a las mil maravillas sin problema ninguno, en diferentes partes del formulario al introducir el número de dorsal.

El cuadro de texto TIEMPO funciona sólo cuando repito el número de dorsal al introducir datos en el formulario.

Es como si en la expresión estuviera poniendo que el DORSAL del formulario tiene que ser igual a Me.Dorsal también del formulario. ¿Porqué entonces en nombre no aplica lo mismo?

En fin ... no me entero ni para atrás ;( creo que esto no es lo mío...

Solo puedo hacer suposiciones, porque no conozco tu BD, pero si el origen del formulario es la tabla Tiempos, y la consulta (supongo que lo es) ClasificacionesOk toma datos también de la tabla Tiempos, no deja de tener sentido que no te encuentre el tiempo, porque el registro aún no está grabado, y poner el código en un evento "Antes de actualizar", tampoco ayuda...

Sugerencias, pon el código en "después de actualizar" y no en "antes de actualizar" y si eso solo no resuelve el problema, fuerza un guardado antes de correr los DLookUp()

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas