Access - Cambiar filtro de una consulta en un evento para subinforme dinámico

 
Vista:
sin imagen de perfil

Cambiar filtro de una consulta en un evento para subinforme dinámico

Publicado por Alejandro (9 intervenciones) el 13/09/2017 10:27:47
Hola a todos, programadores!

Tengo una cuestión que quiero preguntaros sobre access, relacionada con consultas e informes, la cual voy a intentar explicar brevisimamente ya que si te extiendes mucho sueles confundir.

Tengo una tabla, (DNAS), simple, con un montón de campos pero voy a poner los importantes. Como dato os digo que es una tabla de pacientes de hospital (así lo visualizareis mejor). Quedémonos con estos datos:

- ID
- NOMBRE
- EDAD
- SEXO
- DNI
- FAMILY_ID (muy importante)
- OBSERVACIONES (comentario sobre si el paciente tiene enfermedades o no)

*Campo importante el FAMILY_ID, ya que esto es un número que relaciona un registro con otro que puede tener el mismo FAMILY_ID (en la misma tabla), es decir, que por ejemplo todos los registros con FAMILY_ID = 140 corresponden a miembros de la misma familia.

Mi formulario es un control ficha, para los que no sabéis lo que es, es una ventanita con el formulario para visualizar y/o añadir registros, con sus botoncitos de paciente anterior o siguiente, de nuevo registro, un desplegable con los nombres de todos los pacientes para seleccionar uno y ver sus datos, un cuadrito de búsqueda por DNI, etc, todo ello funcionando correctamente, PERO, como es un control ficha, puedes poner pestañas arriba del formulario que te dan acceso a otras ventanas, pero en el mismo formulario, las cuales si por ejemplo estas en el registro 3 y te vas a otra pestaña, se mantiene ese registro 3 ya que no estas saliendo del formulario ni nada, y lo quiero así por lo siguiente:

Lo que yo quería es, en mi control ficha, con 2 pestañas, la primera el formulario con todos los datos a rellenar o para visualizar o modificar, cosa que ya tengo hecha y todo bien, y en la otra pestaña, llamada "Familiares", quería pegar un informe (tipo lista hacia abajo), que me mostrara una lista de los familiares con todos sus datos en horizontal, del paciente que haya dejado seleccionado en la primera pestaña, es decir que tú por ejemplo te vas al registro 5 en la pestaña 1 "Datos paciente" y es pepito gonzalez perez y ves sus datos, y al dar a la pestaña "Familiares", se hiciera un evento que cogiera el campo FAMILY_ID (supongamos el "211"), y aplicara dicha cláusula WHERE a la consulta en la que se basa el formulario, para que siempre que se cambie de registro activo en el formulario, cambie el subinforme que tengo pegado en "Familiares" y así ver en una lista a todos los familiares de pepito gonzalez perez, él inclusíve, en vez de poner un botoncito que diga "Generar informe de familiares" donde sé que sería usando el OpenForm con el filtro que quisiera.

Básicamente estoy intentando que el subinforme que tengo en la pestaña "Familiares" sea dinámico en función del parámetro del FAMILY_ID, aplicando el filtro a la consulta y dando algún tipo de orden de comando para cambiar la propiedad del filtro de la consulta o algo así.

Lo único que había pensado es, que el evento donde tiene que aplicarse el filtro o bien lo pongo cuando se clikea la pestaña "Familiares", o bien en cada botón que me cambie de registro, (paciente siguiente, anterior, el desplegable con los pacientes, el buscador por dni, etc).

Buscando por la red solo encuentro soluciones referidas a generar el informe con el filtro que quiera haciendo lo de OpenForm con filtros, pero lo que quiero es que mi subinforme cambie nada mas cambiar el registro activo. No sé si se podrá cambiar la propiedad filtro de una consulta, o hay que hacer algo raro al crear la consulta, ya que de momento la tengo creada y asociada al informe, pero me suelta todos los registros porque no sé como meter ahi el WHERE "dinámico".

Espero que lo hayáis entendido, normalmente me dicen que se me da bien explicar los problemas pero si necesitais que suba alguna foto y explicarlo con ellas, decídmelo y lo hago, aunque os advierto que en el formulario tengo muchisimos mas campos, lo he simplificado para pedir ayuda.

Muchas gracias de antemano y espero que mi duda sea constructiva.
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
Imágen de perfil de Oscar Pérez
Val: 198
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Cambiar filtro de una consulta en un evento para subinforme dinámico

Publicado por Oscar Pérez (80 intervenciones) el 14/09/2017 10:26:47
Buenas!

Yo lo que haría sería lo siguiente: En el evento change() del control ficha principal (que yo la llamo "Pacientes"), cuando pulses la pestaña "Familiares" genera el código que te cambie el origen del registro del subinforme aplicando el filtro por el FAMILY_ID... Y listo! :P

1
2
3
4
5
6
7
8
9
Private Sub Pacientes_Change()
 
Select Case (Pacientes.Pages(Pacientes.Value).Name) '-> Con esto sabemos la pestaña que has pulsado
Case "Familiares":
     SubInforme.RecordSource=("SELECT * FROM Pactientes WHERE FAMILY_ID=" & Pacientes.Family_ID)
     SubInforme.Requery '-> Quizás no te haga falta pero por si acaso XD
End Select
 
End Sub

Te lo estoy escribiendo todo sobe la marcha y de memoria, supongo que funcionará, con algunas modificaciones...

No me gusta hacer las cosas por los demás, creo que es más práctico dar la idea y que sea el propio programador el que la desarrolle para conseguir lo que necesita.

Saludos!
Óscar.
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

Cambiar filtro de una consulta en un evento para subinforme dinámico

Publicado por Alejandro (9 intervenciones) el 25/09/2017 23:24:49
Hola Oscar.

Antes de nada, agradecerte el código que me facilitaste en el control ficha, para que dependiendo de la pestaña que elijas te ejecute un código u otro. Me parece un código perfecto para aplicar código al cambiar de pestaña. Sin embargo, aún necesito saber una cosa que no consigo sacar y me esta volviendo loco.

Como ya dije, necesito cambiar el origen del registro de dicho subinforme, para que cambie en función del registro actual, o incluso mejor aún, un pequeño buscador que busque por ID (en mi caso es DNA_ID), pero no consigo hacer referencia al maldito informe, en VBA no me lo reconoce, no puedo hacerle referencia, e investigando, he visto un par de cosas para ayudaros a explicar mi problema. He hecho 4 fotos.


FOTO-1-PAGINA-FAMILIARES

En esa primera enseño la pestaña donde esta el subinforme de los familiares, señalo en rojo la pestaña citada y sus propiedades a la derecha, aquí todo bien.


FOTO-2-INFORME-FAMILIARES

En esta, nos metemos dentro de la pestaña, y accedo al subinforme, llamado "INFORME_FAMILIARES", ahí podéis ver en las propiedades que el objeto de origen es un simple informe que tiene ese nombre, que al pegarlo en esa pestaña pues ya es un subinforme. Supuse que éste no es el objeto al que tengo que hacer referencia, pues supuse que tenia que hacer referencia a lo que es el informe informe, el objeto de origen, que es la siguiente foto...


FOTO-3-INFORME

Esta foto es la importante, señalo en un cuadradito rojo a dónde tengo que hacer click y seleccionar las propiedades, y señalo las propiedades en rojo también, donde ahora SÍ tenemos la propiedad "origen del registro", donde aquí pone "FAMILIARES" que es una consulta, es decir que este subinforme tiene el objeto de origen en el informe original, que a su vez esta basado en una consulta. Esta consulta es una que te muestra esos datos que se ven en las fotos, pero en el FAMILY_ID (que está en la consulta pero invisible), depende del cuadro de control FAMILY_ID de la pestaña "FICHAS PACIENTE", es decir que tú en "FICHAS PACIENTE" te vas al registro 4, nombre fulanito tal tal, FAMILY_ID 220, y al cambiar a la pestaña familiares te van a salir sus familiares, vuelves a la pestaña "FICHAS PACIENTE" donde sigue fulanito, pero te vas al registro siguiente, y en la pestaña "FAMILIARES" directamente se actualiza el subinforme y me muestra los nuevos familiares, así que eso esta bien y no he tenido que hacer ninguna referencia a ningún informe, pues supongo que al cambiar de registro la consulta se actualiza con el nuevo FAMILY_ID y por consiguiente se actualiza el informe. Pero la cuestión es que quiero poner un pequeño buscador en el subinforme, donde pongas un FAMILY_ID y se actualice el informe al dar al botón de buscar, por lo que en el evento del botón, tengo que buscar la manera de hacer referencia al informe o al menos a la consulta en la que se basa, y actualizarla con el FAMILY_ID que ponga el usuario, tal como enseño en la foto 4, de a continuación.


FOTO-4-LO-QUE-QUIERO-HACER

El problema es que sigo sin saber hacer referencia al informe, si os dais cuenta, en la foto 3, la anterior a la última, donde enseño el informe original donde te dice que esta basado en la consulta "FAMILIARES", el nombre que le da access es simplemente "Informe", no hay más referencias, pero necesito hacer referencia a este informe pues es aquí donde esta la propiedad "Origen del registro", ¿entendeis?. Yo se hacer todo lo demás en código, es decir, recoger el número que ponga el usuario, hacer el evento en el botón de la lupita, incluso un condicionante para que si el FAMILY_ID introducido no es válido el programa lance un mensaje de error, pero NO SÉ hacer referencia al maldito informe, ni siquiera en el autocompletar me sale, solo puedo hacer referencia al subinforme pero ahí no hay "Origen del registro", en todo caso el "Objeto de origen", ¿Quizás cambiar esta propiedad y poner ahí otro informe parecido pero basado en otra consulta que no saque los datos en funcion del control FAMILY_ID y lo haga del cuadro buscador con lupa?.

Mil perdones por ser tan lioso, este tema me esta dando dolores de cabeza. Aún así me ha servido mucho tu código y almenos el informe se me actualiza cada vez que cambio de registro, pero necesito un buscador ahí que me actualice cada vez que le de al botón de la lupa.

Muchas gracias por el simple hecho de tragaros todo esto.
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

Cambiar filtro de una consulta en un evento para subinforme dinámico

Publicado por Anonimo (3316 intervenciones) el 26/09/2017 02:13:14
Cada objeto en Access tiene un propósito y este propósito lo condiciono el fabricante de la aplicación (Access), no lo puede condicionar el usuario (programador).

La función de los informes no es la de interactuar con el usuario (para eso están los formularios) su misión es plasmar en papel (u otro medio) una información estática.

Creo que se esta persiguiendo un ideal ecologista: si nos equivocamos al imprimir algo en una hoja, en lugar de corregir y volver a imprimir esa renovada información en una nueva hoja, se pretende (y seria el ideal a lograr) que se auto-limpiase la hoja inicial y se pudiera volver a imprimir en ella.

.... lamentablemente eso aun es futuro, en el presente (y es lo que emulan los informes) si sale mal: hay que volver a iniciarlo no 'es reciclable'.
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

Cambiar filtro de una consulta en un evento para subinforme dinámico

Publicado por Alejandro (9 intervenciones) el 26/09/2017 10:41:49
Pero, ¿Con eso quieres decir que no hay una forma en access, de mostrar una lista de los datos de una tabla (solo una, sin relacionadas ni nada), y poner un simple buscador arriba donde meter un dato de un campo que se repita en varios registros, para que se actualice la lista y te muestre solo esos registros?, vamos, el clásico filtro me refiero, como quiero explicar en la última foto. ¿Ni siquiera puedo hacerlo con un subformulario?
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

Cambiar filtro de una consulta en un evento para subinforme dinámico

Publicado por Anonimo (3316 intervenciones) el 26/09/2017 13:30:33
Hay veces que parece que queremos complicar lo sencillo....

Si se le modifican los orígenes de datos o diseño a un INFORME para poder apreciarlos hay que volver a ejecutarlo desde cero

Los que si admiten los cambios dinámicos porque esa es su misión en el mar de los Bytes (sean esos cambios la aplicación de un filtro o un color o se le pide que baile una danza india) son los FORMULARIOS

Con los formularios se manejan/preparan los informes, si no fuera así ¿Qué razón habría para que existiesen dos objetos que hacen ... lo mismo?

Hay que profundizar un poco (un mínimo) en la funcionalidad optima de cada objeto para conseguir optimizar resultados y dejarse de inventos que complican lo SENCILLO.

Lo máximo que se podría conseguir, es que EN TIEMPO DE EJECUCION se le modificase algo al informe, pero una vez que esta finalizado/ejecutado, un cambio EXIGE la re-ejecución de ese informe (lamentablemente esa idea de la ecológica forma de plantearse el futuro aun no ha llegado)
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