Inicio > Visual Basic > boy14 > como puedo relacionar 3 combobox

como puedo relacionar 3 combobox

Experto:
Usuario:
Fecha: 12/10/2007
Valoración: (4,00 sobre 5) Categoría: Visual Basic
11/09/2007
ilagam, usuario preguntando en Visual Basic
Usuario
Hola soy principiante en esto de la programación, estoy haciendo un sistema en visual basic 6.0 con acces, el sistema muetra una ley, estoy manejando tres combobox en el cual en el primer combo se tiene que elegir un titulo, despues segun la opcion elegida quiero que me aparezcan sus capítulos en el segundo combobox y segun el capítulo elegido, que aparezcan sus artículos en el ultimo combobox para una vez elegido el titulo capitulo y artículo se despliegue el contenido en un textbox, necesito saber como relacionarlos,nunca hehecho, esto espero su pronta respuesta por favor!!!, gracias
11/09/2007
ilagam, experto respondiendo en Visual Basic
Experto
hola, tienes 3 combo y 1 text; agrega ademas al formulario 4 controles data, luego haz lo siguiente:
1) En el load del formulario copia:
Data1.DatabaseName = App.Path & "\bd.mdb" ' nombre de la base de datos
Data1.RecordSource = "nombretabla" ' nombre de la tabla donde tienes los datos requeridos
Data1.Refresh
'se llena el 1er combo con los datos de la tabla
With Combo1
.Clear
Data1.Refresh
While Not Data1.Recordset.EOF
.AddItem Data1.Recordset!titulo ' nombre del campo de la tabla que tiene en la base de datos
Data1.Recordset.MoveNext
Wend
End With

2) en el evento clic de los otros combo:

Private Sub Combo1_Click()
Data2.DatabaseName = App.Path & "\bd.mdb" ' nombre de la base de datos
Data2.RecordSource = "SELECT * FROM nombretabla WHERE trim(nombretabla.titlulo) >= '" + Trim(Combo1) + "'" ' puedes cambiar el criterio de busqueda a tu necesidad
Data2.Refresh

With Combo2
.Clear
Data2.Refresh
While Not Data2.Recordset.EOF
.AddItem Data2.Recordset!capitulo ' nombre del campo de la tabla que tiene en la base de datos
Data2.Recordset.MoveNext
Wend
End With
End Sub


Private Sub Combo2_Click()
Data3.DatabaseName = App.Path & "\bd.mdb" ' nombre de la base de datos
Data3.RecordSource = "SELECT * FROM nombretabla WHERE trim(nombretabla.capitulo) >= '" + Trim(Combo2) + "'" ' puedes cambiar el criterio de busqueda a tu necesidad
Data3.Refresh

With Combo3
.Clear
Data3.Refresh
While Not Data3.Recordset.EOF
.AddItem Data3.Recordset!capitulo ' nombre del campo de la tabla que tiene en la base de datos
Data3.Recordset.MoveNext
Wend
End With
End Sub

Private Sub Combo3_Click()
Data4.databaseName = App.Path & "\bd.mdb" ' nombre de la base de datos
Data4.RecordSource = "SELECT * FROM nombretabla WHERE trim(nombretabla.capitulo) >= '" + Trim(Combo3) + "'" ' puedes cambiar el criterio de busqueda a tu necesidad
Data4.Refresh

text1.text=""
With text1
Data4.Refresh
While Not Data4.Recordset.EOF
.AddItem Data4.Recordset!articulo ' nombre del campo de la tabla que tiene en la base de datos
Data4.Recordset.MoveNext
Wend
End With
End Sub

asi cada vez que hagas clic en un combo llenaras el siguiente basado en la seleccion del anterior... espero te sirva, saludos..
12/09/2007
ilagam, experto respondiendo en Visual Basic
Experto
mira disculpa pero hay un detalle en el codigo anterior, modifica los unicamednte donde dice data.RecordSource (de los data) de la siguiente manera:

Private Sub Combo1_Click()
Data2.RecordSource = "SELECT * FROM nombretabla WHERE trim(nombretabla.titlulo) = '" + Trim(Combo1) + "'" ' puedes cambiar el criterio de busqueda a tu necesidad
Data2.Refresh
End Sub


Private Sub Combo2_Click()
Data3.RecordSource = "SELECT * FROM nombretabla WHERE trim(nombretabla.capitulo) = '" + Trim(Combo2) + "' and trim(nombretabla.titlulo) = '" + Trim(Combo1) + "'" ' puedes cambiar el criterio de busqueda a tu necesidad
Data3.Refresh
End Sub


Private Sub Combo3_Click()
Data4.RecordSource = "SELECT * FROM nombretabla WHERE trim(nombretabla.capitulo) = '" + Trim(Combo3) + "' and trim(nombretabla.capitulo) = '" + Trim(Combo2) + "' and trim(nombretabla.titlulo) = '" + Trim(Combo1) + "'"" ' puedes cambiar el criterio de busqueda a tu necesidad
Data4.Refresh
End Sub


disculpa por el detalle (omicion en el select) en el codigo anterior, pero con esto te queda listo
12/09/2007
ilagam, usuario preguntando en Visual Basic
Usuario
hola boy14 gracias por la respuesta ya agregue lo que me escribiste solo que en le Data1.Refresh me marca error 3055 mira asi es como me quedo la primera parte


Private Sub Form_Load()


Data1.DatabaseName = App.Path & "C:\Sistema Ley y Reglamento\BD LEY Y REGLAMENTO.mdb"
Data1.RecordSource = "TITULOS"

Data1.Refresh

With CmbTitulo

.Clear

Data1.Refresh
While Not Data1.Recordset.EOF
.AddItem Data1.Recordset!TÍTULO
Data1.Recordset.MoveNext
Wend
End With


End Sub


mi bd esta en C:\Sistema Ley y Reglamento\BD LEY Y REGLAMENTO.mdb

mi tabla se llama TITULOS
el campo TÍTULO
el combobox cmbTitulo

no se que no estoy haciendo mal agradecere me aclares mi duda voy empezando y unas cosas no las tengo bien definidas de antemano gracias
12/09/2007
ilagam, usuario preguntando en Visual Basic
Usuario
mira aqui mando unos datos para a ver si con esto me puedo explicar mas con respecto al sistema y haber si lo estoy haciendo bien en la distribución de los datos

tengo una tabla TITULOS, donde contiene todos los títulos
para desplegarlos en el primer combo
que dependiendo del capitulo que escogi en el primer combo me aparesca su tabla

despues tengo una tabla de cada titulo
ejemplo Capitulos del titulo uno
Capitulos de tiutlo dos .....


y tengo una tabla de los articulos de cada capítulo

ej. articulos del cap1 tit 1
art del cap 2 tit 1
art del cap 1 tit 2....

no se si este bien la información para poder relacionarla en los combo disculpa si escribo datos de sobra pero necesito la ayuda gracias
13/09/2007
ilagam, experto respondiendo en Visual Basic
Experto
ok, lo primero es que el error te da es porqe en el data no debes copiar la ruta, pon lo siguiente:

Data1.DatabaseName = App.Path & "\BD LEY Y REGLAMENTO.mdb"' el App.Path se usa para que busque la ruta del directorio actual (es decir la carpeta donde esta guardado el sistema), por lo que solo hay que copiar solo el nombre de la base de datos..

en relacion a lo otro, no se si te entendi bien, tu tienes una tabla titulo y para cada titulo que esta almacenado alli tienes una tabla diferente es decir que si en la tabla titulo tienes 10 titulos de libros aparte de esta tabla tienes 10 tablas mas (una por titulo)...
13/09/2007
ilagam, usuario preguntando en Visual Basic
Usuario
Hola, sí tengo una tabla "TITULOS" que contiene 8 títulos luego tengo 8 tablas cada una con nombrada según el Título y ésta contiene sus capítulos, y despues tengo una tabla de cada capítulo y sus contenido son sus artículos, esto lo hago para poder desplegar los tiulos, capítulos y artículos en los combobox

ya corregi lo que enviaste ahora marca el error 3343, estoy trabajando en eso, muchas gracias por tus respuestas
13/09/2007
ilagam, experto respondiendo en Visual Basic
Experto
ok, el error que te da ahora es porque estas trabajando con una bd de access 2000, debes combertirla a access 97, para que elimines el error (lo puedes hacer en access busca herramientas, luego selecciona utilidades de la base de datos, luego convertir base de datos y luego selecciona a formato de archivo access 97)..
por lo que me dices de las tablas que tienes entonces haz lo siguiente:

Private Sub Combo1_Click()
Data2.DatabaseName = App.Path & "\bd.mdb" ' nombre de la base de datos
If Combo1.ListIndex = 0 Then
Data2.RecordSource = "titulo1" ' nombre de la tabla donde tienes los datos requeridos
Else
If Combo1.ListIndex = 1 Then
Data2.RecordSource = "titulo2" ' nombre de la tabla donde tienes los datos requeridos
Else
Data2.RecordSource = "titulo3"
End If
End If
Data2.Refresh

With Combo2
.Clear
Data2.Refresh
While Not Data2.Recordset.EOF
.AddItem Data2.Recordset!capitulo ' nombre del campo de la tabla que tiene en la base de datos
Data2.Recordset.MoveNext
Wend
End With
End Sub

asi lo debes hacer en los otros combos, te elimino la sentencia select porque segun lo que me dices en cada tabla vas a tener solo la informacion de un titulo..
18/09/2007
ilagam, usuario preguntando en Visual Basic
Usuario
hola soy yo otra vez mira ya hice lo que enviaste, gracias funcionó muy bien, ahora lo que no se hacer es mostrarlo en el text box
asi es como me quedó

Private Sub Form_Load()


Data1.DatabaseName = App.Path & "\BD LEY Y REGLAMENTO.mdb" '
Data1.RecordSource = "TITULOS" Data1.Refresh


With CmbTitulo



Data1.Refresh
While Not Data1.Recordset.EOF
.AddItem Data1.Recordset!TÍTULO
Data1.Recordset.MoveNext
Wend

End With
End Sub



Private Sub CmbTitulo_Click()




Data2.DatabaseName = App.Path & "\BD LEY Y REGLAMENTO.mdb"

If CmbTitulo.ListIndex = 0 Then
Data2.RecordSource = "CAPTIT1" Else

If CmbTitulo.ListIndex = 1 Then
Data2.RecordSource = "CAPTIT2" Else

If CmbTitulo.ListIndex = 2 Then
Data2.RecordSource = "CAPTIT3"
Else

If CmbTitulo.ListIndex = 3 Then
Data2.RecordSource = "CAPTIT4"
Else

If CmbTitulo.ListIndex = 4 Then
Data2.RecordSource = "CAPTIT5"
Else

If CmbTitulo.ListIndex = 5 Then
Data2.RecordSource = "CAPTIT6"
Else

If CmbTitulo.ListIndex = 6 Then
Data2.RecordSource = "CAPTIT7"
Else

If CmbTitulo.ListIndex = 7 Then
Data2.RecordSource = "CAPTIT8"
Else


Data2.RecordSource = "CAPTRANSITORIOS"



End If
End If
End If
End If
End If
End If
End If
End If

Data2.Refresh

With CmbCapitulo
.Clear
Data2.Refresh
While Not Data2.Recordset.EOF
.AddItem Data2.Recordset!CAPÍTULO

Data2.Recordset.MoveNext
Wend
End With

End Sub


Private Sub CmbCapitulo_Click()

Data3.DatabaseName = App.Path & "\BD LEY Y REGLAMENTO.mdb"

If CmbCapitulo.ListIndex = 0 And CmbTitulo.ListIndex = 0 Then
Data3.RecordSource= "ART_TIT1_UNICO"
Else

If CmbCapitulo.ListIndex = 0 And CmbTitulo.ListIndex = 1 Then
Data3.RecordSource = "ART_TIT2_UNICO" ' nombre de la tabla donde tienes los datos requeridos
Else

If CmbCapitulo.ListIndex = 0 And CmbTitulo.ListIndex = 2 Then
Data3.RecordSource = "ART_TIT3_1"
Else

If CmbCapitulo.ListIndex = 1 And CmbTitulo.ListIndex = 2 Then
Data3.RecordSource = "ART_TIT3_2"
Else

If CmbCapitulo.ListIndex = 2 And CmbTitulo.ListIndex = 2 Then
Data3.RecordSource = "ART_TIT3_3"
Else

If CmbCapitulo.ListIndex = 0 And CmbTitulo.ListIndex = 3 Then
Data3.RecordSource = "ART_TIT4_1"
Else

If CmbCapitulo.ListIndex = 1 And CmbTitulo.ListIndex = 3 Then
Data3.RecordSource = "ART_TIT4_2"
Else

If CmbCapitulo.ListIndex = 0 And CmbTitulo.ListIndex = 4 Then
Data3.RecordSource = "ART_TIT5_UNICO"
Else

If CmbCapitulo.ListIndex = 0 And CmbTitulo.ListIndex = 5 Then
Data3.RecordSource = "ART_TIT6_UNICO"
Else

If CmbCapitulo.ListIndex = 0 And CmbTitulo.ListIndex = 6 Then
Data3.RecordSource = "ART_TIT7_UNICO"
Else

If CmbCapitulo.ListIndex = 0 And CmbTitulo.ListIndex = 7 Then
Data3.RecordSource = "ART_TIT8_1"
Else

If CmbCapitulo.ListIndex = 1 And CmbTitulo.ListIndex = 7 Then
Data3.RecordSource = "ART_TIT8_2"
Else

Data3.RecordSource = "ART_TRANSITORIOS"




End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If

Data3.Refresh

With CmbArticulo
.Clear
Data3.Refresh
While Not Data3.Recordset.EOF
.AddItem Data3.Recordset!ARTÍCULO


Data3.Recordset.MoveNext
Wend
End With


End Sub

no se seguir la misma rutina con el otro combo para que me los muestre en le text box, bueno espero su respuesta, de antemano muchas gracias por todo
19/09/2007
ilagam, experto respondiendo en Visual Basic
Experto
hola, mira yo estoy asumiendo que la caja de texto se llama CmbArticulo, entonces:

luego de donde tienes: Data3.Refresh

donde tienes:

With CmbArticulo
.Clear
Data3.Refresh
While Not Data3.Recordset.EOF
.AddItem Data3.Recordset!ARTÍCULO


Data3.Recordset.MoveNext
Wend
End With

cambia todo eso por:

CmbArticulo.text="" 'limpia la caja de texto
With Data3.Refresh
If .RecordCount <> 0 Then
While Not .EOF
CmbArticulo = Data4.Recordset!articulo
.MoveNext
Wend
End If
End With

suerte y saludos..
12/10/2007
ilagam, usuario preguntando en Visual Basic
Usuario
Gracias por todo, perdon por la demora en puntuar
fue de gran utilidad el codigo, y gracias por la prontas respuestas eran super rapidas
Enlaces patrocinados