Access - Operar en rango de registros desde consulta

 
Vista:

Operar en rango de registros desde consulta

Publicado por Alberto (9 intervenciones) el 02/08/2016 17:41:47
Hola!

Estoy intentando, en una consulta, restar al registro actual, el mayor de los últimos 6.

Me explico un poco más. Una tabla con pacientes y otra con sus pesos mensuales. Quiero detectar la mayor pérdida de peso durante los últimos 6 meses, o sea, no me sirve restar el 6º registro anterior, quiero restar el mayor de los últimos 6.

Tengo creada en un campo de consulta la siguiente expresión:

Dif: [Peso]-DMax("[Peso]","Tablapesos", [[P_ID] Between "[P_ID]=" And "[P_ID]-6"])

Donde P_ID es el campo ID de la tabla pesos, y son correlativos por paciente y mes, es decir, del 101 al 112 son los pesos mensuales del paciente 1.

Obtengo error de sintaxis, no se si me estoy liando con las comillas, me falta la el WHERE, o alguna otra cosa.

Muchas gracias, saludos a todos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Operar en rango de registros desde consulta

Publicado por Enrique Heliodoro (1664 intervenciones) el 02/08/2016 17:57:39
Yo crearía una consulta que me devolviese los nn últimos pesos de ese paciente y utilizaría ese subconjunto para localizar el mayor (seria el dominio de esa función).

¿Cómo obtener los nn últimos pesos?...
Una consulta que los ordene por el ID (o la fecha) en forma descendente y que devuelva los últimos nn (aplicando la clausula TOP o acudiendo a las propiedades de la consulta, apartado 'valores superiores' para que lo haga Access)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Operar en rango de registros desde consulta

Publicado por Alberto (9 intervenciones) el 02/08/2016 20:18:29
Es buena idea. Incluso en esa consulta previa podría ordenar por peso descendente y ya tendría el valor máximo que necesito. Pero tengo todos los pesos en la misma tabla, pues tengo 50 pacientes y no voy a hacer 50 tablas. Así obtendría sólo los pesos del primer paciente.
Según lo que propones, tendría una primera consulta para localizar los últimos pesos y una segunda para el resto de cálculos. A no ser que en la primera consulta, pudiera pedir un dato de la segunda, que sería el ID del paciente, que creo que no. Me inclino más por la primera idea, de restar con Dmax, pero sigo atascado en la sintaxis del criterio.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Operar en rango de registros desde consulta

Publicado por Enrique Heliodoro (1664 intervenciones) el 02/08/2016 21:10:26
No se que resultado se obtendría con doble orden, dado que el peso mínimo (o máximo) lo sacaría del conjunto y no de los seleccionados.

La función DMax al igual que el resto de funciones de dominio (según lo indica la ayuda de Access) requiere que los tres parámetros de la función sean cadenas de texto (que se pueden crear en tiempo de ejecución), en lo que esta publicado los dos primeros cumplen la exigencia, el tercero ... ni se aproxima.

Te recomendaría que la generases con valores conocidos y después (cuando funcione) será el momento de cambiar los valores de control por variables.

En base a lo publicado y comentarios posteriores, deduzco que faltan muchas cosas (esto es: que hay mas de lo que se muestra), ello me impide dar ideas que completen lo indispensable para obtener un resultado valido, y si intervienen variables como mes, paciente ..... no estoy muy seguro de que la función consiga resultados fiables o duraderos).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Operar en rango de registros desde consulta

Publicado por Alberto (9 intervenciones) el 03/08/2016 10:39:06
De hecho, mes y paciente son las únicas que intervienen. Podría hacerse una base de datos limpia únicamente con esos dos datos y la duda seguiría siendo la misma.
Una tabla de pacientes, numerados en su campo clave del 1 al 50 y otra con sus pesos, codificado el campo clave de con 4 digitos, los dos primeros el paciente, y los dos últimos el mes. O sea,

0101 Paciente 1, peso enero
0102 Paciente 1, peso febrero
....
0201 Paciente 2, peso enero
....

Pretendo averiguar la máxima variación en los últimos 6 meses, desde hoy, mediante una consulta con la siguiente expresión.

Diff: [Peso]-DMax("[Peso]","Tablapesos","[P_ID]=" & "[P_ID]-6")

Pero por más que cambio las comillas y los corchetes bien obtengo el valor de hace 6 meses o error de sintaxis.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Operar en rango de registros desde consulta

Publicado por Enrique Heliodoro (1664 intervenciones) el 03/08/2016 13:11:22
Construye la 'expresión lógica' con datos conocidos y cuando logres lo que pretendes, sustituye por variables los referentes que sean precisos.

La 'expresión lógica' tiene que ser un texto para Access, así que tendrá que ir (en su conjunto) delimitada por comillas.

Para obtener un subconjunto, habrá que indicar un intervalo y un intervalo delimitado por el signo de la igualdad devolverá un único dato (la igualdad debería descartarse).

En un futuro muy próximo, esa formula dara error, pues el mes de febrero del año 2017 (xx02) seria el referente a comparar contra un subconjunto conformado por xx01, xx12, xx11, xx10, xx09, xx08 (explícaselo a Access).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Operar en rango de registros desde consulta

Publicado por Alberto (9 intervenciones) el 03/08/2016 13:46:06
Gracias de nuevo, ya lo solucioné.

lo del año lo sé, tengo que añadirlo al codigo, aunque como estamos a mitad de año, de momento me sirve.

Para quien le pueda interesar, esta es la fórmula correcta.

Diff: [Peso]-DMax("[Peso]","Tablapesos","[P_ID]>=" & [P_ID]-6 & " AND [P_ID]<=" & [P_ID])

Ayuda prestada por el usuario Sveinbjorn El Rojo

Gracias también a Enrique Heliodoro por su interés
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar