Combo box

Felices fiestas!
Mi duda es sobre un combobox que quiero que muestre varios valores de una tabla, la tabla MEDIDAS que tiene varias medidas por cada Registro, así pues el registro R1 tiene M1, M2, M3 y así sucesivamente. Quiero mostrar en el combobox de un formulario cada MEDIDA y que se pueda seleccionar, ya que en cada registro estas medidas son diferentes, pero para el formulario de pedido solo hay que seleccionar 1 de esas 3 medidas. ¿Cómo podría hacerlo que según el Registro que seleccione me muestre cuales puedo seleccionar?
Respuesta
1
Aúpa, y felices fiestas para ti también.
Si no he entendido mal tu pregunta, quieres decir que en cada registro de Pedido, sólo tendrías que seleccionar un
Valor de la tabla Medida, pero ¿va a ser siempre del mismo campo o puede ser cualquiera de los tres que propones M1, M2 o M3?
Puede ser cualquiera de los 3 medidas que tengo en la tabla.
Aúpa,
Aquí estoy de nuevo. Siento el retraso, pero me ha pillado el fin de semana por medio.
Bueno, vamos a lo que nos ocupa...
En principio, con un ComboBox, te va a obligar a elegir siempre el mismo valor de los tres posibles, ya que debes indicar la columna dependinte, que siempre ha de ser la misma; así que habrá que usar otro sistema. Existen muchas posibilidades, te propongo una, que me parece la más clara y sencilla:
Se podría hacer utilizando los siguientes controles:
1. Tres cuadros de texto donde aparezcan las tres medidas. A estos tres controles les vamos a llamar M1, M2 y M3. El origen de cada uno de estos tres controles será el campo correspondiente del origen de datos del formulario.
2. Un ComboBox que nos permita elegir entre M1, M2 o M3. A este Combo le vamos llamar cmbMedidas. Este combo tendrá las siguientes propiedades:
*NúmeroDeColumnas (ColumnCount)= 1
* OrigenDelControl (ControlSource)= < Este campo lo debes dejar en Blanco >
* TipoDeOrigenDeLaFila (RowSourceType)= Lista de valores
* OrigenDeLaFila (RowSource)= "M1"; "M2"; "M3"
* ColumnaDependiente (BoundColumn)=1
* LimitarALista (LimitToList)= Sí
3. Por último, creamos otro campo de texto en el formulario que va a recoger la dimensión seleccionada. Vamos a llamarle MedidaSeleccionada.
La filosofía es que el usuario seleccione en el combo la medida que desea, y que dicha medida se vuelque en el cuadro de texto que hemos creado (o si lo prefieres en una variable de Visual Basic). Después se operaría sobre esta medida que hemos recogido, o almacenamos el valor donde quieras. Vamos a ver cómo hacerlo:
Una vez creados los 5 controles, vamos al combo. Se trata de que cuando el usuario seleccione un valor del combo recojamos la medida correspondiente. Para ello hay que hacer lo siguiente:
1. En el evento Después de Actualizar (AfterUpdate), hay que crear un procedimiento de Visual Basic.
2. En este procedimiento, hay que incluir las siguientes instrucciones <debes respetar los nombres de los campos que antes hemos ido mencionando>:
select case me.cmbMedidas
case "M1":
me.MedidaSeleccionada=me.M1
case "M2":
me.MedidaSeleccionada=me.M2
case "M3":
me.MedidaSeleccionada=Me.M3
case else:
me.MedidaSeleccionada=""
end select
Como ves, lo único que hacen estas instrucciones es asignar al cuadro de texto resultado (medidaSeleccionada) una de las tres dimensiones que el usuario ha seleccionado en el combo.
Con esto ya tienes el valor de la dimensión deseada en el control (medidaSeleccionada) y ahora puedes hacer con él lo que quieras.
Espero que con esto hayas podido resolver tu problema. Cualquier duda o pega, no dudes en comunicármela.
Aprovecho para desearte un buen año nuevo.
Feliz año 2003
Excelente explicación Jurrutia, gracias a ella tengo una idea mucho clara para solventar este problema. Ahora bien hay un punto que me gustaría aclarar, en el combobox cmbMedidas, en vez de mostrar una lista de Títulos "M1";"M2";"M3" quiero mostrar los valores de esas columnas según el producto seleccionado, es decir el producto el producto A le correspond 10 en M1, 20 en M2 y 30 en M3, quiero que en el combobox muestre 10,20,30.? ¿Es esto posible?
Muchas gracias por tu ayuda!
Aúpa, de nuevo.
Ya veo que has entrado en el nuevo año con ganas. ¡Estupendo!
Lo que planteas es posible. Pero ciertamente, supone complicar un poco la solución que anteriormente te mandé pues hay que emplear una pequeña tabla temporal.
Te explico de manera general cuál sería el procedimiento a seguir:
1. Para el Producto actual, obtenemos sus tres medidas M1, M2 y M3.
2. Recogemos las tres Medidas del producto actual, y las volcamos una a una en una tabla temporal con un único campo.
3. El combo ahora tendrá como origen de la fila la tabla temporal con las tres medidas.
4. Al seleccionar un valor del combo se obtendría el valor de dicha dimensión.
Veamos en detalle cómo sería:
0. Lo primero de todo, es crear una tabla temporal que vamos a llamar por ejemplo: tmpMedidasProducto.
Esta tabla tendrá un único campo que contendrá el valor de cada una de las tres medidas del producto actual (vamos a llamarle al campo ValMedida, y será del mismo tipo que las Medidas M1, M2 y M3)
1. Suponiendo que ya hemos creado antes los 3 campos de texto en el formulario con las medidas del producto actual, debemos crear un procedimiento de Visual Basic mediante el Generador de Código en el evento del formulario AlActivarRegistro (OnCurrent).
En este procedimiento, vamos a incluir las siguientes instrucciones:
Private Sub Form_Current()
' AL ACTUALIZAR EL REGISTRO DEL FORMULARIO
'
'Esta instrucción desactiva los mensajes de advertencia para que no muestre un aviso al escribir en la tabla temporal
DoCmd.SetWarnings False
'Esta instrucción borra el contenido previo de la tabla Temporal mediante instrucción SQL
DoCmd.RunSQL "DELETE * FROM tmpMedidasProducto;"
'Escribimos en la tabla temporal el valor de M1 mediante una instrucción de SQL
DoCmd.RunSQL " INSERT INTO tmpMedidasProducto ( ValMedida ) SELECT " & Me.M1 & " AS Expr1;"
'Escribimos en la tabla temporal el valor de M2 mediante una instrucción de SQL
DoCmd.RunSQL " INSERT INTO tmpMedidasProducto (ValMedida) SELECT " & Me.M2 & " AS Expr1;"
'Escribimos en la tabla temporal el valor de M3 mediante una instrucción de SQL
DoCmd.RunSQL " INSERT INTO tmpMedidasProducto (ValMedida) SELECT " & Me.M3 & " AS Expr1;"
'Esta instrucción vuelve a activar los mensajes de advertencia.
DoCmd.SetWarnings True
End Sub
Vale, con esto, cada vez que cambies de producto en el formulario, obtendremos sus 3 medidas en la tabla temporal. TmpMedidasProducto
2. Ahora vamos a modificar un par de propiedades del Combo que hicimos el otro día (cmbMedidas):
* TipoDeOrigenDeLaFila (RowSourceType)= Tabla/Consulta
* OrigenDeLaFila (RowSource)= "tmpMedidasProducto"
Con esto, el combo mostrará ahora los valores de las tres dimensiones guardadas en la tabla temporal.
3. Se trata ahora de recoger la medida que el usuario seleccione en el combo. Para ello, basta con que recojas el valor del propio Combo y hacer con él las operaciones que desees.
Por ejemplo, si quieres mostrar el valor seleccionado en el control MedidaSeleccionada que creamos el otro día, bastaría con poner en el evento DespuésDeActualizar (AfterUpdate) del Combo la siguiente instrucción:
Me. MedidaSeleccionada = Me. CmbMedidas
No haría falta nada más.
Espero que con esto hayas podido resolver tu duda. No dudes en consultarme cualquier pega o duda que tengas.
Un abrazo,
Javi
Estoy asombrado por tu respuesta, me ha aclarado muchas cosas y la verdad que es muy muy profesional! Estoy muy agradecido. Solo me he perdido un poco, creo yo, con la segunda respuesta para mostrar las medidas en el combobox... ¿Debo hacerlo todo en un nuevo formulario o me valen los de la primera respuesta? Si es así he tenido un error "Syntax error (missing operator) in query expresión ´12x24´ " y te explico, los datos contenidos en las medidas M1, M2, M3 son campos de texto con este formato 8x10, 10x16, etc... No he conseguido arreglarlo pero bueno, de todas maneras te agradezco muchísimo tu tiempo y tu excelente ayuda. Aúpa!
Aúpa,
La solución al problema del mensaje "Syntax Error" es muy sencilla. El error se produce en las consultas de Inserción cuando intentan escribir un valor como "12x14" como si fuese un número.
Para indicar a la consulta que se trata de un valor tipo texto, basta con ponerle comillas simples. De este modo, la consulta quedaría:
Docmd.RunSQL "INSERT INTO tmpMedidasProducto (ValMedida) SELECT '" & Me.M1 & "' As Expr1;"
Y lo mismo con las otras dos consultas.
Fíjate que después de SELECT y antes de las comillas dobles ", hay una comilla simple ', y lo mismo entre las siguientes comillas dobles ", y la palabra As, donde también hay una comilla simple '.
Asegúrate de que el campo ValMedida es de tipo Texto.
Con esto las consultas deberían funcionar.
----------------------------------------------------------------------------------------------
Ahora bien, acabo de darme cuenta de que, la solución que te propuse la otra vez no es ni por asomo la más sencilla.
Existe una mucho más lógica y sencilla, que además no necesita de ninguna tabla temporal:
Como el origen de los datos del combo se puede modificar en tiempo de ejecución, basta con asignar al ComboBox las 3 medidas del producto actual separadas por ";".
Por ejemplo:
Si en un comboBox pones que el tipo de origen de la Fila es "Lista de Valores", los valores que va a mostrar el Combo se indican en la propiedad Origen de la Fila (RowSource) como: "Valor1"; "Valor2; "Valor3"
Para esta nueva solución que te propongo, nos harían falta los siguientes Elementos en el formulario:
Cuadro de texto: M1, Va a contener la Medida 1 del Producto actual
Cuadro de texto: M2, Va a contener la Medida 2 del Producto actual
Cuadro de texto: M3, Va a contener la Medida 3 del Producto actual
Combo Box: cmbMedidas, Va a mostrar los valores de las tres medidas del producto actual.
Cuadro de texto: MedidaSeleccionada, Va a contener la medida que el usuario seleccione del Combo
B. La secuencia del programa sería:
1. En el evento Al Activer el Registro del Formulario (Form_Current)
1.1 Se recogen las 3 Medidas del Producto actual y se Vuelcan directamente en el ComboBox
1.2 Se actualiza el ComboBox para que recoja las medidas pasadas.
2. Al seleccionar un valor del ComboBox (AfterUpdate)
2.1. Recoge el valor seleccionado y lo copia en el cuadro de Texto MedidaSeleccionada
Para que esto funcione, el ComboBox deberá tener las siguientes valores es en las propiedades que te indico:
* Número de Columnas (ColumnCount) = 1
* Origen del Control (ControlSource) = < Este campo lo dejas a blanco, o si quieres, pones el nombre de algún campo del origen de datos del formualrio donde quieras guardar el valor seleccionado en el ComboBox>
* TipoDeOrigenDeLaFila (RowSourceType)= "Lista de Valores"
* OrigenDeLaFila (RowSource)= <De momento deja esto en blanco>
* Columna Dependiente (BoundColumn) = 1
* Limitar a Lista (LimitToList) = Sí <Para que el usuario no pueda escribir valores diferentes de los de la lista>
El código de Visual Basic a introducir será :
Private Sub Form_Current()
''--------------------------------------------
' EVENTO: AL ACTIVAR REGISTRO DEL FORMULARIO
'
'--------------------------------------------
'Se recogen las tres medidas en el ComboBox
Me.cmbMedidas.RowSource = Me.M1 & "; " & Me.M2 & "; " & Me.M3
'Se actualiza el ComboBox con los nuevos datos recogidos
Me.cmbMedidas.Requery
'Limpiamos el valor que pudiera tener de antes MedidaSeleccionada
Me.MedidaSeleccionada = ""
'Limpiamos el valor que pudiera tener de antes cmbMedidas
Me.cmbMedidas = ""
End Sub
Private Sub cmbMedidas_AfterUpdate()
'---------------------------------------------------------------------------------
' EVENTO: AL SELECCIONAR UN VALOR DEL COMBOBOX
'
'---------------------------------------------------------------------------------
'Copiamos el valor seleccionado en el Cuadro de texto MedidaSeleccionada
Me.MedidaSeleccionada = Me.cmbMedidas
End Sub
Si quieres, como en el Combo vas a tener las 3 medidas, puedes ocultar los controles M1, M2 y M3, o incluso prescindir de ellos si te atreves a coger los datos directamente de la tabla y asignarlos al Combo Mediante una instrucción SQL.
También puedes prescindir si quieres del control MedidaSeleccionada, ya que puedes utilizar directamente el valor seleccionado del Combo refiriéndote a él como Me. CmbMedidas, o guardarlo en una tabla si asignas al Combo un Origen del Control.
Espero que esta solución te resulte más clara. Cualquier pega que tengas, no dudes en consultármela.
Un abrazo,
Javi

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas