Campo en consulta dependiente de intervalo de otra tabla

Siento repetir la pregunta, pero soy nuevo, y la anterior pregunta la ubiqué en otra categoría que no era en MS ACCESS que es dónde debe de estar.

Buenas tardes. Llevo varios días dándole vueltas
al mismo tema y no consigo dar con la solución. Os pongo el ejemplo
concreto para facilitar el entendimiento.
Dispongo de una
Tabla de access "tb_criterios" donde los campos son "Id", "Tmin(d)",
"Tmax(d)", "Criterio(d)" (modificables mediante formulario pertinente,
pudiéndose añadir más filas y cambiar valores). Se trata de criterios
en función de intervalo:
Id Tmin(d) Tmax Criterio(d)
1 0 30 7
2 30 180 14
3 180 360 21
4 365 1.000.000 30
En
Una consulta ("con_mantenimiento_preventivo", procedente de varias
tablas), tengo órdenes de mantenimiento preventivo, con diferentes
intervalos de realización (Intervalo(d), campo calculado) y donde
mediante otro campo calculado sacaría la desviación de la fecha de
realización real respecto a la fecha prevista (desviación(d) campo
calculado).
¿Id Descripción Intervalo(d) Desviación(d) Criterio(d)?
1 Operación 1 15 3
2 Operación 2 45 22
3 Operación 3 720 35
La
Idea es que en función del intervalo de la orden de mantenimiento
(Intervalo(d)), genere otro Campo en la consulta (Criteri(d)), que
resulte de buscar el intervalo dentro del período correspondiente de la
tabla tb_criterios.
Por ejemplo en la Operación 2 como el
Intervalo es 45 (entre 30 y 80), buscaría en la primera tabla y en el
nuevo campo generado en la consulta Criterio (d) pondría 14. De esta
forma veo y genero informes viendo si la desviación es superior al
criterio para ese intervalo.(22>14), luego no sería aceptado.
Esto
Mismo lo he hecho desde un formulario, pero NO ME VALE, porque no puedo
filtrar después, al haberme tenido que generar cuadros de texto
calculados en el propio formulario. Por eso el hacerlo desde la
consulta.
Es un poco extensa la explicación.

Respuesta
1

Te explico cómo puedes hacerlo:

- Abre el editor de VBE (con tu BD abierta pulsa Alt+F11)

- Menú insertar -> Modulo

- Guarda el módulo como mdlBuscaCriterio

- En ese módulo escribes la siguiente función:

...

Public Function BuscaCriterio(interv As Long) As Long
'Declaramos las variables
Dim rst As DAO.Recordset
Dim elCriterio As Long
'Creamos un recordset sobre tb_criterios
Set rst = CurrentDb.OpenRecordset("tb_criterios", dbOpenSnapshot)
'Iniciamos el recorrido de registros
With rst
.MoveFirst
Do Until rst.EOF
'Si el intervalo es mayor que el valor de Tmax nos movemos al registro siguiente
If interv > .Fields("Tmax(d)") Then
GoTo Siguiente
Else
'En caso contrario cogemos el criterio del registro
elCriterio = .Fields("Criterio(d)").Value
'Salimos del bucle
Exit Do
End If
Siguiente:
.MoveNext
Loop
End With
'Asignamos el resultado a la función
BuscaCriterio = elCriterio
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Function

...

- En tu consulta añades un campo calculado. En la primera línea (la correspondiente a "Campo:"), escribes la siguiente expresión:

Criterio(d): BuscaCriterio([Intervalo(d)])

Y ya lo tienes.

Un par de comentarios:

- El sistema se basa en que los datos de tb_criterios estén correctamente ordenados de menor a mayor

- La repetición de valores, si bien no afecta, no te la recomiendo. Es decir, el Tmax(d) de un registro mejor que no sea igual al Tmin(d) del siguiente registro. Esto por si en el futuro necesitas "manipular" algo en base a estos valores. Es decir, que si el Tmax(d) es 30 el Tmin(d) del siguiente registro que sea 31, y no 30.

Aunque creo que no tendrás problemas con la explicación que te he dado te puedes bajar una miniBD que recrea todo lo anterior. En esta BD la tabla TDatos representaría tu consulta de varias tablas.

Este ejemplo está aquí: http://www.mediafire.com/?631yor2kr60gpq3

A ver si te funciona.

Buenas noches neckkito!!

ante todo agradecerte la rapidez de respuesta (increíble!!!) y la fantástica solución que me has dado.

No sólo está perfectamente explicado, sino que te has tomado la molestia de mandarme el ejemplo exacto!!! con lo que sólo he tenido que copiar el módulo del código. Funciona a las mil maravillas.

La verdad es que estoy encantado y agradecido, pues llevaba varios días para solucionarlo. Además, que como te decía,yo lo hacía con cuadros de texto calculados en formularios con muchísimas registros (órdenes de mantenimiento), con lo que no podía filtrar por las que se desviaban (no me valía de nada).....y tardaba muchísimo en sacar el informe asociado!!!...con tu solución es rapidísimo y perfecto....gracias de nuevo!!!

finalizo tema

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas