Trasladar selección múltiple de cuadro de lista
¿Cómo puedo trasladar los datos seleccionados en un cuadro de lista de selección múltiple al campo de una tabla? Por favor, ayuda. Me urge muchísimo.
1 respuesta
Ahí tienes un ejemplo que hace lo que pides: http://www.mediafire.com/download/4gmx8gpg14t19e9/MariaMtnez.SelMultiple.zip
Saludos,
Neckkito's muchíssssimas gracias por tu gran ayuda. Gracias, gracias y mil gracias. ¿Podría hacer esto también con access 2000, que no tiene campos multivalor?.
Desconozco las particularidades de Access 2000, por lo que no te puedo dar una respuesta.
Los campos de lista de una selección, en Access 2003 y siguientes, tienen la propiedad "Value" que es la que te recoge la selección que haces (siempre de la columna dependiente).
En este caso el código es más sencillo, ya que sería:
...
Private Sub...
me.CampoDestino.Value = me.NombreListBox.value
End Sub
...
Si los quieres ir seleccionando de uno en uno el código podría quedar una cosa así (en el evento "Después de actualizar" del listbox):
...
Private Sub..
Dim miLista as string
miLista=nz(me.CampoDestinoValue,"")
miLista=miLista & me.NombreListBox.value & ", "
If len(miLista)>2 then
miLista=left(miLista, len(miLista)-2)
Else
miLista=""
End if
me.CampoDestino.value=miLista
...
Te lo he escrito de memoria y supongo que funcionará ;-)
Ahora bien, y como te decía, al desconocer el funcionamiento de Access 2000 imagino que también tendrán esa propiedad, pero no te lo puedo asegurar.
Quizá el evento "Después de actualizar" no sea el mejor... también prueba con "Al hacer click".
Y cuando digo uno a uno me refiero a que seleccionas uno, y después seleccionas otro, y así sucesivamente.
Voy a probar el código esta noche. En lugar de un combo he utilizado un cuadro de lista con multiselección en el ejemplo primero que me has preparado. Va perfecto, pero ¿por qué las opciones que he seleccionado no deseleccionan cuando paso al siguiente registro?.
¿Podría cambiar el color de la línea de selección del cuadro de lista?, actualmente sale negro.
Eres genial Neckkito. Gracias otra vez.
El combo (o cuadro de lista) está ligado a un campo de la tabla. Eso significa que se guardan las opciones en cada registro. En el ejemplo, si te mueves por los registros los valores seleccionados van cambiando. Si te vas a un registro nuevo, al no haber aún información, verás que no te aparece ningún valor seleccionado.
Y, hasta donde yo sé, no le puedes cambiar el color de selección. De hecho, no sé por qué me hablas de colores si, siempre refiriéndome al ejemplo, la selección la haces mediante un check, y en ningún momento se selecciona el valor al completo.
Desconozco qué modificaciones has hecho para que salga lo que dices que te sale.
Neckitto, buenas tardes. Te planteo la cuestión.
Tengo un combo "CAUSAS" con el siguiente evento:
Private Sub CAUSAS_AfterUpdate()
If Me.LISTA_CAUSAS = "" Then
Me.LISTA_CAUSAS = Me.CAUSAS
Else
Me.LISTA_CAUSAS = Me.LISTA_CAUSAS & " - " & Me.CAUSAS
End If
End Sub
Elijo la causa y en el campo LISTA_CAUSAS me aparecen los códigos de las causas separados por un guión.
Si yo quisiera poner en el formulario otro combo delante del campo CAUSAS para englobar estas por tipo (TIPO_CAUSAS) para hacer un combo en cascada. ¿Qué tendría que hacer?. Mi idea elegir un tipo de causa y que en el combo CAUSAS me aparezcan sólo las del tipo elegido en el combo anterior. Lo he hecho pero en en campo LISTA_CAUSAS sólo se queda grabada la primera causa que he elegido del primer tipo. ¿Cómo tendría que modificar el evento? ¿En el mismo campo? ¿Después de actualizar?. Te agradecería tu ayuda mucho.
En el evento me aparece todo esto ¿Puedo borrar algo o es necesario?
Private Sub Comando46_Click()
On Error GoTo Err_Comando46_Click
DoCmd.GoToRecord , , acPrevious
Exit_Comando46_Click:
Exit Sub
Err_Comando46_Click:
MsgBox Err.Description
Resume Exit_Comando46_Click
End Sub
Private Sub CAUSAS_AfterUpdate()
If Me.LISTA_CAUSAS = "" Then
Me.LISTA_CAUSAS = Me.CAUSAS
Else
Me.LISTA_CAUSAS = Me.LISTA_CAUSAS & " - " & Me.CAUSAS
End If
End Sub
Private Sub Comando47_Click()
On Error GoTo Err_Comando47_Click
DoCmd.GoToRecord , , acNext
Exit_Comando47_Click:
Exit Sub
Err_Comando47_Click:
MsgBox Err.Description
Resume Exit_Comando47_Click
End Sub
Private Sub Comando48_Click()
On Error GoTo Err_Comando48_Click
DoCmd.GoToRecord , , acPrevious
Exit_Comando48_Click:
Exit Sub
Err_Comando48_Click:
MsgBox Err.Description
Resume Exit_Comando48_Click
End Sub
Private Sub Comando49_Click()
On Error GoTo Err_Comando49_Click
Screen.PreviousControl.SetFocus
DoCmd.RunCommand acCmdFind
Exit_Comando49_Click:
Exit Sub
Err_Comando49_Click:
MsgBox Err.Description
Resume Exit_Comando49_Click
End Sub
Private Sub Comando50_Click()
On Error GoTo Err_Comando50_Click
DoCmd.GoToRecord , , acNewRec
Exit_Comando50_Click:
Exit Sub
Err_Comando50_Click:
MsgBox Err.Description
Resume Exit_Comando50_Click
End Sub
Private Sub Comando52_Click()
On Error GoTo Err_Comando52_Click
If Me.Dirty Then Me.Dirty = False
DoCmd.Close
Exit_Comando52_Click:
Exit Sub
Err_Comando52_Click:
MsgBox Err.Description
Resume Exit_Comando52_Click
End Sub
Private Sub Form_Open(Cancel As Integer)
End Sub
En cuanto a los combos en cascada, echa un vistazo a este ejemplo. Lo que tienes que pillar del ejemplo es la mecánica de funcionamiento de cómo crear combos en cascada, y adaptarlo a tu caso: http://bit.ly/17Rwynj
En cuanto a lo de borrar, yo de ti no borraría nada. Eso son códigos de diferentes elementos que tienes en el formulario. Por ejemplo, si te cargas el evento <Private Sub Comando46_Click()> el botón que debes tener para ir a un registro anterior dejará de funcionarte.
Ten en cuenta que los procedimientos son bloques que van desde el <Private sub...> hasta el <End Sub>.
Como no sé qué botones ni qué acciones tienes en tu formulario no puedo decirte si lo debes o borrar o no. Si lo borras debes ser consciente de que algo dejará de funcionarte.
¡Gracias! Gracias Nec. Sale perfecto. Lo único que "falla" es que después de una elección no se quedan en blanco los combos en cascada. Los valores que voy eligiendo en los combos se trasladan concatenados al campo de texto, pero detrás de una elección no se quedan ambos combos en blanco.
Lo que pides no tiene ningún sentido. Los combos o tienen origen de la fila o no la tienen. Y si no la tienen después dirás que el combo te queda en blanco y que no te sale opción para seleccionar.
¿Quieres un combo en blanco? Pues cámbiale el origen de la fila a
me.combo.rowsource=""
me.combo.requery
Pero eso te va a dar problemas de funcionamiento.
No me he explicado bien. Lo que quiero es que una vez he trasladado al campo de texto "Lista-causas" el valor del código de la opción elejida en el combo 2 tras (tras hacer la elección previa en el combo 1), vuelvan a estar los dos combos si opción elegida (que no se quede la última opción que he señalado en los dos combos). No sé si me explico del todo bien. Es complejo.
si esto es lo que querías: http://www.mediafire.com/download/bvbpuzam11azqtl/MariaMtnez.SelMultiple2.zip
Ten en cuenta que los cuadros de lista y los combos, ambos multiselección, son "bichos" de comportamiento un tanto difícil de manejar. Por ejemplo, este ejemplo que te he subido sí funciona en cuadro de lista, pero no en combo, y no tengo ni idea de cómo se podría manejar en un combo.
Además, los eventos y el comportamiento del listbox se interfieren mutuamente, de manera que la solución de este segundo ejemplo es lo mejor que he podido conseguir sin que todo se espachurre.
- Compartir respuesta