Mostrar un registro a partir de una lista desplegable

Buenas.
Quería hacer un formulario en el que a partir de un cuadro de lista me muestre los datos de un registro.
Es decir, en vez de tener que introducir algún dato para mostrar el registro, poder seleccionarlo de una lista desplegable.
Gracias de antemano.

En el Capítulo 4 de la Guía de Base, en el subcapítulo Propiedades del formulario > Propiedades de los controles > Listado (cuadro de lista), explica como hacer lo que pretendes.

Puedes acceder al resto de la Guía de Base, así como a otras guías de las aplicaciones, a través de la opción Ayuda > Guías de usuario de cualquiera de las aplicaciones de LibreOffice.

[Editado] Ahora que estoy releyendo tu pregunta, quizá había entendido mal, y en realidad lo que quieres hacer es lo que se explica en el Capítulo 8 Tareas con bases de datos > Filtrado de datos o en el Capítulo 9 Macros > Mejorar la facilidad de uso > Filtrar registros

En primer lugar gracias por tu respuesta.

He leído lo que me comentas y no lo encuentro. No sé si es porque no me entero bien.

Al acceder a mi formulario, en vez de filtrar en la ventana que sale, me gustaría poder elegir desde un listado directamente un ítem, y al elegirlo que me muestre todos los datos asociados a ese registro (q ya tengo configurado).

No sé si me explico bien.

En concreto: tengo una serie de edificios. Cada edificio tiene asociados unos datos concretos en otras tablas (las obras q se hace, presupuesto, tipos de obra, etc.)

Al acceder al form, en vez de que me pregunte un dato del edificio para poder mostrar sus datos asociados, desearía que al entrar en el formulario, pudiera elegirlo desde un cuadro de lista, y al elegirlo me muestre los datos asociados.

Gracias!

Perdón. Soy novato en el foro y le he dado a posible solución, cuando es una consulta.

He encontrado esto en el capítulo 8, que creo se refiere a lo que yo deseo:

…“cómo usar las listas desplegables como un filtro para buscar el contenido de los
campos de las tablas, para que luego aparezcan estos campos filtrados en la sección de
formulario subyacente y pueden editarse.”

Pero la verdad, no entiendo muy bien el procedimiento :frowning:

Agradecería un poco de ayuda

Intentaré explicarte el procedimiento, pero explicar el paso a paso es muy largo para un post como este. Para poder ejecutar el procedimiento, tienes que saber un poco de SQL.

En primer lugar, tienes que darte cuenta de que el formulario que mostrará los datos de los edificios (ya filtrados) no está asociado a una tabla, sino a una consulta editable que además tiene una sentencia WHERE que es la que sirve para filtrar los datos. (la consulta será editable si contiene la clave principal de la tabla).

Para hacer el filtrado, se utiliza una tabla auxiliar, que en la Guía llama Filter. En esta tabla se almacena el Valor que tendrá el campo que vamos a filtrar (en tu caso, creo que el campo a filtrar debería ser el Id de la tabla edificios). Esta tabla auxiliar tendrá un campo ID (clave principal) y otro campo Valor en el que se almacenará el valor a buscar (y que por tanto tendrá que ser del tipo de datos que vamos a buscar)

Para guardar el valor en la tabla Filter se utiliza la lista desplegable. Por tanto la lista desplegable está enlazada al campo Valor de la tabla Filter (y no a los edificios) y obtendrá los datos que se muestran en la lista de donde tú quieras (seguramente tienes que obtener el ID y la descripción de la tabla de edificicios) .

Una vez que hemos guardado el Valor a buscar en la tabla Filter, mediante un botón Buscar actualizamos el formulario que contiene los datos de los edificios, que como hemos dicho antes tiene una clausula WHERE. Esta clausula WHERE debería ser algo así como WHERE "IdEdificio" = Valor.

Como Valor está en la tabla Filter para obtenerlo, tenemos que hacer SELECT "Valor" FROM "Filter por lo que la clausula WHERE quedaría WHERE "IdEdificio" = (SELECT "Valor" FROM "Filter) .

Si has entendido hasta aquí, siguiendo paso a paso la Guía te llevará a como modificar la clausula WHERE para que sea efectiva también cuando no hay datos para filtrar (y por tanto queramos mostrar todos los edificios.

Si te has dado cuenta, el formulario (documento) tiene dos formularios de datos, uno asociado a la tabla Filter y otro asociado a la consulta Edificios, el botón de actualizar pertenecerá al formulario de edificios

Si sigues sin aclararte, puedes añadir un archivo de ejemplo con algunos datos anonimizados de tu tabla, y quizá alguien pueda resolverte el problema, pero ten en cuenta que:
Dale un pez a un hombre y comerá hoy. Enséñale a pescar y comerá el resto de su vida

Muchas gracias!
Sí, sé un poco de sql.
No podré probarlo hasta la semana q viene que tendré algo de tiempo. Cuando lo pruebe comento.
De nuevo gracias!

Prefiero aprender yo, pero hay cosas que no entiendo y no encuentro que lo explique de forma clara en la guía.

Hago la consulta editable correctamente con una lista desplegable (selecciono un edificio^). Ahora se supone que tengo un botón “Buscar”. Pero ahí ya no sé cómo hacerlo, pq al botón solo se puede añadir una macro, no? Y no necesito una macro. Al darle al botón le digo que me recupere las obras que se están haciendo en ese edificio que he seleccionado en la lista desplegable, no?

Lo sé, estoy pegado en esto :frowning:

Mira, lo mejor es que adjuntes un ejemplo de tu base de datos con algunos datos, un par de registros o tres en cada tabla son suficientes (modifícalos para que no haya datos confidenciales). Manda también las consultas y los formularios que has hecho para que veamos cuál es tu idea.
Seguramente así alguien pueda ayudarte, pero explicar el procedimiento aquí es muy difícil.

prueba obras.odb (34.4 KB)

La idea es q al pinchar en Form_Actuaciones, me salga una lista desplegable de los cuales al elegir uno y al darle a un botón me aparezcan en el grid de abajo todas las obras que se están haciendo en ese edificio, y poder modificar los datos de la obra. (es decir, el grid de arriba ya no tiene sentido). Como yo lo tenía es poniendo en criterio en la consulta :nombre, pero es engorroso. Prefiero hacerlo en el form in situ.

Si quiero seleccionar otro edificio, vuelvo a seleccionarlo de la lista desplegable, y al darle el botón me vuelve a mostrar las obras de ese otro edif.

De este modo no tengo que realizar filtrados, ni salir y entrar, etc.

Gracias de antemano por tu paciencia y por la ayuda

tb me valdría un campo de texto para buscar el nombre del edificio (no completo) y que me devuelva los edificios que contengan las letras que he buscado.

en definitiva, mis conocimientos de base no alcanzan a comprender cómo hacer eso sin tener que ponerlo en criterio en la consulta para q mepida el nombre o el código, sino que lo haga en el form in situ

Te anexo la base de datos con (creo) tu problema resuelto.

Para ello, los pasos que he seguido son:

  • En la tabla Filter he renombrado el campo Filter y le he puesto en nombre Texto, para dejar claro que es un campo de texto y sirve para filtrar/buscar campos de tipo texto (varchar, generalmente)
  • He modificado la consulta de búsqueda xpruebas… para que el filtro lo haga en el campo IDcentro, que es el campo en el que se deberían hacer las búsquedas que pretendan un resultado único ya que es la clave y por tanto es único (luego hablaremos sobre el campo codigo)
  • En la consulta, he sustituido las partes ISNULL por COALESCE. La función COALESCE hace lo mismo que ISNULL pero funciona tanto en HSQLDB como en Firebird
  • He creado el formulario 1 Lista desplegable, el cual tiene dos formularios de datos, el MainForm enlazado con la consulta xpruebas… y el formulario Buscar que está enlazado con la tabla Filter, como se ve en la imagen

  • Como se ve en la imagen anterior, la rejilla de datos y el botón pertenecen al MainForm
  • La lista desplegable pertenece al formulario Buscar, está enlazada al campo Integer y obtiene la lista de valores de la tabla Centros, mostrando el nombre del centro, pero el campo que se “guarda” es el IDcentro, que es un entero (y por eso el valor lo pone en el campo Integer de la tabla Filter)

  • El botón de búsqueda, en la propiedad Acción tiene el valor Actualizar formulario

Y creo que no hay mucho más que resaltar.

Por otro lado he creado el formulario 2 Busqueda que en vez de tener una lista desplegable tiene un campo de texto para poner parte del texto a buscar en el nombre del centro.

  • Este formulario se enlaza con la consulta buscar, que es muy similar a la xpruebas…, pero que en la parte WHERE se sustituye el = por LIKE y la concatenación de '%' con el valor a buscar y otra vez '%'.
  • El campo sobre el que se hace la búsqueda es el campo nombrecentro
  • El campo en el que se escribe el texto a buscar esta enlazado con el campo Texto de la tabla filter, porque ahora el valor será texto, y no un entero como en el formulario anterior

El resto es muy similar al formulario anterior.

Espero que con los ejemplos te aclares mejor

Con respecto al campo codigo incumple la segunda forma normal de la reglas para la normalización de bases de datos, porque cada registro puede ser identificado de forma única por el IDcentro o por el campo codigo, es decir, uno de los dos sobra y lógicamente es el IDcentro. Podrías eliminarlo y poner el codigo como clave principal y todo funcionaria perfectamente. Ya se que demasiados “expertos” en bases de datos recomiendan que siempre debe haber un “autonumerico” como ID, pero eso no es correcto. Ciertamente al hacer un índice único con el codigo solucionas parte del problema, pero tienes un campo que no te vale para nada. Aunque se puede hacer, hay que ser consciente de que ya no tienes una tabla normalizada (yo hago esto y lo explico en uno de mis vídeos)

Por otro lado en relación con los índices, más indices casi nunca es mejor. Tener muchos índices incrementa el “trabajo” de la base de datos y no siempre aumenta la velocidad en la obtención de los datos. Casi seguro que no es necesario crear ningún índice manualmente, los índices importantes, es decir, los relacionados con las claves externas, se crean automáticamente. También en el mismo video se explica algunas razones por las que no siempre es bueno tener mucho índices y a las explicadas añado, el tamaño de la base de datos se incremente notablemente cuando hay gran cantidad de índices y especialmente cuando se añaden y borran registros frecuentemente, lo que, al final, termina ralentizando el funcionamiento de la base de datos.

prueba obras.odb (52,7 KB)

¡Ah!, por cierto, ya que estás comenzando, yo te recomendaría hacer la base de datos en un archivo de Firebird externo. Las bases de datos HSQL incorporadas dan ciertos problemas conocidos.
En mi opinión. las ventajas de la base de datos Firebird externa son:

  • Evitan los problemas de las bases de datos HSQL
  • Se pueden transforma muy fácilmente en una base de datos de servidor
  • En el caso de transformarla en base de datos de servidor, se puede conectar a ellas de diferentes maneras: directamente (con el driver interno), con ODBC y con JDBC

Muchísimas gracias!

Seguiré tu consejo. Muchísimas gracias de nuevo!

Estoy probando, y entiendo por fin todo lo que has hecho, pero se me escapa lo siguiente:

  • Me gustaría que no distinguiera may de minusculas, ya que ahora si pongo en búsqueda “ed” no arroja nada, tengo que poner “Ed”. He cambiado el campo “Texto” a VARCHAR IGNORE CASE, pero no funciona. No entiendo por qué, ya que tanto “nombrecentro” de la tabla centros como “Texto” da la tabla Filter están en VARCHARIGNORE CASE.

  • Al volver a entrar en el form busqueda aparece la última búsqueda que he hecho, y me gustaría que al acceder al form siempre estuviera vació. Pero si quito en ese form Añadir, modificar, obviamente no me dejaría escribir en el cuadro de texto buscar.

Qué se me escapa?

Tendrías que hacer algo así WHERE UPPER ( "Centros"."nombrecentro" ) LIKE COALESCE ( ( SELECT ''%'' || UPPER ( "Texto" ) || ''%'' FROM "fILTER" ), UPPER ("Centros"."nombrecentro" ), es decir convertir todo a mayúsculas (o minúculas) en la clausula WHERE (no copies lo que he puesto que lo estoy haciendo de memoria y puede que me haya equivocado, coge el concepto)

Esto es un poco más difícil. Tendrías que usar macros. Por ejemplo, podrías hacer una macro que asignara la cadena vacía al campo de búsqueda y actualizara el formulario. Esto lo puedes ejecutar desde un botón Limpiar y también al cerrar el documento. Investiga un poco, busca la solución en otros temas y si no lo encuentras o sigues teniendo dudas, quizá sea mejor que inicies un nuevo tema con los problemas que te encuentres, utilizar el mismo post para resolver varios problemas diferentes no es adecuado

Gracias de nuevo. Así lo haré. Aquí estoy peleándome.

Una duda:…Por qué no sale con VARCHAR Ignore Case? si guarda el texto en filter may o minuscula y la busqueda se vuelve a hacer mayuscula o minuscula, no debería interpretarl la diferencia, no?
de hecho cuando lo hacía a mi modo poniendo en criterio de la consulta, podía escribir sin que tuviera en cuenta la dif may / min

Pues no te podría decir. No estoy familiarizado con _IGNORECASE

Buenos días. Lo pongo aquí porque creo que es el mismo tema. Si no es así, decidme y abro un nuevo hilo.

Necesito que en ese campo desplegable aparezca tb, además del nombre del edificio, un campo de otra tabla (cuyo campo está enlazado con la tabla actual)
image

en la imagen se aprecia que pone el nombre , un guión, y después un campo de la misma tabla (q es el id del campo de la otra tabla que quiero incluir).

He probado de todo y buscado información, pero me temo q mis conocimientos de sql superan lo q intento

Sí, sería mejor comenzar un hilo nuevo “Mostrar campos de dos tablas diferentes en una lista desplegable” o algo así, que no se si seremos capaces de solucionar :wink: