Consulta ultima lectura de contadores

Dudas sobre Tablas, Consultas, Formularios, Informes...
abadmi
Nivel 1
Mensajes: 9
Registrado: Dom Abr 09, 2017 2:06 am

Consulta ultima lectura de contadores

Mensajepor abadmi » Vie Ago 31, 2018 12:45 am

Buenas noches.

Planteo el siguiente problema que tengo, por si alguien me puede ayudar.

Tengo las siguientes tablas:
Contadores de agua: idContador, idContrato
Terceros: cif, razonSocial
zona(n): id, direccion
Contratos, por zonas - Zona1, todos los contratos de esta zona tienen un id inferior a 1000 y Zona2, todos los contratos de esta zona tienen un id superior al 1000
Las dos tablas de contratos son gemelas.
Tabla de lecturas: idLectura, idContrato, trimestre, año, lectura_anterior, lectura_actual, fecha_lectura.

Necesito sacar resúmenes...
He hecho la unión de las tablas con la siguiente consulta SQL

SELECT tblContadoresAgua.IdContador, tblContadoresAgua.IdContrato, tblTerceros.cif,
tblTerceros.razonSocial AS, zona1.direccionSuministro
FROM tblTerceros RIGHT JOIN (zona1 INNER JOIN tblContadoresAgua
ON zona1.id = tblContadoresAgua.IdContrato) ON tblTerceros.cif = zona1.cif
UNION
SELECT tblContadoresAgua.IdContador, tblContadoresAgua.IdContrato, tblTerceros.cif,
tblTerceros.razonSocial, zona2.direccionSuministro
FROM tblTerceros RIGHT JOIN (zona2 INNER JOIN tblContadoresAgua
ON zona2.id = tblContadoresAgua.IdContrato) ON tblTerceros.cif = zona2.cif

Con esta consulta obtengo los datos principales de las dos tablas, pero necesito en la misma consulta ver los datos de la ultima lectura realizada.

Ahora tengo:
IdContador - IdContrato - CIF - RazónSocial - direccionSuministro

Y necesitaría:
IdContador - IdContrato - CIF - RazónSocial - direccionSuministro - trimestre - año - lectura_anterior - lectura_actual - fecha_lectura

Siendo los datos: { trimestre - año - lectura_anterior - lectura_actual - fecha_lectura } los correspondiente a la última lectura realizada.

Creo que tendría que utilizar la función DMAX sobre fecha_lectura, pero no se como filtrar por este valor.

No se si lo que estoy pidiendo es muy complicado o quizás muy facil, pero llevo una semana buscando, probando, ... y no lo he conseguido.

Doy las gracias de antemano a quien me pueda ofrecer ayuda.

Un saludo.

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 989
Registrado: Sab Oct 24, 2015 10:12 pm

Re: Consulta ultima lectura de contadores

Mensajepor Sveinbjorn » Vie Ago 31, 2018 9:48 am

Hola,

a efectos didácticos, te propongo la solución "en pasos": primero creas una consulta que te devuelva la última fecha de lectura de cada contador, luego dos consultas que te devuelven todos los datos de esas lecturas, y luego la consulta de unión sobre las dos anteriores, aunque podrías hacerlo todo directamente en la de unión.

El primer paso es crear la consulta que te devuelva la última fecha de cada contador/contrato. Para eso creas una consulta sobre la tabla tblLecturas, seleccionando únicamente los campos idContrato y fecha_lectura. Conviertes la consulta en una de totales, y cambias en la fila "Total" del campo fecha_lectura de "Agrupar por" a "Máx". Te quedará algo así:

Código: Seleccionar todo

SELECT tblLecturas.idContrato, Max(tblLecturas.fecha_lectura) AS MáxDefecha_lectura
FROM tblLecturas
GROUP BY tblLecturas.idContrato;

A esta consulta la llamas, por ejemplo, CAuxUltimaLect.

El segundo paso es crear las dos consultas que te den todos los datos que necesitas. Para eso, creas una nueva consulta sobre las 4 tablas y seleccionas todos los campos que quieres mostrar. Ahora, sin salir de la vista diseño de la consulta, añades la consulta CAuxUltimaLect y creas una doble relación con la tabla tblLecturas, uniendo los campos idcontrato de cada una y fecha_lectura con MáxDefecha_lectura
Te quedará una SQL parecida a ésta:

Código: Seleccionar todo

SELECT tblContadoresAgua.IdContador, tblContadoresAgua.IdContrato, tblTerceros.cif, tblTerceros.razonSocial, zona1.direccionSuministro, tblLecturas.trimestre, tblLecturas.año, tblLecturas.lectura_acterior, tblLecturas.lectura_actual, tblLecturas.fecha_lectura
FROM ((tblTerceros RIGHT JOIN (zona1 INNER JOIN tblContadoresAgua ON zona1.id = tblContadoresAgua.IdContrato) ON tblTerceros.cif = zona1.cif) INNER JOIN tblLecturas ON zona1.id = tblLecturas.idContrato) INNER JOIN CAuxUltimaLect ON (tblLecturas.fecha_lectura = CAuxUltimaLect.MáxDefecha_lectura) AND (tblLecturas.idContrato = CAuxUltimaLect.idContrato);


Guardas esta consulta, por ejemplo como CUltimasZona1.

Haces exactamente lo mismo para la zona 2, y la guardas como CUltimasZona2.

El tercer paso es crear la consulta de unión:

Código: Seleccionar todo

SELECT * FROM CUltimasZona1 UNION SELECT * FROM CUltimasZona2


Y ya deberías obtener lo que quieres.

Te dejo este mini-ejemplo con una única tabla de zonas, para que lo veas en acción.

Un saludo.
Sveinbjorn El Rojo

abadmi
Nivel 1
Mensajes: 9
Registrado: Dom Abr 09, 2017 2:06 am

Re: Consulta ultima lectura de contadores

Mensajepor abadmi » Vie Ago 31, 2018 6:50 pm

Buenas tardes Sveinbjorn.

Lo primero es darte las gracias por dedicarme un rato y darme una solución, esta noche cuando llegue a cas la probaré.

Abusando un poco de tu amabilidad te pregunto: ¿para pasar a entorno VBA?, ya que quiero exportarlo a excel, como referencio esto: "CAuxUltimaLect.MáxDefecha_lectura"

Porque creo, que guardando la primera consulta en una variable, se podría referenciar esta variable. Pero no se como se haría con un campo ALIAS.

Lo dicho muchas gracias y saludos.

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 989
Registrado: Sab Oct 24, 2015 10:12 pm

Re: Consulta ultima lectura de contadores

Mensajepor Sveinbjorn » Vie Ago 31, 2018 8:42 pm

No te entiendo, ¿a qué te refieres con referenciar "CAuxUltimaLect.MáxDefecha_lectura"?
Sveinbjorn El Rojo

abadmi
Nivel 1
Mensajes: 9
Registrado: Dom Abr 09, 2017 2:06 am

Re: Consulta ultima lectura de contadores

Mensajepor abadmi » Dom Sep 02, 2018 9:32 pm

Buenas tardes Sveinbjorn, intentaré explicarme.

Lo que yo pretendía es hacer todo desde código VBA sin tener que guardar ninguna consulta, ya que el fin es exportarlo a excel. Quizás este diciendo una barbaridad...

Por eso al ver el SQL de la consulta grande, esta hace referencia a la consulta que obtiene la fecha máxima de cada contrato y pretendía que todo fuese en una sola consulta.

A lo mejor no se puede hacer todo en uno.

De todas formas muchas gracias por el tiempo que me has dedicado, y aunque con la consulta delante la entiendo, me cuesta mucho hacer algo tan complejo yo solo. Llego hasta donde llego :(

Lo dicho, gracias y un saludo.

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 989
Registrado: Sab Oct 24, 2015 10:12 pm

Re: Consulta ultima lectura de contadores

Mensajepor Sveinbjorn » Lun Sep 03, 2018 9:03 am

Claro que puedes hacerlo en una única consulta. El "truco" está en coger la SQL de la consulta auxiliar y ponerla en vez del nombre de esa consulta en el diseño de las siguientes. Por ejemplo, con las SQLs de mi primera respuesta:

SELECT tblLecturas.idContrato, Max(tblLecturas.fecha_lectura) AS MáxDefecha_lectura FROM tblLecturas GROUP BY tblLecturas.idContrato;

SELECT tblContadoresAgua.IdContador, tblContadoresAgua.IdContrato, tblTerceros.cif, tblTerceros.razonSocial, zona1.direccionSuministro, tblLecturas.trimestre, tblLecturas.año, tblLecturas.lectura_acterior, tblLecturas.lectura_actual, tblLecturas.fecha_lectura
FROM ((tblTerceros RIGHT JOIN (zona1 INNER JOIN tblContadoresAgua ON zona1.id = tblContadoresAgua.IdContrato) ON tblTerceros.cif = zona1.cif) INNER JOIN tblLecturas ON zona1.id = tblLecturas.idContrato) INNER JOIN CAuxUltimaLect ON (tblLecturas.fecha_lectura = CAuxUltimaLect.MáxDefecha_lectura) AND (tblLecturas.idContrato = CAuxUltimaLect.idContrato);

en una única consulta quedaría:

SELECT tblContadoresAgua.IdContador, tblContadoresAgua.IdContrato, tblTerceros.cif, tblTerceros.razonSocial, zona1.direccionSuministro, tblLecturas.trimestre, tblLecturas.año, tblLecturas.lectura_acterior, tblLecturas.lectura_actual, tblLecturas.fecha_lectura
FROM ((tblTerceros RIGHT JOIN (zona1 INNER JOIN tblContadoresAgua ON zona1.id = tblContadoresAgua.IdContrato) ON tblTerceros.cif = zona1.cif) INNER JOIN tblLecturas ON zona1.id = tblLecturas.idContrato) INNER JOIN (SELECT tblLecturas.idContrato, Max(tblLecturas.fecha_lectura) AS MáxDefecha_lectura FROM tblLecturas GROUP BY tblLecturas.idContrato) AS Aux ON (tblLecturas.fecha_lectura = Aux.MáxDefecha_lectura) AND (tblLecturas.idContrato = Aux.idContrato);

Para la consulta de la zona2 harías lo mismo, y luego copiando las dos SQLs creas la consulta de UNION, y ya solo tendrás que copiar la SQL de esa consulta de unión (bueno, de la que hagas para tu BD) y ponerla en tu código VBA.


Te subo de nuevo el archivo con la consulta de totales creada directamente en vista SQL, y si necesidad de las otras consultas (que dejo en la BD para que veas cómo construir las consultas por zonas sin necesidad de tener guardada la consulta auxiliar). Ojo, que he modificado ligeramente el diseño de las consultas (y también por eso dejo CUltimasZona1 y CUltimasZona2, para que lo veas y compares), porque me parece más adecuado en cuanto a las relaciones.
Si borras CAuxUltimaLect, CUltimasZona1 y CUltimasZona2, verás que la de unión sigue funcionado perfectamente.
Sveinbjorn El Rojo

abadmi
Nivel 1
Mensajes: 9
Registrado: Dom Abr 09, 2017 2:06 am

Re: Consulta ultima lectura de contadores

Mensajepor abadmi » Mar Sep 04, 2018 7:58 pm

Buenas tardes Sveinbjorn.

Muchas gracias por tu clase magistral... y disculpa por haber tardado en responderte.

Todo funciona correctamente, espero que llegado el momento de necesitar algo parecido sea capáz de hacerlo. Lo dicho, gracias por esta ayuda y otras que me has prestado indirectamente en otros hilos de otros usuarios.

Saludos.

Caro Navarro
Nivel 2
Mensajes: 25
Registrado: Mar Sep 25, 2018 5:48 pm

Re: Consulta ultima lectura de contadores

Mensajepor Caro Navarro » Mar Nov 06, 2018 7:59 pm

Hola, Sveinbjorn existe la posibilidad de subir nuevamente el ejemplo, ya que este ya no se encuentra disponible... ya que estoy intentando realizar una consulta entre 3 tablas y no he podido,

Muchas gracias

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 989
Registrado: Sab Oct 24, 2015 10:12 pm

Re: Consulta ultima lectura de contadores

Mensajepor Sveinbjorn » Mié Nov 07, 2018 7:29 am

Acabo de revisar los enlaces a los ejemplos de este hilo, y funcionan todos perfectamente para descargar. Quizás te despiste lo de "vista previa no disponible", pero es solo eso, no hay una vista previa para la BD... :roll:
Sveinbjorn El Rojo

Caro Navarro
Nivel 2
Mensajes: 25
Registrado: Mar Sep 25, 2018 5:48 pm

Re: Consulta ultima lectura de contadores

Mensajepor Caro Navarro » Mié Nov 07, 2018 2:22 pm

Si, es verdad... muchas gracias


Volver a “Objetos Access”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados