Cuadros combinados en cascada, y guardar el código en un campo

Necesito desarrollar un formulario con cuadros combinados en cascada, del típico ejemplo:
cuadro1 = País
cuadro2 = Ciudad
cuadro3 = Lugar
Donde el segundo cuadro liste sólo las ciudades pertenecientes al país seleccionado en el primer cuadro y el tercer cuadro liste sólo los lugares pertenecientes a la ciudad seleccionada en el segundo cuadro y además el código se guarde en un campo.

1 Respuesta

Respuesta
1
Supongamos que tenemos una tabla que se llama NombreTabla con los campos País, Ciudad y Lugar.
El cuadro1 se refiere a los países, el cuadro2 a las ciudades y el cuadro3 a los lugares.
En el Cuadro1 pondremos en la acción "Al hacer clic" Procedimiento de Evento ---> Me. Refresch
En el cuadro2 "Al hacer clic" igual que en el cuadro1 Me.Refresch, y en origen de la fila añadiremos una condición where NombreTabla.Pais=form!Cuadro1
En el cuadro3 añadiremos una condición: where NombreTabla.Pais=form!Cuadro1 and NombreTabla.Ciudad=form!Cuadro2
Al final, lo que estamos haciendo es: 1º con Me. Refresch es actualizar el formulario cada vez que hagamos clic en una opción. Después, en los siguientes cuadros combinados seleccionar los registros según la opción que hemos seleccionado en el cuadro o cuadros anteriores.
Saldos, Angeles
Saludos: necesito desarrollar un formulario con cuadros combinados en cascada, del típico ejemplo:
cuadro1 = País
cuadro2 = Ciudad
cuadro3 = Lugar
Donde el segundo cuadro liste sólo las ciudades pertenecientes al país seleccionado en el primer cuadro y el tercer cuadro liste sólo los lugares pertenecientes a la ciudad seleccionada en el segundo cuadro y además el código se guarde en un campo.
Agradezco a quien pueda ayudarme con una explicación detallada. Gracias.
Gracias por tu respuesta Angeles. He seguido las instrucciones que me diste, pero aún no logro que funcione.
El comportamiento de la aplicación es la siguiente: tan pronto se abre el formulario, se abre una ventana con el titulo "introduzca el valor del parámetro" y muestra el nombre del campo donde esta almacenado el país con un campo para capturar el dato. Después sigue abriendo ventanas similares para solicitar los parámetros de los otros cuadros y formularios. Luego de esto envía un mensaje de error indicando que la expresión incluida en el evento produjo un error.
Un dato importante a considerar es que no estoy usando una (1), sino tres (3) tablas, con relaciones de una a muchas:
1. Provincia (país)
2. Distrito (ciudad)
3. Corregimiento (lugar)
Los queries que utilizo son los siguientes:
Cuadro 1 (provincia)
SELECT [provincia].[prov_id], [provincia].[prov_desc] FROM provincia ORDER BY [prov_desc];
Cuadro 2 (distrito)
SELECT [distrito].[dist_Id], [distrito].[dist_prov_Id],[distrito].[dist_ desc] FROM distrito WHERE provincia.prov.id=form!provincia ORDER BY [dist_ desc];
Cuadro 3 (corregimiento)
SELECT [corregimiento].[corr_id], [corregimiento].[corr_dist_id], [corregimiento].[corr_desc] FROM corregimiento WHERE [corregimiento].[corr_dist_id])=[distrito] ORDER BY [corr_desc];
Agradezco enormemente el que puedas orientarme a encontrar la solución.
Saludos cordiales.
Por lo que entiendo a los cuadros combinados les llamas igual que la tablas y eso puede ocasionar algún conflicto de nombres. Prueba a poner nombres de los cuadros que no coincidan con el nombre de las tablas ni con el nombre de los campos.
Hola Angeles,
He seguido tus recomendaciones y ahora los cuadros quedaron así:
Cuadro Combinado1 (cc_provincia)
SELECT [provincia].[prov_id], [provincia].[prov_desc] FROM provincia ORDER BY [prov_desc];
Cuadro Combinado2 (cc_distrito)
SELECT distrito.[dist_id], distrito.[dist_prov_id], distrito.[dist_desc] FROM distrito WHERE provincia.prov_desc=form!cc_provincia;
Cuadro Combinado3 (cc_corregimiento)
SELECT corregimiento.[corr_id], corregimiento.[corr_dist_id], corregimiento.[corr_desc] FROM corregimiento WHERE provincia.[prov_desc]=form!cc_provincia and distrito.[dist_desc]=form!cc_distrito;
El resultado es el siguiente:
1. Al abrir el formulario, se abre una ventana con el titulo "introduzca el valor del parámetro" y muestra el nombre distrito.dist_desc con un campo para capturar el dato.
2. Se abren dos ventanas más con el mismo titulo y mostrando los nombres provincia. prov_desc y formulario! cc_provincia, respectivamente.
3. Al hacer clic en el primer cuadro y escoger una provincia, envía un mensaje de error indicando que la expresión incluida en el evento produjo un error.
4. Al hacer clic en el tercer cuadro, se muestran las ventanas indicadas en el punto 2, luego la indicada en el punto 1 y finalmente otra ventana del mismo tipo, pero con el nombre formulario! cc_distrito.
Agradezco tus orientaciones para resolver esta situación.
Saludos cordiales.
Al referirte a form! NombreCuadro te estás refiriendo al formulario activo en ese momento, si por lo que veo abres distintos formularios los cuadros tendrás que referirlos a los distintos formularios donde están ubicados: Forms! NombreFormulario! NombreCuadro.
Hola Angeles: creo que no me he explicado muy claramente.
Tengo tres (3) tablas en la base de datos:
1. Provincia
2. Distrito
3. Corregimiento
Tengo un (1) formulario llamado: Provincia
Tengo tres (3) cuadros combinados con sus respectivas consultas dentro del formulario:
Cuadro 1 (provincia)
SELECT [provincia].[prov_id], [provincia].[prov_desc] FROM provincia ORDER BY [prov_desc];
Cuadro 2 (distrito)
SELECT [distrito].[dist_Id], [distrito].[dist_prov_Id],[distrito].[dist_ desc] FROM distrito WHERE provincia.prov.id=form!provincia ORDER BY [dist_ desc];
Cuadro 3 (corregimiento)
SELECT [corregimiento].[corr_id], [corregimiento].[corr_dist_id], [corregimiento].[corr_desc] FROM corregimiento WHERE [corregimiento].[corr_dist_id])=[distrito] ORDER BY [corr_desc];
Me da la impresión por lo que me indicas, que tampoco yo he comprendido muy bien el uso del "form!" dentro de la consulta. Agradezco que me des luces al respecto.
En access todos los objetos están ligados a sus colecciones, por ejemplo la colección de formularios es forms y los objetos form, por ello si te quieres referir por ej. a un cuadro combinado Cuadro0 que está en un formulario que se llame por ejemplo formulario1 desde otro formulario (por ej. formulario2) tendrás que referirlo a su colección forms y con su nombre: forms! Formulario1! Cuadro0. Value
Gracias por la aclaración Angeles.
Entonces, según el código sugerido en tu primera contestación:
   NombreTabla.Pais=form!Cuadro1
tendría que ser modificado así:
   NombreTabla.Pais=form!NombreFormulario!Cuadro1
Y llevado al código de mi aplicación, quedaría así:
   provincia.prov_desc=form!provincia!cc_provincia;
¿Estoy en lo correcto?
En vez de form, forms que es la colección a la que pertenece el formulario. Veras, en access todo es objetos y colecciones a las que pertenecen dichos objetos. Para las Bases de Datos, Databases es la colección y Database los objetos que pertenecen a esa colección, para las tablas Tabledefs y Tabledef ... etc. si ponemos form! Cuadro1 nos estamos refiriendo al objeto formulario activo en ese momento y que contiene el Cuadro1. Pero si nos referimos a un cuadro que está en otro formulario entonces en vez de form tendríamos que poner el nombre del formulario referido a su colección forms, que al fin y al cabo es la colección de formularios que tienes en la Base de Datos activa en ese momento.
No se si me explico, cuéntame.
Angeles: si comprendí bien, mis consultas quedarían así:
Cuadro 2 (distrito)
SELECT distrito.[dist_id], distrito.[dist_prov_id], distrito.[dist_desc] FROM distrito WHERE provincia.prov_desc=forms!provincia!cc_provincia;
Cuadro 3 (corregimiento)
SELECT corregimiento.[corr_id], corregimiento.[corr_dist_id], corregimiento.[corr_desc] FROM corregimiento WHERE provincia.prov_desc=forms!provincia!cc_provincia and distrito.[dist_desc]=forms!provincia!cc_distrito;
Hice las correcciones en la aplicación y ahora el comportamiento es el siguiente:
1. Ahora al abrir el formulario, ya no se abre ninguna ventana.
2. Al hacer clic en el primer cuadro y escoger una provincia, envía un mensaje de error indicando que la expresión incluida en el evento produjo un error.
3. Al hacer clic en el segundo cuadro se abre una ventana con el titulo "introduzca el valor del parámetro" y muestra el nombre distrito.dist_desc con un campo para capturar el dato.
4. Se abren dos ventanas más con el mismo titulo y mostrando los nombres provincia. prov_desc y formularios! Provincia! cc_provincia, respectivamente.
5. Al hacer clic en el tercer cuadro, se muestran las ventanas indicadas en el punto 4, luego la indicada en el punto 3 y finalmente otra ventana del mismo tipo, pero con el nombre formularios! Provincia! cc_distrito.
¿Alguna sugerencia?
Saludos.
Creo que el problema lo tienes en las sql, por ejemplo en la sql del cuadro2 si tu te refieres a la tabla distrito (FROM distrito) luego en la clausula where no te puedes referir a un campo de otra tabla distinta (WHERE provincia.prov_desc=)
Vamos a  ver: Tenemos 3 tablas:
Provincia (Prov_id)
Distrito (Dist_Prov_id, Dist_id)
Corregimiento (Corr_Prov_id, Corr_Dist_id, Corr_id)
Tenemos 1 formulario Provincia con 3 cuadros combinados: Cuadro1, Cuadro2, Cuadro3.
Para el Cuadro1:
Al hacer clic ---> Procedimiento de Evento ---> Me. Refresch
Origen de la fila ---> Select Prov_id From Provincia
Para el cuadro2:
Al hacer clic ---> Procedimiento de Evento ---> Me. Refresch
Origen de la fila ---> Select Dist_Prov_id, Dist_id From Distrito Where Dist_Prov_id=Form!Cuadro1.Value
Para el Cuadro3:
Al hacer clic ---> Procedimiento de Evento ---> Me. Refresch
Origen de la fila ---> Select Corr_Prov_id, Corr_Dist_id, Corr_id From corregimiento Where Corr_Prov_id=form!Cuadro1.value and Corr_Dist_id=form!Cuadro2.value
Lo de indicar el nombre del formulario (Forms! NombreFormulario) te lo dije porque creí que los cuadros los tenias en formularios distintos, al ser en el mismo no hace falta ponerlo.
Si tienes problemas al escribir las sql puedes construirlas pulsando en el cuadrado de los ... que hay a la derecha de origen de la fila.
Buenas tardes Angeles: el camino se va aclarando, ya la aplicación no envía ningún mensaje. Las consultas han quedado de la siguiente manera:
cc_provincia (cuadro1)
SELECT [provincia].[prov_id], [provincia].[prov_desc] FROM provincia ORDER BY [prov_desc];
cc_distrito (cuadro2)
SELECT Dist_Prov_id, Dist_desc FROM Distrito WHERE Dist_Prov_id=Form!cc_provincia.Value;
cc_corregimiento (cuadro3)
SELECT dist_prov_id, corr_dist_id, Corr_desc, corr_id FROM distrito, corregimiento WHERE Dist_Prov_id=form!cc_provincia.value and Corr_Dist_id=form!cc_distrito.value;
El comportamiento de la aplicación es la siguiente:
1. Al seleccionar el cuadro2, se listan los distritos correspondientes a la provincia seleccionada en el cuadro1. Sin embargo, no importa cual elemento de la lista se escoja, en el cuadro2 siempre quedará escogido el primero la lista.
2. Al seleccionar el cuadro3, la lista aparece vacía.
Hay que tener en cuenta lo siguiente:
a) Para todos los cuadros se desea desplegar las descripciones, no los códigos(id).
b) El último cuadro debe mostrar también la descripción (del corregimiento), pero debe guardar el código correspondiente para almacenarlo en otro campo.
Muchas gracias Angeles, ya casi lo logramos...
¿FROM distrito, corregimiento? ¿Como vas a seleccionar dos tablas sin el Inner Join que las una por, por lo menos un campo.
En cuanto a mostrar el código o la descripción lo seleccionas en nº de columnas a mostrar y te saldrá en el orden en que lo hayas seleccionado en la sql Select ...
Saludos, Angeles.
* Me alegro que vayamos por buen camino, es dificil tanto transmitir como responder sin tener la Base a la vista.
Hola Angeles, disculpa el error, el agotamiento ya hace mella...
La consulta del cuadro2 es:
SELECT distrito.dist_prov_id, corregimiento.corr_dist_id, corregimiento.Corr_desc, corregimiento.corr_id FROM corregimiento INNER JOIN distrito ON corregimiento.corr_dist_id = distrito.dist_Id WHERE distrito.Dist_Prov_id=form!cc_provincia.value and corregimiento.Corr_Dist_id=form!cc_distrito.value;
El cuadro2 ahora permite seleccionar correctamente, pero no refresca de forma automática cuando se hace la selección del cuadro1. Hay que hacer clic en el cuadro2 para que despliegue la lista de los distritos que corresponden al primer cuadro y que entonces se vea correcto.
El tercer cuadro sigue sin mostrar nada.
Si te parece, puedo enviarte la base de datos para que la analices con más detalle, es muy ligera, ya que solo tengo lo necesario para probar esta funcionalidad.
Saludos (ya casi... ya casi...) ;-)
Si en el cuadro2 vas a elegir el distrito no entiendo porque metes la tabla corregimiento.
En cuanto a que al picar en el cuadro1 no refresca el cuadro2 ¿has puesto en propiedades del cuadro1 en la acción Al hacer clic ---> Procedimiento de evento --->Me. Refresch?
Hola Angeles: La consulta que te envié no es la del cuadro2, sino la del cuadro3. El cuadro2 funciona "casi bien", pero con la falta de actualización que te indiqué.
A tu otra pregunta, pues sí, ya puse en todas las propiedades de los cuadros la acción Al hacer clic ---> Procedimiento de evento --->Me.Refresh.
¿A cuál dirección puedo enviarte la base de datos?
Saludos, Lex.
Muchas gracias Angeles, el ejemplo fue bastante claro y pude utilizarlo como referencia para la aplicación que estoy construyendo. Gracias además por la paciencia ante este novato de access.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas