Visual Basic.NET - ComboBox vinculados de tablas SQL SERVER

 
Vista:
Imágen de perfil de nano

ComboBox vinculados de tablas SQL SERVER

Publicado por nano (20 intervenciones) el 12/08/2015 09:12:48
Muy buenas a todos!!!
Continuando con mi humilde proyecto con el que aprender VB tengo un pequeño problema que no consigo solventar o encontrar la solución:
Tengo dos ComboBox que despliegan un campo de las tablas Categoria y Subcategoria respectivamente.
En la tabla Subcategoria hay un campo FK con la ref del id_categoria que es la PK de CATEGORIA en SQL SERVER
La idea es que cuando yo seleccione una categoria sólo me aparezan en el combobox de subcategorias las suyas, y no todas al completo.
Por poner un ejemplo de mi proyecto: Si yo despliego la categoria creada como "Vivienda", no quiero que me aparezca la subcategoria de "Seguro del automovil" que corresponde con la categoria de "Automovil" y de esta manera facilitar la creacion de registros de forma mas dinámica.
Intuyo que debe ser mas trivial de lo que me creo, pero no he conseguido enlazarlas.
Os dejo un par de imágenes de mi proyecto para que lo podais ver mejor.
Muchas gracias de antemano por vuestras respuestas.
Nano.

errorcontaH1
errorcontaH2

errorcontaH3
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

ComboBox vinculados de tablas SQL SERVER

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 12/08/2015 20:15:48
Si ya sabes como llenar el combobox, es tan sencillo como llenar tu combobox subcategorias pero en el evento
SelectionchangeCommitted

No se si usas POO o codigo directo, pero alli en ese evento es donde harías el cambio según la categoría:

La consulta sería mas o menos así:

"Select Campo1,Campo2 From SubCategorias Where IdCategoría=@IdCategoria"

Como parámetro de @IdCategoría le asignas Convert.ToInt32(CboCategoria.SelectedValue)

Saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de giancarlo
Val: 377
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

ComboBox vinculados de tablas SQL SERVER

Publicado por giancarlo (488 intervenciones) el 13/08/2015 05:30:44
Yo normalmente uso el evento selectedindexchanged o algo asi y el selectedvaluechanged, cual es la diferencia con selectionchangecommited?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

ComboBox vinculados de tablas SQL SERVER

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 13/08/2015 06:51:59
Mi estimado giancarlo, ya diferencia está en que ese evento se dispara a cada momento, sobre todo al cargar el formulario, sin que tu lo invoques, en cambio el selectionchangecommitted, solo cuando tu lo confirmas con el mouse, en cambio el otro se anda ejecutando a cada momento y muchas veces genera problemas.

Saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de giancarlo
Val: 377
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

ComboBox vinculados de tablas SQL SERVER

Publicado por giancarlo (488 intervenciones) el 13/08/2015 09:03:35
Si, sobre todo cuando al cargar el formulario debes cargar combo of y se disparan esos eventos, aunque yo solucione eso poniendo el valuemenber y display menber primero y luego el datasource, aunque no comprobé si se disparaba el evento, pero... Tienes razón y desde ahora empezare a usarlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de nano

ComboBox vinculados de tablas SQL SERVER

Publicado por nano (20 intervenciones) el 13/08/2015 23:29:10
Muchas gracias a ambos!!
Me pongo a ello a ver si no me da mucha guerra...
Saludos,
Nano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de nano

ComboBox vinculados de tablas SQL SERVER

Publicado por nano (20 intervenciones) el 15/08/2015 21:04:22
Muy buenas nuevamente!!!
Producto de mi nivel de principiante en esto de VB.Net pero que cada día me apasiona más, no me ha dejado de dar errores en tiempo de ejecución las propuestas de arriba y que no consigo solventar. Producto de ello he conseguido solventarlo haciendo una especie de ñapa que me gustaría me comentárais si realmente no afecta a la aplicación, pero que no deja de ser un apaño aunque funcionar, funciona:
Después de varios y diversos retoques las tablas son las siguientes:

CATEGORIAS: id_categoria, descripcion_categoria, observaciones
SUBCATEGORIAS: id_subcategoria, descripcion_subcategoria, descripcion_categoria, observaciones

Para traerme los datos de categorias a mi combobox uso las siguientes instrucciones:

' LLAMA A LA TABLA SQL DE CATEGORIAS Y MUESTRA LOS DATOS DE DESCRIPCION_CATEGORIAS EN COMBOCAT ORDENADO POR DESC
Private Sub llenarcombocat1()
Dim dtcat1 As DataTable
With cmd
.CommandType = CommandType.Text
.CommandText = "select descripcion_categoria from categorias ORDER BY DESCRIPCION_CATEGORIA"
.Connection = conn
End With
da.SelectCommand = cmd
dtcat1 = New DataTable
da.Fill(dtcat1)
With CboCat
.DataSource = dtcat1
.DisplayMember = "descripcion_categoria"
.ValueMember = "descripcion_categoria"
End With
End Sub


Utilizo un TextBox para guardar el regitro elegido de mi combobox de categorias:

Private Sub CboCat_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CboCat.SelectedIndexChanged
Dim selecat As String
selecat = CboCat.SelectedItem(0)
Dim consulta = From miregistro In vista.registros Where miregistro.descripcion_categoria = selecat
For Each campos In consulta
TxtBCat.Text = campos.descripcion_categoria
Next
End Sub


Traigo los datos de los registros de subcategorias con la condición de descripcion_subcategoria sea igual al dato guardado en el textbox anterior:


'LLAMA A LA TABLA SQL DE SUBCATEGORIAS Y MUESTRA LOS DATOS DE DESCRIPCION_SUBCATEGORIAS EN CBOSUB ORDENADOR POR DESCRIPCION
Private Sub llenarcombosubX()
Dim dtsub1 As DataTable
With cmd
.CommandType = CommandType.Text
.CommandText = "select descripcion_subcategoria from subcategorias where descripcion_categoria=" & "'" & TxtBCat.Text & "'"
.Connection = conn
End With
da.SelectCommand = cmd
dtsub1 = New DataTable
da.Fill(dtsub1)
With CboSub
.DataSource = dtsub1
.DisplayMember = "descripcion_subcategoria"
.ValueMember = "descripcion_subcategoria"
End With
End Sub


Y fnalmente con un botón habilito el combo de subcategorias y ejecuto la instruccion anterior:

Private Sub BtHabSub_Click(sender As Object, e As EventArgs) Handles BtHabSub.Click
CboSub.Enabled = True
llenarcombosubX()
End Sub


Intuyo que hay soluciones mucho mas fáciles y directas pero que no he conseguido que funcionaran por un problema de errores en tiempo de ejecución, con lo cual me he planteado la idea de poner un botón que no me convence y seguro es mas embadurnado a la hora de entender todo el código.

Si teneis alguna otra sugerencia o solución mas sencilla os lo agradecería.
Saludos,
Nano.
errores_combosanidados
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

ComboBox vinculados de tablas SQL SERVER

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 15/08/2015 21:58:20
Bueno, ahora que expones la estructura de tus tablas, me voy a tomar la libertad de decirte que tienes mal planteado el modelo relacional.

Tu tabla Categorías debería tener una estructura mas o menos así:

IdCategoria int identity(1,1)
Descripción_Categoría Varchar(100)


Sub categorías:

IdSubCategoria int identity(1,1)
Descripción_subCategoria varchar(100)
IdCategoria int (FK)

Crear la relación entre Categoría y subCategoria (FK sería la clave foránea de categoría que en categoría es la clave primaria)

Con lo cual tendrías relacionada cada subcategoría a una categoría por el IdCategoría.

Teniendo eso, lo único que tendrías que hacer es llenar tu combobox de categorías con una consulta como esta:

"Select IdCategoria,Descripcion_Categoria From Categorias"

ComboboxCategorias.Displaymember ="Descripcion_Categoría"
ComboBoxCategorias.Valuemember="IdCategoria"

Entonces como indiqué en el post anterior, en el evento SelectionchangeCommitted llenarías el combobox subcategorías con una consulta tan simple como esta:

"Select IdSubCategoria,Descripcion_SubCategoria From SubCategorías Where IdCategoria=@IdCategoria"

y en tu cmdsubcategoria, parasarías un parámetros mas o menos así:

cmdsubcategoria.Parameters.Add("@IdCategoria",SqlDbType.int).Value=Convert.ToInt32(ComboboxSubcategorias.SelectedValue)

ComboboxSubCategorias.Displaymember="Descripcion_SubCategoria"
ComboboxSubCategoria.ValueMember="IdSubcategoria"

Con eso como verás solo tendrías que hacer 4 lineas de código y tener cada vez que selecciones una categoria diferente, se llenarán las subcategorías correspondientes a esa categoría seleccionada, eso es muy simple, es cosa que hacemos casi a diario, con la diferencia que buen en mi caso todo ello lo hago OO y en capas, que solo llamo al método que me devuelve las subcategorias.

Es cosa que adaptes lo que te digo, no he puesto todo el código, por obvias razones, pero como te dije tu problema radica en que no tienes bien relacionadas tus tablas categorías con subcategorías.

Espero haberte dado una luz.

Si tienes algún inconveniete al respecto me avisas para echarle una mirada via teamviewer y darte algunos alcances mas al respecto.

Saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de nano

ComboBox vinculados de tablas SQL SERVER

Publicado por nano (20 intervenciones) el 15/08/2015 22:24:58
Tienes toda la razón del mundo con el modelo relacional, pues era así como lo tenía anteriormente.
Pero lo cambié por temas de comodidad dejando PK con los nombres en cada tabla y su FK para las relaciones.
De hecho los ID de todas las tablas son autonumericos del 1000 al 5000 según la tabla y por otro lado al tener el PK en las descripciones de las categorias, operaciones, subcategorias evito que se pueda repetir el mismo registro al no permitir duplicados.
Cierto es, insisto, que los ID deberían de ser los PK pero a lo mejor habría que crear una relacion entre:

subcategorias.descripcion_categoria(FK) = categorias.descripcion_categoria(PK)

y de esta forma relacionar ambas tablas... ????

mr_contahome

Muchas gracias por el interés mostrado y voy a ver por donde lo ataco... pues a pesar de encontrar una solución con los combobox anidados, me interesa buscar alternativas mas acertadas y sencillas como la que me propones.

Un saludo,
Nano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

ComboBox vinculados de tablas SQL SERVER

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 16/08/2015 06:48:54
Fíjate que según la imagen que tienes, no veo una relación entre Categoría y subcategoría entonces por allí estás ya teniendo problemas, mas adelante cuando quieras hacer alguna consulta cuando tengas muchos datos, vas a tener registros repetidos.

Fíjate que no es una buena idea tener un primary key por la descripción, hay otras maneras de evitar registros duplicados pero no por primary key.

La solución que te dije es la que mas se aproxima a la mayoría de casos, piensa en replantear tu modelo relacional, ahora que estás empezando, si empiezas a tener datos, la cosa se hará mas complicada.

Saludos cordiales
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar