Menú desplegable dependiente de dos valores

Este problema seguro que te habrá aparecido previamente y nos podrías comentar rápidamente la solución:
Problema:
- En un formulario tenemos un menú desplegable (combo) cuyo valor ha de depender de dos campos. Por ejemplo el menú podría ser para elegir el nombre de una empresa y la clave primaria de la tabla de empresa ser Provincia, Número (dos campos).
Notas:
- En la propiedad de "Origen del control" del menú sólo se puede poner un valor... Sin embargo necesitaríamos dos: Provincia y Número. Si pusiéramos sólo "Número", al elegir en el formulario la empresa "2-1" el menú mostraría la empresa "1-1", ya que se guía sólo por el campo "Número".
- Podemos, en el evento "on change" del menú desplegable, hacer que al elegir una empresa -> se rellenen los campos "Provincia" y "Número" del formulario; pero está ese problema, hacer que el menú desplegable muestre el valor que realmente es.
Hemos buscado por todo Internet y no hemos encontrado información sobre esto (y debe ser un problema muy frecuente).

1 Respuesta

Respuesta
1
Para lograr esto debes tener en cuenta dos cosas:
1. El origen de un control SIEMPRE guardará solo un valor, no dos.
2. Si unes números y símbolos (2-1), el resultado de los datos será de tipo texto, no de tipo numérico, por tanto, la clave de la empresa deberá ser de tipo texto.
Una vez sabiendo eso, debemos hacer lo siguiente:
Paso 1.
El truco está que el origen de tu menu (cuadro combinado) será una consulta, y no tu tabla donde estén provincia y numero por separado. Para esto, crea una consulta llamada "ConsultaEmpresas" que lea los datos de tus empresas, con dos columnas (campos):
columna 1= ClaveEmpresa: [provincia] & "-" & [numero]
columna 2 = NombreEmpresa (¿Así se llama tu campo? Ponle el nombre correcto de tu campo). Observa los resultados de la consulta, deberá aparecer algo así:
ClaveEmpresa, NombreEmpresa
"1-1", "Empresa1"
"2-1", "Empresa2"
"3-1", "Empresa3"
"1-2", "Empresa4"
Etc.
Todo de tipo texto (sin comillas obviamente, solo es para ilustrar).
Paso 2.
Luego en tu formulario creas un cuadro combinado de dos columnas, que tenga de origen de la fila la consulta "ConsultaEmpresas". Es obvio que la columna dependiente será la 1 (ClaveEmpresa), pero si deseas mostrar sólo el nombre de la empresa en la lista, deberás poner el ancho de las columnas de tu cuadro combinado con las siguientes medidas:
0cm;4cm
Esto hará que la columna de ClaveEmpresa permanezca oculta y que solo la columna de NombreEmpresa sea visible.
¿Entendí bien tu problema? Espero que sí, en caso contrario, dime si me equivoqué en algo.
Hola David
Primero de todo, gracias por tu amabilidad. Lo de ser una tabla de empresas es un ejemplo para más claridad (realmente el problema lo tenemos con la tabla de "moldes"). Hay un problema: su código de ha de ser forzosamente formado por dos números separados (aunque podemos, claro, en el formulario hacer los apaños que creamos convenientes).
Podemos seguir con el ejemplo de las empresas para verlo más claro, cuando me refería a la empresa "2-1" era para mencionar a una empresa en particular (internamente el código sería 2 1 )
Entonces el problema está en la propiedad "origen del control" del cuadro combinado, sólo hay opción de elegir un valor (como bien comentas) y entonces el cuadro combinado no realiza su función correctamente (con los problemas que comentábamos en el primer envío)
Bueno, eso es todo, te volvemos a agradecer tu atención
Yo preferiría que me enviaras tu caso real, el problema tal y como lo tienes en tu base de datos, para comprenderlo mejor e ilustrarlo como se debe, te aseguro que por muy complejo que sea lo logro entender :-).
De cualquier forma, creo que me doy una idea más clara de lo que quieres hacer (otra vez dime si me equivoco):
Lo que buscas es que al capturar los datos del molde (supongo) quieres elegir de un cuadro combinado un número y después elegir de otro cuadro combinado otro número y que eso forme la clave al guardar el formulario ¿es así? Porque en ese caso lo que se debe hacer es:
1. Creas un cuadro de texto que esté oculto (visible=false), y lo pones como origen de datos la clave del molde.
2. Programas el evento BeforeUpdate de tu formulario con un código similar a este:
me.clave = me.lista1 & " " & me.lista2
Lo que hace este código es unir el valor de ambos cuadros combinados antes guardar o modificar el registro del molde.
Por favor, mándame los datos reales de tu caso y lo que quieres hacer exactamente para poder ayudarte.
Hola de nuevo, David
Te he grabado unas capturas de pantalla para que lo puedas ver más claro y hacerte la tarea más fácil. En
http://www.spunge.org/~siryu/combo.gif
vemos un cuadro combinado (son 3 realmente los valores que identifican un molde). Se ha de poder elegir el molde:
1) Tecleando los 3 valores
2) Escogiendo el molde de la lista
El problema estaría en cómo hacer para que al elegir un valor del menú desplegable -> en el menú desplegable apareciese siempre el valor elegido (ya que en la propiedad "Origen del control" del menú sólo se puede poner un valor y por tanto esto no funciona bien siempre).
(Lo de que al elegir un valor se actualicen los 3 cuadros amarillos ya lo consigo con el evento OnChange del cuadro combinado)
Bueno, gracias por tu atención de nuevo y si quieres te puedo pasar las capturas de pantalla que quieras y comentarte lo que haga falta
Saludos
Antonio
De nuevo Antonio:
Creo que al fin encontré la respuesta a este buen problema :-)
El truco era más simple de lo que pensaba, sólo es necesario usar eventos y la función DLookup. El problema es que me falta un dato por saber, ¿cómo guardas la clave del molde en la tabla de moldes: con una clave de texto que contiene los tres valores, o guardando los 3 valores en 3 campos diferentes? Voy a asumir que utilizas el último caso. Para eso, hice una tabla de ejemplo llamada "Moldes" la cual tiene los siguientes campos:
Campo, tipo
V1, numérico
V2, numérico
V3, numérico
Molde, texto
En este caso, "molde" tiene la descripción del molde, y v1, v2, y v3 son la clave del molde.
Luego hice un formulario independiente donde pongo 3 cuadros de texto llamados v1, v2, y v3 (igual a los campos), y un cuadro combinado llamado "molde". Este cuadro combinado tiene como origen del registro la tabla Moldes, y como columna dependiente la número 4 (campo molde), como tamaño de los campos puse: 0cm;0cm;0cm;4cm para que sólo se vea la descripción del molde, recuerda que se trata de un formulario INDEPENDIENTE, ninguno de los 4 controles asigna su valor (origen del control) a un campo, eso ya lo asignas tú en tu formulario real.
Entonces lo que hice fue programar el evento OnChange del cuadro combinado, creo que tu ya lo programaste, pero para este ejemplo quedó así:
Private Sub Molde_Change()
Me.v1 = DLookup("v1", "moldes", "molde='" & Me.Molde & "'")
Me.v2 = DLookup("v2", "moldes", "molde='" & Me.Molde & "'")
Me.v3 = DLookup("v3", "moldes", "molde='" & Me.Molde & "'")
End Sub
Lo que hace es actualizar los 3 valores al elegir un valor de la lista.
Luego, hice un procedimiento independiente que actualiza el cuadro combinado según los valores de los controles v1, v2, v3:
Sub ActualizarCuadroCombinado()
Me.Molde = DLookup("molde", "moldes", "v1=" & Me.v1 & " and v2=" & Me.v2 & " and v3=" & Me.v3)
End Sub
Este procedimiento lo hice para programar el evento "DespuesDeActualizar" (AfterUpdate) de cada uno de los controles v1, v2, v3:
Private Sub v1_AfterUpdate()
ActualizarCuadroCombinado
End Sub
Private Sub v2_AfterUpdate()
ActualizarCuadroCombinado
End Sub
Private Sub v3_AfterUpdate()
ActualizarCuadroCombinado
End Sub
Así, si necesitas cambiar la forma de actualizar el cuadro combinado, sólo cambias el código una sola vez en el procedimiento ActualizarCuadroCombinado, y no 3 veces :-) Este evento lo que hace es que al cambiar alguno de los 3 valores, automáticamente se muestra el molde correspondiente en la lista.
Por último: si deseas que al abrir el formulario se muestre inmediatamente la descripción del molde según los valores que ya contienen v1, v2, v3, lo único que tienes que hacer es programar el evento AlAbrir (OnOpen) del formulario como sigue:
Private Sub Form_Open(Cancel As Integer)
ActualizarCuadroCombinado
End Sub
(Quizá necesites programar el evento AlActualizarRegistro "Current" con el mismo código, sin embargo en este ejemplo no aplica).
Todo en conjunto quedaría así:
Option Compare Database
Sub ActualizarCuadroCombinado()
Me.Molde = DLookup("molde", "moldes", "v1=" & Me.v1 & " and v2=" & Me.v2 & " and v3=" & Me.v3)
End Sub
Private Sub Form_Open(Cancel As Integer)
ActualizarCuadroCombinado
End Sub
Private Sub Molde_Change()
Me.v1 = DLookup("v1", "moldes", "molde='" & Me.Molde & "'")
Me.v2 = DLookup("v2", "moldes", "molde='" & Me.Molde & "'")
Me.v3 = DLookup("v3", "moldes", "molde='" & Me.Molde & "'")
End Sub
Private Sub v1_AfterUpdate()
ActualizarCuadroCombinado
End Sub
Private Sub v2_AfterUpdate()
ActualizarCuadroCombinado
End Sub
Private Sub v3_AfterUpdate()
ActualizarCuadroCombinado
End Sub
¡Listo! Problema resuelto, y sí funciona porque ya lo probé :-)
Espero haber resuelto tu problema.
Te mando un cordial saludo.
David T.H.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas