La Web del Programador: Comunidad de Programadores
 
    Pregunta:  42565 - CÓMO CREAR UN COMBO QUE MUESTRE LA SELECCIÓN DE UNA CONSULTA
Autor:  Silvia de Oliveira
Tenemos un primer combo que nos muestra los datos de una tabla y queremos crear un segundo combo que una vez seleccionado una opción del primer combo nos muestre los datos relacionados de la segunda tabla con el dato elegido.

  Respuesta:  Silvia de Oliveira
Gracias Oscar y gracias Alejandro.

Al final lo he solucionado de la siguiente forma:

Private Sub Cuadro_combinado1_Change()
Cuadro_combinado2.RowSource = "select [Nombre Submateria] from Submateria where [Nombre Materia]='" & Cuadro_combinado1.Value & "'"
Cuadro_combinado2.Requery
End Sub

  Respuesta:  Oscar Hernando Cabrera
HOLA SILVIA OJALA QUE TE PUEDA AYUDAR CON TU PREGUNTA, SINO CUALQUIER DUDA ME ESCRIBES A [email protected] .

HAZ UNA CONSULTA DE SELECCION LLENAS UNA VARIABLE DE TIPO RECORDSET Y LUEGO CON ESTA VARIABLE HACES UN FOR HASTA EL TOTAL DE REGISTROS DEVUELTOS Y VAS LLENANDO EL COMBO CON EL DATO REQUERIDO.......ES DECIR

Imaginemos dos tablas una de ellas es de proveedores(codprov,nomprov) y la otra productos(codprod,codprov,nomprod) como ves es una relacion de uno a muchos....el primer combo (lo llamaremos combo1) contiene los proveedores, y al selecionar uno quieres que en el otro combo (combo2) o lista, te muestre todos los productos de ese proveedor, entonces en el evento afterupdate (despues de actualizar) del combo1...

Private sub combo1_afterupdate
Dim reg As DAO.Recordset
Dim BaseDatoa as database
Dim Criterio as string

set BaseDatos = CurrentDb

if not isnull(combo1) then

Criterio = "Select nomprod from productos where codprov=" & combo1 & " "
set reg = BaseDatos.OpenRecordset(Criterio)

if reg.recordcount > 0 then
reg.movelast
reg.movefirst

for i=1 to reg.recordcount
combo2.AddItem reg(0)
reg.movenext
next i
end if

reg.close

end if
set BaseDatos = Nothing

end sub

NOTA : SE SUPONE QUE EL PRIMER COMBO TIENE DOS COLUMNAS, UNA DE ELLAS DONDE GUARDA codprov, Y LA OTRA nomprov, LA COLUMNA DEPENDIENTE SERIA 1(DONDE ESTA codprov) LA PRIMER COLUMNA SERIA BUENO QUE LA OCULTARA, EN LAS PROPIEDADES DEL COMBO1(NUMERO DE COLUMNAS COLOCAS 2 Y ANCHO DE COLUMNAS 0;(ANCHO DE COMBO1) PARA OCULTAR LA COLUMNA1).

OJALA TE SIRVA, ME ESCRIBES CUALQUIER DUDA

  Respuesta:  Alejandro Landini
Hola:
Una de las cosas que se me ocurre que podes hacer el lo siguiente.
en el evento "al cambiar.."
Tenes que actualizar el recordset del segundo combo.
ejemplo
Private Sub Cuadro_combinado0_Change()
'Debug.Print Me.Cuadro_combinado2.RowSource
Me.Cuadro_combinado2.RowSource = "SELECT [Tabla2].[Id], [Tabla2].[campo3], [Tabla2].[campo4] FROM Tabla2 where [Tabla2].[campo3] = '" & Me.Cuadro_combinado0.Column(1) & "';"
Me.Cuadro_combinado2.Requery
End Sub

despues vos te fijas que otro evento te sirve para poder optimizar el combo.
en este caso tengo dos combo y cambio en recorsourse del segundo en funcion de los datos del primero. podes complijar la consulta hasta donde quieras.

salu2

  Respuesta:  Oscar Hernando Cabrera
Hola Silvia, espero que te sirva mi respuesta sino me escribes a [email protected].

Para mostrar datos de una tabla en un combo utiliza una consulta en sql, y la guardas en una variable tipo recordset, la consulta llevará la condición que necesitas.

Es decir:
Imaginemos dos tablas: Proveedores(codprov,nomprov) , productos(codprod,nomprod,codprov) como ves es una relacion de uno a muchos.

El primer combo(llameremos combo1), posee los proveedores, y al escojer uno me debe mostar los productos que vende ese proveedor en el otro combo(llamaremos combo2). Ojo el combo1, debe tener dos columnas, la columna clave (codprov) es la primera y debe estar oculta, y la segunda (nomprov), la columna dependiente debe ser la uno (codprov , por que con este campo hare la condicion de la consulta).

Entonces:.....

Private sub Combo1_afterupdate()
Dim Criterio as string
Dim BaseDatos as database
Dim reg As DAO.Recordset

If not isnull(Combo1) then
set BaseDatos = CurrentDB

Criterio = "Select nomprod from Productos Where codprov= " & combo1 & " "
'va con comilla doble y ampersan, por que es tipo numerico, sino iria '" & combo1 & "', comilla sencilla,pegado comilla doble,ampersan.

set reg = BaseDatos.openrecordset(Criterio)

if reg.recordcount > 0 then
reg.movelast
reg.movefirst

for i=1 to reg.recordcount
combo2.additem reg(0)
reg.MoveNext
next i
end if

reg.close

set BaseDatos = Nothing
end if

End sub