Cuadros combinados en cascada

Estimado numerobix, acudo en tu ayuda porque soy muy nueva en la creación de bases de datos y llevo mucho tiempo dando vueltas a este tema, tengo mi base parada desde hace semana. Espero me puedas ayudar a resolver este tema.
He creado una base de datos en Access 2007. Entre otras tengo las siguientes tablas:
CLIENTES: Id. Cliente, Compañía, Dirección,...
RFQ: IdRFQ, Id.Cliente (cuadro combinado --> SELECT CLIENTES.Id_Cliente, CLIENTES.Compañia FROM CLIENTES ORDER BY CLIENTES.Compañia;) Descripción, Año
OFERTAS: IdOferta, IdRFQ (cuadro combinado --> SELECT RFQ.IdRFQ, RFQ.Descripcion, RFQ.Año FROM RFQ ORDER BY RFQ.IdRFQ, RFQ.Año;
Ahora estoy diseñando un formulario, OFERTAS, que permita introducir datos en esas tablas, además de otras. Mi intención es crear dos cuadros combinados en cascada, pero no doy con ello y he probado de todo.
Tengo un campo Oferta (Origen de control: IdOferta).
El primer cuadro se llama Combo_RFQ, en el origen de la fila --> SELECT RFQ.IdRFQ, RFQ.Descripcion, RFQ.Año FROM RFQ ORDER BY RFQ.IdRFQ, RFQ.Año; y en origen de control IdRFQ., Este cuadro me permitirá elegir la RFQ que esté relacionada con la Oferta.
El segundo cuadro, Combo_Cliente, me debe mostrar el cliente que esté relacionado con esa RFQ y no toda la lista de clientes que tengo grabados. Origen de la fila: SELECT CLIENTES.Id_Cliente, CLIENTES.Compañia, RFQ.IdRFQ FROM CLIENTES INNER JOIN RFQ ON CLIENTES.Id_Cliente = RFQ.Id_Cliente WHERE (((RFQ.IdRFQ)=[Formularios]![OFERTAS]![Combo_RFQ])) ORDER BY CLIENTES.Compañia; y en origen de control Id_Cliente.
En el primer cuadro tengo creado un código Me. Combo_Cliente.Requery
El segundo cuadro funciona bien, pues sólo me muestra el cliente que está relacionado con esa RFQ pero cuando voy a seleccionarlo me dice "No se puede modificar el control. Depende de un campo autonumérico Id_Cliente"
Además, si intento salir del formulario y pasar al formulario en vista diseño para ver qué ocurre me da el siguiente error: "Los cambios solicitados en la tabla no se realizaron correctamente porque crearían valores duplicado en el índice, clave principal o relación" Lo cual no entiendo, pues yo no estoy creando una RFQ nueva, sino eligiendo de entre las que tengo.
¿Por favor, me puedes echar una mano? LLevo mucho tiempo con esto y no llego a ninguna solución. Gracias por adelantado.
1

1 Respuesta

38.025 pts. I.T.I. en electricidad con conocimientos de Flash, HTML...
Te ruego me envíes lo que tienes ya que te dan varios errores y sin verla daríamos palos de ciego durante días.
Dirección:
Todoexpertos(ARROBA)planetainformatico. Es
Ya te la he enviado. Muchas gracias por tu ayuda
Perdona, te he enviado un segundo mensaje con la versión correcta de la base de datos, el primer email no es válido. -Gracias por todo
Bueno después de ver por encima tu bd tengo que indicarte dos cositas a ver si con esto solucionas parte de tus problemas.
1) En los cuadros combinados, en este caso el de clientes, en su consulta la relación 1->infinito tienes que mirarla bien, porque no es mostrar todos los registros que coincidan, si no mostrar todos de una lista y uno de la otra... es difícil de explicar sin verlo. Es un problema de relaciones.
2) Lo más importante, la consulta del formulario OFERTAS tiene que ser solo con la tabla OFERTAS, sin ninguna otra. Los campos son los que puedes generar luego con consultas ligadas a ese campo, pero la consulta del formulario libre.
Los campos de otras tablas introducelos como subformularios, con su propia tabla independiente, así tendrás cada cosa en su sitio.
3) Aunque tengas códigos únicos y los trates como INDICES, te aconsejo que todas las tablas tengan su propio autonumérico, que sera el indice, de esta manera te puedes mover con estos indices con total seguridad de que no lo duplicas, ademas de tener un segundo indice sin duplicados o los que desees.
Tienes un problema de concepto de base, como extructurar las tablas, indices... que luego hacen el trabajo de formularios e informes mucho más fácil.
Lo principal es tener bien claro las tablas y sus campos y como se relaccionan entre si.
Los formularios de modificación tienes que plantearlos como introducción de datos a una tabla, donde los subformularios te sirven para introducir datos en las tablas relacionadas con ella.
Si no entiendes algo de lo que digo, pregunta e intento hacerte un ejemplo con el formulario que tienes.
Bueno, creo que me he perdido un poco con tus explicaciones, como ves, soy un poco novata en esto y no tengo muy claros los concepto. Si no te importa, me podrías ayudar un poco y así aclararme un poco con el lío que tengo.
Lo primero me dices es que tengo un problema de concepto de base, creo que tengo clara la estructura y sus relaciones. Pero por favor, dime donde me equivoco. Si no tengo bien la base nunca podré conseguir lo que intento.El planteamiento es esl siguiente:
Tengo un cliente que me pide un presupuesto, a ese presupuesto se le da un nº RFQ y se realiza una oferta. Una RFQ puede tener varias ofertas. La RFQ tiene asignado un cliente, del que dependen los contactos, pero cada oferta puede tener un contacto diferente. Además, cada oferta tiene sus líneas de oferta (detalle ofertas)
Entonces tengo las siguientes tablas:
- CLIENTES: IdCliente (autonumérico), Compañía, CIF, Dirección,...
- CONTACTOS CLIENTES: IdContacto (autonumérico), nombre, apellidos, IdCliente, cargo, teléfono., fax, correo electrónico.
- RFQ: IdRFQ (texto), IdCliente, Descripción, Año
- OFERTAS: IdOferta(texto), IdRFQ, fecha validez, fecha emisión, ....
- DETALLE OFERTAS: Id (autonumérico), IdOferta, Posición, código producto, Descripción, ...
Las relaciones son las siguientes: Contactos clientes relacionada con clientes, clientes relacionada con RFQ, RFQ relacionada con Oferta y Oferta relacionada con Detalle Ofertas. ¿Qué tipo de relaciones debo tener entre estas diferentes tablas, el tercer tipo?
Por otro lado, debo insertar en la tabla ofertas un campo que sea id cliente y otro id contacto, ¿o ya se relacionan por sí solos en el formulario con los cuadros combiandos?
En cuanto a los indices, no entiendo qué es lo que me quieres decir. ¿Debo cambiar todas las tablas y dónde no hay id autonumérico incluirlo? ¿Para qué sirven los indices?
Finalmente: si en la consulta del formulario ofertas sólo incluyo la tabla ofertas, cuando creo el cuadro combinado, por ejemplo RFQ, para elegir el origen de control no me aparece el campo IdRFQ de la tabla RFQ, solamente de la tabla Ofertas. Y cuando llego al cuadro combinado Clientes, no tengo nada válido qué poder elegir para el origen de control.
Espero puedas ayudarme, pues estoy más perdida de lo que yo pensaba.
Gracias por adelantado
Estas dos tablas están relacionadas entre sí por el IdCliente. Pero la relación debería ser "incluir todos los registros de contactos clientes y sólo aquellos registro de clientes donde los campos sean iguales? y no cómo yo la tengo
Vaya lio que te prepare, lo siento.
Empezamos por el principio para entenderlo todo mejor.
El problema de base es que es mucho más difícil depurar un formulario o informe cuando los campos relacionados no son autonuméricos. Tu eres un claro ejemplo.
Si todas las tablas tienen un campo autonumérico y se relaccionan con las demás por ese campo, encontrar fallos de funcionamiento es muchísimo más fácil, puesto que las relaciones están claras y los INDICES (luego explico lo que son) son únicos siempre, puesto que el autonumérico es AUTOMÁTICO.
En cuanto a los indices, no entiendo qué es lo que me quieres decir. ¿Debo cambiar todas las tablas y dónde no hay id autonumérico incluirlo? ¿Para qué sirven los indices?
INDICE es un campo "PRINCIPAL" por el que access se mueve con "RAPIDEZ", cuando marcamos un campo como indice le indicamos a access que ese campo es único en cada registro.
La clave principal es lo mismo y si marcamos al autonumérico como clave principal pues mejor.
Salvando esto ahora con tu BD la tabla RFQ tiene una clave principal que es un texto, ¿cómo aseguras que cuando introduces ese texto a mano no existe? Porque access te da un error, este es el problema, en los formularios van a salirte errores constantemente por este campo y llegara un momento que no sabrás si eres tu o la db o los dos...
Ademas lo usas para relaccionarte con otras tablas, con lo que a access se le hace un poco tedioso, le es más fácil con números.
Por lo tanto, punto numero 1, las tablas tienen que tener un campo autonumérico y relacionarse con este autonumérico con otras tablas.
Por otro lado, debo insertar en la tabla ofertas un campo que sea id cliente y otro id contacto, ¿o ya se relacionan por sí solos en el formulario con los cuadros combiandos?
En la tabla oferta ira el IDCONTACTO ya que el IDCLIENTE esta en la tabla superior.
Si cada RFQ tiene su propio cliente pues el IDCLIENTE esta bien aquí.
Pero las ofertas son de un IDCONTACTO diferente, entonces IDCONTACTO ira aquí.
CLIENTES: IdCliente (autonumérico), Compañía, CIF, Dirección,...
- CONTACTOS CLIENTES: IdContacto (autonumérico), nombre, apellidos, IdCliente, cargo, teléfono., fax, correo electrónico.
- RFQ: IdRFQ (texto), IdCliente, Descripción, Año
- OFERTAS: IdOferta(texto), IdRFQ, IdContacto, fecha validez, fecha emisión, ...
- DETALLE OFERTAS: Id (autonumérico), IdOferta, Posición, código producto, Descripción, ...
Finalmente: si en la consulta del formulario ofertas sólo incluyo la tabla ofertas, cuando creo el cuadro combinado, por ejemplo RFQ, para elegir el origen de control no me aparece el campo IdRFQ de la tabla RFQ, solamente de la tabla Ofertas. Y cuando llego al cuadro combinado Clientes, no tengo nada válido qué poder elegir para el origen de control.
Aquí tenemos otro problema. Precisamente el cuadro combinando sirve para elegir un dato de otra tabla diferente a la que estamos tratando e introducir ese dato en un registro de nuestra tabla.
Ejemplo:
Imagina el formulario de OFERTAS con solo la tabla OFERTAS para modificar datos.
Ahora tienes que introducir el campo IdRFQ. Bien, crea un cc (cuadro combinado a partir de ahora) y en el origen de datos crea una consulta donde la lista sea la tabla RFQ, de modo que tu ligaras esta tabla con OFERTAS en el campo IdRFQ de OFERTAS. No necesitas haber ligado nada en el formulario, lo haces con el cuadro combinado.
Bajate esta db, es la db de ejemplo de access 2003, yo aprendí mucho con ella, investiga en sus formulario y mira sus relaciones.
Podría coger la db y hacerla, pero no aprenderías nada con ello, no es complicada en 30 min la tendrías, pero tienes que empezar con la tablas bien organizadas, con sus autonuméricos y relaciones bien definidas, luego el formulario sera más fácil.
Si sigues con dudas te preparo la bd.
Muchas gracias por tus aclaraciones. Mevoy a poner con ello y te iré contando, si no te importa. Yo también prefiero aprender que me den las cosas hechas pero siempre se necesita un poco de ayuda, por lo menos con la teroría
Por otro lado, me dices que me baje una base de datos pero no me das ningún link.
Un par de preguntas más, voy a modificar toda la base de datos, cambiando las claves principales por autonuméricas, pero respecto a las relaciones entre las tablas, ¿cómo debería ser por ejemplo la relación entre cliente y RFQ? "Incluir todos los registros de clientes y sólo aquellos de RFQ donde los campos combinados sean iguales o al revés??
Y ya por último, respecto al formulario, solo con la tabla ofertas, el cuadro combianado de clientes, en el origen de la fila se realiza una consulta que une la tabla rfq con la tabla clientes. ¿Pero y el origen de control?
De nuevo te agradezco tu interés y tu ayuda.
Voy a ir modificando cosas poco a poco y si no te importe te iré consultado cuando me surja alguna duda.
Saludos,
1) si asi:
Incluir todos los registros de clientes y sólo aquellos de RFQ donde los campos combinados sean iguales
2)
En el origen de la fila pon solo la tabla clientes, con el autonumérico como principal
En el origen del control por el campo de la tabla OFERTAS al que se refiere el cliente.
Hola,
He hecho varias modificaciones en mi base de datos y parece que ahora funciona más o menos. ¿Te importa que te la envíe para que me aconsejes pues este es el principio y debo añadir más tablas y formularios? No me gustaría adelantar que trabajo para que luego no sirva para nada y tener que rehacer todo de nuevo.
El único problema que ahora encuentro es que al abrir el formulario me aparecían los datos de cliente y contacto en blanco, aunque fuesen registros ya grabados en las tablas. Este problema lo he solucionado incrustando una macro que al abrir el formulario vaya directamente a un registro nuevo. No sé si esto es un poco chapuza o no.
Por otro lado, me diste una buena idea, en lugar de tener toda la información en un solo formulario, tratarlo todo como subformularios, que iré incluyendo como pestañas dentro de este formulario.
Muchas gracias.
Puedes enviarla sin problemas, este fin de semana le echo un vistazo y te cuento.
Muchas gracias. Ahora te la envío.
Dime si prefieres que cierre ya la pregunta.
Dejala abierta hasta que terminemos de verdad con ella, así me aparece a mi más a mano.
Creo que en general has captado el concepto, las tablas están perfectas (en cuanto a relaciones) con lo que ahora el trabajo con los formularios e informes veras que es más fácil.
En las relaciones tienes dos que no me terminan de convencer, bueno tres en realidad, porque creo que en una de ellas te has equivocado de tabla.

En la relación entre GRUPO PRODUCTOS y RFQ no puede ser 1 a 1, ya que cada GRUPO solo podrá tener un RFQ y supongo que no es así, sera 1-infinito.
En DETALLE OFERTAS te falta la relación con OFERTAS que has duplicado con RFQ...
Por otro lado y ya para tener todo perfecto te recomiendo una cosa. En las tablas que ningún nombre (ya sea el de la tabla o de los campos) contenga espacios. Luego con los formularios te pueden dar problemas porque se tiene que hilar más fino cuando nombramos con espacios.
Yo tengo esta norma: En los nombres de tablas y campos siempre una palabra y como mucho la inicial mayúscula, sin acentos ni símbolos (_, -,., /, ...).
Muchísimas gracias por tu ayuda, has tenido mucha paciencia y sobre todo interés y ayudarme con mis errores de base. Si no te importa te consultaré de vez en cuando cuándo tenga dudas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas