Access 2003 Problema en diseño de informes

He creado una base de datos para gestionar todos los registros de música clásica de una colección particular, de modo que se pueda dar de alta desde una ficha toda la información necesaria para su posterior localización mediante consultas e informes de sus títulos, autores, intérpretes, orquestas, solistas, instrumentos, directores, formas musicales, etc.
Para ello he diseñado un grupo de tablas que pueda contener la información y cubra las necesidades para las posteriores consultas. La tabla principal FONOTECA, que se nutre de las tablas COMPOSITOR, FORMA_MUSICAL, ORQUESTA y DIRECTOR, por otra parte están las tablas SOLISTA e INSTRUMENTO_SOLISTA, que enlazan con FONOTECA por medio de la tabla Solistas que es de enlace y tiene por objeto permitir la relación de "muchos a muchos", necesaria para asignar varios intérpretes e instrumentos a un solo registro, utilizando sólo una tabla única para todos los instrumentos y otra para todos los solistas.
Para manejar sin errores la relación "muchos a muchos", en las consultas se ha estructurado del modo siguiente:
1. Se crea la consulta FONOTECA Consulta1 que implica a todas las tablas excepto SOLISTA e INST_SOLISTA.
2. Se crea la consulta Consulta3 que contiene a la FONOTECA Consulta1 y a las tablas que faltaban SOLISTA e INST_SOLISTA. Esta consulta me sirve para relacionar todos los campos de la base de datos sin ambigüedades.
En los informes y formularios de consulta se ha utilizado la siguiente expresión con el fin de agrupar bajo el cuadro de texto independiente INTÉRPRETES la información de distintos campos, concatenada con comas, paréntesis, etc.
=SiInm(EsNulo([ORQUESTA_ORQUESTA]);[NomSolista] & " " & [ApeSolista] & (" ("+Minús([InstSolista])+")");[ORQUESTA_ORQUESTA] & ", " & [NOM_DIRECTOR] & " " & [APE_DIRECTOR] & " (director) " & [NomSolista] & " " & [ApeSolista] & (" ("+Minús([InstSolista])+")"))
Esta expresión evita que cuando no hay información aparezcan comas, paréntesis vacíos, o palabras viudas como (director) ya que no sería deseable cuando no existe orquesta.
Pero esto, que funciona muy bien, me ha creado un problema que es el motivo de mi consulta. Y es que, cuando hay más de un instrumento solista o de un intérprete solista (que corresponden a las tablas en relación "muchos a muchos") me repite el registro para cada solista. Por ejemplo el disco 14 está repetido porque los intérpretes son Chou-Liang (violín) y Sandra Rivers (piano), me devuelve dos registros con el mismo titulo de obra, uno por cada intérprete.
Poseo obras repetidas porque están ejecutadas por otros intérpretes, como por ejemplo Las Suites para chelo de Bach, interpretadas al chelo por Maurice Gendron, y también por Paul Tortelier y también por Rostyropovich. En estos casos si es necesario que aparezcan los tres registros aunque el titulo de las obras sea el mismo, pero cuando se repite un registro para el mismo titulo de la obra porque hay un pianista y un violín, además de gastar más páginas, confunde enormemente.
Mi consulta: ¿Cómo podría solucionar esto para que no ocurra?

1 Respuesta

Respuesta
1
La respuesta y la solución son complicadas y, además, no se si he entendido bien lo que dices. Lo único que se me ocurre es crear una tabla con la consulta del informe y, con código visual, recorrer la tabla borrando los registros que 'sobren' y ejecutar el informe sobre la nueca tabla.
Pero esto es complicado (relativamente), pues te exigirá conocer el lenguaje en visual basic. Si no lo conoces, podrás hacerlo un poco 'patatero', con una consulta que te cuente las repeticiones y 'borrando a mano' hasta que te queden las que quieres. Todo esto en la tabla temporal que debes de crear.
En primer lugar quiero agradecer la atención que me prestas, el informe al que aplico la expresión que indico en mi pregunta original me devuelve, por ejemplo, esta información:
Disco Titulo Compositor Intérpretes
13 Sinónía Pastoral Beethoven Orq. Fil. Berlín, Karajan(director) Cerkov(violín)
14 Sonata para violín y piano FrancK Arias(Piano)
14 Sonata para violín y piano Frank Cerkov(violín)
Es decir que el disco 13 está bien, la expresión del cuadro de texto "Intérpretes" que menciono toma la información de las tablas orquesta, director, y (a través de la tabla de enlace Solistas) las del ints_Solista y de Intérprete, colocándola toda seguida en el mimo registro, pero porque sólo hay un intérprete solista. Sin embargo cuando en el registro hay más de un instrumento solista, como en el caso del disco 14 me proporciona dos registros, uno para cada uno de los solistas como puedes ver en lugar de devolverme esto:
Disco Titulo Compositor Intérpretes
13 Sinfonía Pastoral Beethoven Orq.Fil.Berlín, Karajan(director) Cerkov(Violín)
14 Sonata para violín y piano Frank Arias(piano) Cerkov(violín)
Y esto para esta muestra, que cuando son 4 los solistas me proporciona 4 registros, y esto, si tenemos en cuenta que tengo más de 1.600 registros, cuando saco un informe, si lo imprimo me consume más folios de los que debería.
Por tanto mi consulta es ¿Se puede depurar de alguna forma el informe para que devuelva la información como propongo? Yo soy novato en esto y la base de datos que he diseñado ha sido tras consultas en muchos manuales y libros al respecto, pero no tengo experiencia en código VBA.
Lo que quieres no es fácil, intenta esto:
En el informe que tienes, agrupar por Disco y en detalle el interprete. En el diseño, en Ver y ordenar y agrupar, le añades Pie de Grupo -- Sí.
Pasas todos campos al pie de grupo, excepto el interprete que dejas en detalle, y le añades un campo de texto, lo llamas TInter, donde vendrán la lista de interpretes, entras otra vez en ver, ordenar... y pones encabezado de grupo a NO.
Solo tienes detalle y Pie, o sea que el informe saldrá algo así:
Orq. Fil. Berlín, Karajan(director) Cerkov(violín)
13 Sinónía Pastoral Beethoven
Arias(Piano)
Cerkov(violín)
14 Sonata para violín y piano Frank
---------------------
Ahora entras en el código y pegas esto:
Dim xx As String, i as integer
Private Sub Detalle_Format(Cancel As Integer, FormatCount As Integer)
Detalle.Height = 0
i=0
End Sub
Private Sub Detalle_Print(Cancel As Integer, PrintCount As Integer)
i=i+1
if i < 4 then xx = xx + interprete + ","
' cambia el 4 por el que quieras.
End Sub
Private Sub PieDelGrupo1_Print(Cancel As Integer, PrintCount As Integer)
TTinter = xx
xx = ""
i=0
End Sub
Para comprobar que todo esta en su sitio, vuelves al informe y con el botón derecho clicas en la barra de detalle y pinchas eventos. Te deben de salir 2, sino ves pinchando (solo hay 3). Lo mismo en la barra del pie.
Ante todo quiero agradecer la atención que me estás prestando, se que lo que pretendo no debe ser sencillo. La idea que me aportas es valiosa aunque no era lo que yo pretendía, ya que mi intención era colocar a todos los intérpretes en una misma línea. Esta solución me los sigue colocando en varias líneas, uno debajo del otro lo que si bien deja más claridad al no repetir el titulo de la obra, no me permite ahorro en el papel (Hablamos de más de 1600 registros).
Por otro lado ha surgido otro problema, y es que muchos de los discos contienen más de una obra, y con esta solución sólo me aparece el titulo de la primera y sin embargo aparecen los intérpretes en varias lineas. Por ejemplo el disco 15 contiene:
Disco Titulo Compositor Intérpretes
15 Danza nº 1 para violín y piano Strauss Arias(piano) Cerkov(Violín)
15 Danza nº 2 Strauss Arias(piano) Cerkov(violín)
15 Danza nº 3 Strauss Arias(piano) Cerkov(violín)
Y con esta rectificación me desaparecen las otras obras, devolviéndome esta información:
Disco Titulo Compositor Intérpretes
                                                                         Arias(piano)
                                                                         Cerkov(violín)
                                                                          Arias(piano)
                                                                          Cerkov(violín
                                                                           Arias(piano)
                                                                           Cerkov(violín)
15 Danza nº 1 para violín y piano Strauss
No aparecen las otras dos obras, aunque sí los intérpretes repetidos.
No se si es que no he sabido seguir las instrucciones enviadas o es que este es el resultado.
Repito mi agradecimiento y ruego disculpes todas las molestias que estoy ocasionando. ¿Puede qué no haya una forma de conseguir lo que propongo? Si es así no me gustaría estar molestando.
Un Abrazo.
Me dices "La idea que me aportas es valiosa aunque no era lo que yo pretendía, ya que mi intención era colocar a todos los intérpretes en una misma línea", efectivamente la idea es valiosa ;-), ¡Pero es que además te los pone en la misma linea!.
Respecto lo segundo, es poner más niveles de agrupamiento, añades Titulo y punto, ahora lo que te he dicho ya no funcionará porque el pie del grupo tiene que ser el del titulo, no el de el disco. Abres eventos en pie de titulo y pegas el código que hay en piedelgrupo1, pero esto pasa por contar por entregas.
La solución que te doy es la que necesitas, quizás haya que 'enguapecerla' un poco, pero te garantizo que funciona a la perfección.
Léete deeeeespaciiiiito y cuidadosamente lo que te pongo en ambos post y aplícalo.
Si has aplicado correctamente te saldrá esto:
Disco Titulo Compositor Intérpretes
15 Danza nº 1 para violín y piano Strauss Arias(piano), Cerkov(Violín),
15 Danza nº 2 Strauss Arias(piano), Cerkov(violín),
15 Danza nº 3 Strauss Arias(piano), Cerkov(violín),
Si te salen arriba los interpretes es por que no aplicas el código.
¡Excelente!
Verdaderamente funcionamuy bien, algo había hecho mal, seguro. Una de las cosas era monbrar el campo de texto Tinter, cuando el el código estaba como TTinter.
Para evitar que aparezca duplicada la información, (En Detalle figuraba el cuadro intérpretes, en la que está la expresión de donde por lo visto toma la información el texto "TTinter", ya que si lo elimino veo que no aparece nada en la sección Pié de Titulo en "TTinter") lo he pasado a oculto.
Veo que si no hay solistas aparece una coma después de la orquesta, y también si todavía no he incorporado información, supongo que será la que figura en esta linea de código: if i < 4 then xx = xx + interprete + ","
Muchísimas gracias por todo. Soy consciente de que sin su estimada ayuda no hubiese podido resolver esto en modo alguno. Me había leído más de 6 tomos sobre Access 2003, de Prentice Hall, Anaya, Rama, etc. y recurrido a la ayuda que presta el programa en línea y no se hacía la luz.
Un abrazo
Efectivamente tu solo ni de coña ;-), finaliza pues.
Excelente solución a un problema, para mí, imposible de resolver.
Quiero agradecer la atención, ingenio, claridad y rapidez en las respuestas y en la solución aportada.
Quedo en deuda.
Cordiales saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas