Como puedo relacionar 3 combobox

Soy principiante en esto de la programación, estoy haciendo un sistema en visual basic 6.0 con access, el sistema muestra una ley, estoy manejando tres combobox en el cual en el primer combo se tiene que elegir un titulo, después según la opción elegida quiero que me aparezcan sus capítulos en el segundo combobox y según 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
2

2 respuestas

Respuesta
1
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
Así cada vez que hagas clic en un combo llenaras el siguiente basado en la selección del anterior...
Disculpa pero hay un detalle en el código 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 código anterior, pero con esto te queda listo
Hola boy14 gracias por la respuesta ya agregue lo que me escribiste solo que en le Data1.Refresh me marca error 3055 mira así 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!TITULO
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 TÍTULOS
El campo TITULO
El combobox cmbTitulo
No se que no estoy haciendo mal agradeceré me aclares mi duda voy empezando y unas cosas no las tengo bien definidas de antemano gracias
Mira aquí mando unos datos para a ver si con esto me puedo explicar más con respecto al sistema y haber si lo estoy haciendo bien en la distribución de los datos
Tengo una tabla TÍTULOS, donde contiene todos los títulos
para desplegarlos en el primer combo
que dependiendo del capitulo que escogí en el primer combo me aparezca su tabla
Después tengo una tabla de cada titulo
Ejemplo Capítulos del titulo uno
Capítulos de tiutlo dos ...
Y tengo una tabla de los artículos 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
Ok, lo primero es que el error te da es porque 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 relación a lo otro, no se si te entendí bien, tu tienes una tabla titulo y para cada titulo que esta almacenado allí tienes una tabla diferente es decir que si en la tabla titulo tienes 10 títulos de libros aparte de esta tabla tienes 10 tablas más (una por titulo)...
Hola, sí tengo una tabla "TITULOS" que contiene 8 títulos luego tengo 8 tablas cada una con nombrada según el Titulo y ésta contiene sus capítulos, y después 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 corregí lo que enviaste ahora marca el error 3343, estoy trabajando en eso, muchas gracias por tus respuestas
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
Así lo debes hacer en los otros combos, te elimino la sentencia select porque según lo que me dices en cada tabla vas a tener solo la información de un titulo..
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
así 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
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..
Gracias por todo, perdón por la demora en puntuar
Fue de gran utilidad el código, y gracias por la prontas respuestas eran super rápidas
Respuesta
-1
Tienes que programar en el evento click del combobox que elijas, se supone que cada combobox debe estar cargada con la información que mencionaste, y cada itenm de cada combox debe tener un índice, el mismo que diferencia un ítem de otro. La programación en el evento click de cada combo te da la pauta. Los pasos a seguir serían:
- La carga de información de cada combobox deben estar programados en tres funciones, uno para cada combobox.
- Programar en el evento click del combobox1 cuando se escoja del combo, llames a la función de carga del segundo combobox, enviando el índice a esta función, este índice te permite consultar como se va a cargar la información para el segundo combobox.
- Para escoger del segundo combobox es de la misma manera como se hizo en el primer combobox.
No se que tanto tienes de la programación, sino para enviarte un ejemplo.
Gracias por la respuesta, creo que si esa era la forma, tenia mucho tiempo de haber hecho esta pregunta y ya había sido contestada, de todas maneras muchas gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas