Filtrar un formulario por los datos de un subformulario

Tengo una tabla de obras (literarias) que mantiene tres relaciones de varios a varios con una tabla de nombres.

Cada tabla cuenta con un campo numérico único y se relacionan mediante tres tablas relacionales distintas, porque un nombre puede ser autor, dibujante o traductor de distintas obras. Y una obra puede tener varios autores, dibujantes o traductores.

Sobre esta base, he creado un formulario obras, basado en todos los campos de la tabla obras, con tres subformularios que muestran (si los hay) a los autores, dibujantes y traductores de cada obra.

Es decir, lo que veo en el formulario al ir pasando de obra en obra es algo así:

Obra n.º 1 - Autor: Nombres n.º 1 y n.º 2 - Dibujante: no tiene - Traductor: Nombre n.º 3

Obra n.º 2 - Autor: Nombre n.º 3 - Dibujante: Nombre n.º 4 - Traductor: no tiene

Mi duda es si puedo, en el subformulario traductores, por ejemplo, seleccionar a un traductor concreto y, sobre ese dato, construir un filtro que haga que el formulario obras me muestre solo las obras traducidas por ese traductor concreto.

Si es posible, cómo podría hacerse. O si, como mi nivel de Access no pasa de medio/bajo, parto de un error de diseño que debería corregir para conseguir lo que necesito.

He logrado solucionarlo construyendo el formulario obras a partir de una consulta que incluya las relaciones con la tabla nombres, pero entonces no consigo evitar obtener obras repetidas, lo que no puede ser:

Obra n.º 1 - Autor: Nombres n.º 1 y n.º 2 - Dibujante: no tiene - Traductor: Nombre n.º 3

Obra n.º 1 - Autor: Nombres n.º 1 y n.º 2 - Dibujante: no tiene - Traductor: Nombre n.º 3

Obra n.º 2 - Autor: Nombre n.º 3 - Dibujante: Nombre n.º 4 - Traductor: no tiene

1 Respuesta

Respuesta
1

Te digo mi opinión, que no tiene porqué convencerte. Lo importante es la obra, joder parezco un crítico, personas que intervengan hay muchas. Hasta algún político "escribió" un libro. ¿Cuántos "negros" hay detrás?.

Crearía una tabla Obra, con los campos que hiciera falta, por ejemplo, Categoría, FechaCreación, etc con un campo clave, vamos a llamarlo, IdObra, y otra tabla Autores o como quieras llamarla con los campos que identifiquen a una persona y que intervención tuvo en ella. Con un campo Idobra numérico, para relacionarlo con el idObra de la tabla Obras, en una relación UNO(Obras) a VARIOS(autores). ¿Que la obra la ha hecho sólo 1 bendito sea Dios, ¿Que la han hecho varios, pues lo mismo. Con ellas crearía un formulario con subformulario.

Luego, supongamos que quieres saber en cuantas obras ha intervenido una persona determinada, pues o bien, en ese mismo formulario o en otro puedes poner algo como

Me.recordsource="select * from Obras where ....

Ó construir una consulta y poner debajo del campo nombreautor, en la casilla Criterios

Como forms! Obras! Autores.form! Nombreauto. REn fin que hay mil formas de hacerlo.

Gracias por tu respuesta.

Y tienes razón. Hay muchas formas de hacerlo, pero antes de plantearme un cambio semejante querría convencerme de que lo que me interesa no es posible.

A estas alturas tengo más de 14.000 obras catalogadas. Además, la base es un poco más complicada de lo que contaba en mi pregunta. La tabla obras se relaciona también con la de los volúmenes en que se contienen (de estos hay más de 3.000), así que un cambio de diseño tan radical me echa un poco para atrás.

Saludos

No sé como está construida pero así, a bote pronto, la tabla Obras podría ser

IdObra(Autonumérico) quien dice Idobra, dice NumObra, etc lo que sea que identifique a un registro único

NumVol(aquí pondría un combinado) para elegir 1, 2, 3, etc

NombreObra

Dimensiones, si hay cuadro

Biblioteca,

Etc

Ahora tengo que salir a hacer cosas importantes(comprar el pan y sacra al perro) pero cuando vuelva te preparo un ejemplo, y desde que Larry Tesler inventó lo de cortar y pegar( lo mejor que se ha hecho nunca para la programación) no hay cosas imposibles.

Yo no tengo perro y por eso he podido dedicar estos días a mejorar las funcionalidades de la base, pero espero que la pandemia no dure tanto como para que me dé tiempo a rehacerla por completo :-)

La estructura de la base, un poco simplificada, es la siguiente:

Tabla volúmenes.

Tabla obras.

Tabla nombres.

Las dos primeras tienen los datos que son únicos de cada obra y volumen.

La tabla nombres no tiene más que nombres, fragmentados en nombre, apellidos, seudónimo, etc.

Una consulta sobre la tabla nombres construye mediante campos calculados los nombres completos y una macro evita que se creen nombres completos repetidos.

Luego, hay tablas auxiliares para, colecciones, sellos editoriales, idiomas, criterios de clasificación, etc., con una relación de uno a varios con las tablas volúmenes y obras. Una obra, por ejemplo, solo se ha escrito en un idioma, pero no todas las obras se han escrito en el mismo idioma.

Entiendo que lo que propones es sustituir la relación varios a varios de las obras con sus autores, por ejemplo, por una relación uno a varios de este tipo:

Obra 1: Autor 1 y Autor 2

Obra 2: Autor 1 y Autor 3

Pero, como la Obra 1 se relaciona con los autores 1 y 2, y el autor 1 se relaciona con las obras 1 y 2, sigo teniendo una relación de varios a varios y el problema que planteaba al principio:

Seleccionar al autor 1 y que la tabla obras se filtre por ese autor.

No hagas caso a los nombres pero si tengo una tabla Obras, con IdObra, NombreObra, biblioteca, etc...(aprovecho datos de la base Neptuno, que fué de lo mejor que hizo Microsoft)

Otra tabla Autores, ya te dije que no te fijes en los nombres, con IdAutor, Autor, Ciudad, Pais, etc.

Por comodidad he construido una tabla Labores donde se muestran los diferentes ídem que pueden realizar.

Y por último una tabla Intervienen con Idobra(numérico), Idautor y QueHace.

Con Obra ye Intervienen hago un formulario con subformulario de forma que

Selecciono la biblioteca. En el subformulario

Y luego lo que hace en la obra

Cuando haya rellenado varias obras, en un formulario cualquiera, no tiene porque ser uno aparte, pero para el ejemplo

Si elijo a Anabela

Y la única relación que hay es

Es uno a varios

Muchas gracias por la información y la claridad, porque lo he entendido a la primera :-)

Tengo que reflexionar si puedo aplicar esta solución, porque en mi caso hay una relación previa (la más importante) entre obras y volúmenes, que me obligaría a crear una tabla intervienen de 4 campos:

IDObra

IDVolumen

IDNombre

QuéHace

Aunque el campo QuéHace solo tendría 3 valores posibles (autor, dibujante, traductor) tengo que calcular si una relación basada en 4 campos, en vez de varias relaciones basadas en 2, resulta manejable y, sobre todo, si podría dar de alta o editar obras y volúmenes sin cargarme nada.

En todo caso, al margen de que tu diseño parece más sencillo, me gustaría saber si hay solución al problema inicial: filtrar un subformulario (lado 1 de la relación) por los datos de un subformulario (lado varios de la relación).

Gracias

Puedes probar a hacer una copia de tu base y "rehacer" cosas en ella. No perderías nada. Para pasar valores de una tabla a otra tienes las consultas de actualización, la de datos insertados. Aunque personalmente prefiero el código Vb y tienes, por ejemplo

docmd.runsql"insert into Obras(idvolumen) select idvolumen from Volumens where....

o

Docmd.runsql"update Obra set idvolumen =.......where.....

Si ambas tablas Obras Y Volumenes están relacionadas no deberías tener problema ninguno.

Respondiendo a la pregunta que hacías, por poder se puede, desde el propio formulario. Mira, si tengo el formulario Compras( no le has caso a los nombres), donde puedes ver que hay tres registros. El yogur sólo está en los registros 1 y 3

Cuando en el combinado de arriba elijo el yogur

Automáticamente 

Puedes ver que me muestra que el yogur se vendió en la factura 111 y en la 333

Quiero decir con eso, que hacer se puede hacer lo que se quiera, con más o menos trabajo, sí, pero se puede hacer. Lo que no te aconsejaría sería filtrar en el mismo formulario Compras.

Muchísimas gracias de nuevo por la explicación.

Pero, ¿cómo solucionarías el problema si los yogures perteneciesen a dos categorías simultáneamente: lácteos y refrigerados?

Un formulario compras único (no continuo) donde aparece cada producto con sus características: el yogur en este caso.

Y un subformulario categorías en el que se dijese que el yogur pertenece a las categorías lácteos y refrigerados. Y quisieses hojear tu base de datos de productos, pero solo los que son refrigerados: yogur, leche fresca, pizza no congelada, anchoas en salazón, etc.

Eso es lo que me gustaría resolver

Da exactamente igual. En la tabla Productos puedes poner los campos que quieras, Categoría, lote, presentación y en el combinado puedes poner, en el origen de la fila los "filtros" que quieras y que muestre una, dos, tres columnas, etc. Por ejemplo, y siguiendo con el yogur, en la tabla podrías poner

IdProducto, Categoría, Marca, producto, tipo, tamaño, precio

1                   Lacteo       Danone   yogur    blanco     125 cc     1€

2                   Lacteo      Danone    yogur   Frutas       125          1,5€

Y luego en el combinado que muestre, por ejemplo en tres columnas

Yogur Danone Blanco

Yogur Danone Frutas

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas