Agregar valor de un cuadro lista

Cómo hago para agregar a un control de un formulario, un valor seleccionado de entre varios cuadros lista.

1 respuesta

Respuesta
1
Exactamente a que te refieres, de varios cuadros de lista, ¿capturar el valor de cada uno y guardar el valor en otro campo? ¿O de una cuadro de lista multiselección seleccionar varios y guardarlo en un campo? A través de código Vba seria así:
Para el primer caso:
Me.MiCampo_Total = Me.MiCuadro1.Value & "," & Me.MiCuadro2.Value
Para el segundo caso:
Dim item As Variant
For Each item In Me.MiCuadro.ItemsSelected
if isnull(Me.MiCampo_Total.Value) then
Me.MiCampo_Total.Value = ""
else
Me.MiCampo_Total.Value = Me.MiCampo_Total.Value & ", " & Me.MiCuadro.ItemData(item)
end if
Next
Me refería a varias listas y dependiendo de qué valor seleccione en una sola de las listas, con un botón, dar ese valor al control.
Tengo esto, que es muy parecido a lo tuyo:
Dim Valorlista as long
For Valorlista = 4 To 1 Step -1
If Me.Controls.Item("LISTA" & Valorlista) <> -1 then
   Me.campoformulario = Me.Controls.Item ("LISTA" & Valorlista)
   Exit For
   End If
   Next Valorlista
Bien, hay una variación en el código de lo que preguntaba. Tengo 4 listas encadenadas y me interesa siempre el valor de la lista superior. La preferencia entonces empieza en la Lista4, sigue por la lista3, lista2 y termina en lista1. Esto es así porque cada lista siguiente detalla o amplia más la información que busco y que me interesa. Y de ahí el bucle de mayor a menor anterior.
El problema ahora que tengo es que no sé cómo llevarme el mismo número de columnas que tengo en las listas (y que dependen de unas tablas) al cuadro combinado (que almacena el valor para el registro actual).
Por ejemplo: La Lista1, tiene como origen de fila:
SELECT tabla.Campo1, tabla.Id FROM tabla ORDER BY tabla.Campo1
Y la Lista1 tiene definida en propiedades 2 columnas y columna dependiente 2 (el Id)
Ancho establecido para las dos columnas
El cuadro combinado, campoformulario, tiene como tipo de origen de fila: Tabla/Consulta
Pero vacía, ya que depende de cada lista (y otras selecciones al margen)
2 columnas
Columna dependiente 2 (aunque lo cambio a 1 y tampoco funciona)
Cuando solo tenia una columna me funcionaba, pero varié las listas y ahora no me sale.
Por favor qué puedo hacer.
Gracias
Detallo que quiero llevarme las 2 columnas al cuadro combinado y que el id de la tabla origen de cada lista, sea también el id para la tabla origen del cuadro combinado...
Y gracias por contestarme, que no te lo dije antes
Lo que quieres es establecer el origen de datos del combo, me imagino, a partir de la selección.
Bueno pues para eso se haría así, acondicionando el código a tus datos.
Me.MiCombo.RowSource = "Select Id, MiCampo, MiCampo2 From MiTabla"
Me. Combo. Requery
Puedes crear antes una cadena SQL con los distintos filtros por ejemplo.
Dim item As Variant
Sql_Sentencia = "SELECT tabla.Campo1, tabla.Id FROM tabla"
Sql_Filtro = "WHERE"
Sql_Orden = "ORDER BY tabla.Campo1"
if isnull(me.MiLista.Value) or Me.MiLista.Value = "" then
Me.Combo.Rowsource = Sql_Sentencia & " " & Sql_Orden
else
MiFiltro = Me.MiLista.Value
Sql_Filtro1 = "MiCampo1 = " & MiFiltro
Me.Combo.Rowsource = "'" & Sql_Sentencia & " " & Sql_Filtro & " & Sql_Filtro1 & " " & Sql_Orden & "'"
end if
Ya lo que faltaría seria que le dieras unas vueltas acomodándolo a tu base de datos
Perdona no te entendí, si cada lista tiene una tabla de origen distinta con unos campos de origen distintos... ¿cómo puede establecer el origen de datos del combo de esa manera?
Creo que se me entendió que las listas tenían el mismo origen de datos, pero cada una depende de una tabla distinta.
Además, ese código dónde lo pondría. ¿Después de actualizar del combo?...
Lo que te faltaría seria añadir un filtro por cada lista, es decir:
Dim Filtro as Integer
Filtro = 0
MiFiltro = Me.MiLista.Value
Sql_Filtro1 = "MiCampo1 = " & MiFiltro
MiFiltro2 = Me.MiLista2.Value
Sql_Filtro2 = "MiCampo2 = " & MiFiltro
MiFiltro3 = Me.MiLista3.Value
Sql_Filtro3 = "MiCampo3 = " & MiFiltro
Una vez guardado por los valores que tenemos que filtrar, es crear el sql que vamos a pasar como origen de datos al combo.
If isnull(Sql_Filtro1) or Sql_Filtro1= "" then
Sql_Sentencia = Sql_Sentencia
else
If Filtro = 0 then
Sentencia_SQL = Sql_Sentencia & " Where" & Sql_Filtro1
Filtro = 1
else
Sql_Sentencia = Sql_Sentencia & " And " & Sql_Filtro1
end if
end if
If isnull(Sql_Filtro2) or Sql_Filtro2= "" then
Sql_Sentencia = Sql_Sentencia
else
If Filtro = 0 then
Sentencia_SQL = Sql_Sentencia & " Where" & Sql_Filtro2
Filtro = 1
else
Sql_Sentencia = Sql_Sentencia & " And " & Sql_Filtro2
end if
If Filtro = 0 then
Sentencia_SQL = Sql_Sentencia & " Where " & Sql_Filtro3
Filtro = 1
else
Sql_Sentencia = Sql_Sentencia & " And " & Sql_Filtro3
end if
end if
Lo que se hace es guardar los valores para filtrar, y se van a gregando a la sentencia sql
Perdona mi ignorancia y muchas gracias por tu dedicación, pero, ¿dónde establezco los filtros y dónde creo el sql?
Lo siento de veras, estoy muy agotada con esto, llevo bastantes días...
Pues debes establecerlo donde más te convenga, al seleccionar un elemento de la ultima lista, al pulsar un botón... eso depende de cuando quieres que se actualice.
Este código Vba lo puedes poner donde más te convenga.
A ver. He conseguido entender (creo), me ha costado. Tengo esto pero me sale un mensaje de error: "Se encontraron caracteres después del final de la instrucción sql".
Después de actualizar el combo:
Dim sql as string
Dim sqlFilter as string
Dim TxT as string
TxT = Me.combo.Column(1) QUE ES VALOR ID QUE ME INTERESA LLEVAR AL COMBO
sql = "SELECT tabla.campo1, tabla.idcampo1, tabla.campo2, tabla.idcampo2 from tabla;"
sqlFilter = "WHERE tabla.idcampo2 = " & TxT
Me.combo.RowSource = sql & "" & sqlFilter
He vuelto a cambiar un poco la intención que tenía en un inicio porque no te comprendía del todo, pero esta nueva idea me gusta más. En un mismo combo, voy desplegando las tablas encadenadas. Por eso, de la primera tabla, obtengo un valor TxT y sobre ese valor quiero que me siga filtrando la sql. Pero no lo consigo.
Claro que tampoco sé, si consigo mostrar la segunda tabla, filtrada, no sé dónde ejecutar la siguiente tabla. Ya no podré hacerlo en el después de actualizar del combo. Tendré que poner un botón de comando. ¿Mucho lio no? ufff
de todas manera gracias, porque no creo que sigas teniendo ganas de ayudarme con la tabarra que estoy dándote
Es decir TxT es una variable porque tengo muchos valores de las tablas que desencadenan la siguiente tabla... por eso lo de la variable :(
Bueno, tenía un punto y coma en la sql y la he quitado:
sql = "SELECT tabla.campo1, tabla.idcampo1, tabla.campo2, tabla.idcampo2 from tabla;"
Pero ahora me dice que uso no válido '. ', '! ' O '()' no válido, en la expresión de consulta 'tabla. campo2 = A.02'
Donde A.02 es la variable anterior, el valor del combo de la selección de la primera tabla...
Seguiré investigando
No puedo, me supera
A ver, drake, ya me da hasta vergüenza seguir con este hilo... puff,
Después de Actualizar combo:
Dim TxT As String
TxT = Me.CONTRARIO.Column(1)
MsgBox Me.CONTRARIO.Column(1) 'A.02./ M.ECONOMIA
Dim sql As String
Dim sqlFilter As String
Dim MiFiltro As String
'MiFiltro = 0
Dim sqlfiltro As String
Dim sqlSentencia As String
Dim MensajeCon1, EstiloCon1, TítuloCon1, RespuestaCon1
MensajeCon1 = "¿Agregar elemento seleccionado al campo Contrario?"
EstiloCon1 = vbYesNo + vbQuestion + vbDefaultButton1    ' Define los botones.
RespuestaCon1 = MsgBox(MensajeCon1, EstiloCon1)
If RespuestaCon1 = vbYes Then
Exit Sub
Else
sql = "SELECT tblAdministraciones2.ADMINISTRACION2, tblAdministraciones2.ID_ADMINISTRACION2,tblAdministraciones2.ADMINISTRACION1, tblAdministraciones2.ID_ADMINISTRACION1 FROM tblAdministraciones2"
MiFiltro = Me.CONTRARIO.Column(1)
sqlfiltro = "CONTRARIO = " & MiFiltro
sqlSentencia = sql & "WHERE" & sqlfiltro
Me.CONTRARIO.RowSource = "" & sql & "" & "WHERE" & sqlfiltro & ""
Me da error de sintaxis de sql...
Tienes que respetar los espacios de la sentencia, eso nos pasa a todos, pero ya iras aprendiendo, ademas si es un campo texto el filtro tiene que ir entre comillas dobles el valor.
No es lo mismo WhereContrario = Mifiltro que WHERE CONTRARIO = MiFiltro
sqlfiltro = "CONTRARIO = '" & MiFiltro & "'"
Me.CONTRARIO.RowSource = sql & " " & " WHERE " & sqlfiltro & ";"
Veo que poco a pocos le coges el truco, de eso se trata, mientras más te choques contra la pantalla (no te hagas sangre), todo va saliendo bien.
Gracias por no mandarme al carajo, drike. Mira, he rectificado según tus indicaciones:
sql = "SELECT tblAdministraciones2.ADMINISTRACION2, tblAdministraciones2.ID_ADMINISTRACION2,tblAdministraciones2.ADMINISTRACION1, tblAdministraciones2.ID_ADMINISTRACION1 FROM tblAdministraciones2"
MiFiltro = Me.CONTRARIO.Column(1)
sqlfiltro = "CONTRARIO = '" & MiFiltro & "'"
Comilla simple, comilla doble & MiFiltro & comilla doble, comilla simple, comilla doble
Me.CONTRARIO.RowSource =sql & " " & " WHERE " & sqlfiltro & ";"
Pero me sigue dando error. El msgbox me devuelve:
MsgBox Me.Contrario.RowSource
...el select FROM tblAdministraciones2 WHERE CONTRARIO = 'A. 02. ';
Y no me da error, a punto he estado de dar un brinco pero es que me devuelve todo la tabla tblAdministraciones2. No me hace filtro!. ¿No entiendes algo?.
Osea, que me he expresado mal. No me da mensaje de error, salvo que me devuelve toda la tabla ...
SIIIIIIIIIIIIIIII drake mil besosss nene, lo hemos conseguido!!!
Mira. He rectificado el filtro de la consulta select:
sqlfiltro = "tblAdministraciones2.ID_ADMINISTRACION1" = '" & MiFiltro & "'"
Osea, lo que me faltaba era decirle que otro campo de la tabla (que es el id y con el que está relacionado con la tabla anterior) coincidiera con el valor de CONTRARIO!
drake, era un crak :)
Que paciencia has tenido conmigo. Muchísimas gracias, me siento tan torpe y con tan vagos conocimientos! Yo creía que podía desenvolverme mejor pero se me han olvidado muchísimas cosas. Me has dado una alegría en este día!
Un abrazo :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas