Visual Basic.NET - Sql a traves de un combobox

 
Vista:
Imágen de perfil de Carlos
Val: 116
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Carlos (40 intervenciones) el 13/07/2020 22:37:22
Muy buenas:
Tengo un combobox (CmbInsp), donde en el evento LostFocus efectuo la siguiente operación:
1
2
3
4
5
6
7
8
9
10
11
12
13
..
..
 Private Sub CmbInsp_LostFocus(sender As Object, e As EventArgs) Handles CmbInsp.LostFocus
sqlExp = "Select * from Expediente where Open_Close='O' and Id_Inspector='" & CmbInsp.Text & "' order by         Fecha asc"
Cargar_SQLite(sqlExp, DGridExp)
end  Sub
 
   Sub Cargar_SQLite(ByVal Sql As String, ByVal Tabla As DataGridView)
        Dim Da As New SQLiteDataAdapter(Sql, Con1)
        Dim Dt As New DataTable
        Da.Fill(Dt)
        Tabla.DataSource = Dt
    End Sub

la variable sqlExp esta definida al inicio del modulo

El problema reside en que la primera vez funciona perfectamente, pero la segunda y cambiando el valor del ComboBox, me arroja el siguiente error.
La operación no se puede realizar en este controlador de eventos----> la linea del error es Tabla.DataSource=Dt
LLevo tres dias mirando por internet y haciendo pruebas y nada no doy con el problema.
Gracias por anticipado
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 melqui
Val: 430
Bronce
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por melqui (122 intervenciones) el 14/07/2020 03:04:43
la verdad estoy viendo que estas cargando dentro del evento LostFocus que al quedar el focus el tiene que cargar el datagrid.
mas dentro de ese evento estoy viendo que no estas abriendo la base de datos

tente asi
1
2
3
4
5
6
7
8
9
Sub Cargar_SQLite(ByVal Sql As String, ByVal Tabla As DataGridView)
con1.open
        Dim Da As New SQLiteDataAdapter(Sql, Con1)
        Dim Dt As New DataTable
        Da.Fill(Dt)
        Tabla.DataSource = Dt
con1.close
 
    End Sub

y dentro del evento LostFocus, coloque una condicion asi

1
2
3
4
5
6
7
8
if CmbInsp.selectindex=-1 then
exit sub
else
 
sqlExp = "Select * from Expediente where Open_Close='O' and Id_Inspector='" & CmbInsp.Text & "' order by         Fecha asc"
Cargar_SQLite(sqlExp, DGridExp)
 
end if

CmbInsp.selectindex=-1
esto va ayudar cuando entrar en focus no haga nada hasta que digite algun valor.
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 Carlos
Val: 116
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Carlos (40 intervenciones) el 14/07/2020 08:54:48
Muy buenas y gracias por tu pronta respuesta;
he introducido los cambios y sigue exactamente igual, el mismo error en la misma linea.

Saludos
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 melqui
Val: 430
Bronce
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por melqui (122 intervenciones) el 14/07/2020 12:30:05
si esta dando problema, manda una imagen de tu codigo para veirifcar o
entonces cambie la forma que estas programando, mas lo que veo que estas haciendo tus declaracion por separado.

coloque una imagen con el error que esta presentando.
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 Carlos
Val: 116
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Carlos (40 intervenciones) el 14/07/2020 12:50:50
Muy buenas:
Perdona la insistencia, pero me trae loco, ya no sé por donde mirar.
Repito que la primera vez que pierde el Foco el ComboBox (evento LostFocus), me lo hace perfectamente bien, pero si deseo cambiar a otro elemento del combo es cuando me dá el error que comento, te adjunto pantalla con el error.

Lo que hago es al perder el foco genero la Sql con el valor escogido del ComboBox y llamo a la función que carga el DataGridView según esos parametros Cargar_Sqlite(MiSql,Datagrid)
MiSql= se genera al perder el foco el ComboBox
DataGrid es el DataGridView donde deseo que aparezcan los datos.

Gracias por tus molestias
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 melqui
Val: 430
Bronce
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por melqui (122 intervenciones) el 14/07/2020 22:36:58
mira estas errando mucho en los llamados datatables.
la verdad tienes que entender que los datatables son tablas virtuales que almazenas el la memoria,


Screenshot_4

mas voy a resumir de esta forma.

use asi el proceso de tu tratamiento, solo cambie las columnas y la tabla
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public sub cargar_datos
 
        Using cn As SqlConnection = new SqlConnection('aqui colocar el camino de la base de datos)
            Try
                cn.Open()
                Dim Script As String = "SELECT * FROM TABLA WHERE COLUNA_2 ='" & COMBOBOX.TEXT & "' ORDER BY COLUMNA_PARA_ORDENAR ASC"
                Dim cmd As New SqlCommand(Script, cn)
                               Dim da As New SqlDataAdapter(cmd)
   Dim dt As New DataTable
                da.Fill(dt)
 
                datagridview datasource= dt
 
            Catch ex As Exception
                msg(ex.message)
            Finally
                cn.Close()
            End Try
        End Using
 
   end suB

tal como te explique en el mensaje anterior dentro del focus use siempre como regla primordia. para que no se te agarre algun problema al momento de clicar en la caja del combobox.
a no ser si vas a digitar maior que -1.



1
2
3
4
5
if combobox.selectindex =-1 then
exit sub
else
call cargar_datos
end if


espero que este ayde
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
sin imagen de perfil
Val: 11
Ha aumentado su posición en 6 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Juan Antonio (6 intervenciones) el 14/07/2020 12:57:16
Buenas, creo que el problema lo tiene en la definicion: Dim Dt As New DataTable, prueba poniendo Dim Dt as data.datatable
El crear una instancia datatable sobre la variable, cuando entras de nuevo intenta crear una instancia sobre una variable que ya existe. yo en mi codigo lo hago asi y me funciona. tambien te digo que para ahorrarte unas lineas de codigo y creacion de variables, que esta linea
Da.Fill(Dt) la metas dentro SQLiteDataAdapter() y esta funcion devuelva un datatable. ademas tambien dentro de esa funcion pongas un try para que especifique mas los errores.

Un saludo y espero que funcione
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 Carlos
Val: 116
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Carlos (40 intervenciones) el 14/07/2020 23:08:12
Gracias por tu respuesta:

Comentarte que sigue igual aún cambiando por tu consejo Dim Dt as data.datatable, y con el Try ... end Try, el error sigue siendo el mismo que el adjunto en otro mensaje anterior.

Por si os sirve de ayuda, el error se produce al seleccionar un nuevo elemento y distinto del primero escogido en el combobox, si se selecciona por segunda vez el mismo que se escogió en la primera vez, el error no se produce.

Tambien me he dado cuenta de que este se produce cuando ya tiene datos el DataGridView (de la anterior selección), es decir que este no se vacia aunque cierre la conexión y lo recarge en otra. He intentado poner entre estas tres lineas tanto en la función Cargar_SqlLite

1
2
3
4
5
6
7
dt.clear()
Grid.Datasource=""
Grid.DataSource=Nothing  y sigo con el mismo problema
 
Dim Dt As New Data.DataTable
Grid.DataSource = ""
Da.Fill(Dt)

La operación no se puede realizar en este controlador de eventos
Me da la impresión que el problema viene por que el dataGridView ya tiene datos, pero no se donde vaciarlo si errores

Saludos y espero ideas GRACIAS
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 melqui
Val: 430
Bronce
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por melqui (122 intervenciones) el 14/07/2020 23:12:10
eso es error humano, jejeje
pues algun proceso estas haciendo diferente de loq ue estas programando.
en ese caso vas a necesitar analisar bien o usar el breackpoint para que identifiques
donde estas errando y porque.
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 Carlos
Val: 116
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Carlos (40 intervenciones) el 14/07/2020 23:58:11
Muy buenas de nuevo Melqui, gracias por las molestias:
he modificado el codigo tál como me has dicho y sigo con el mismo problema te paso los fuentes para que veas mas o menos el desarrollo del mismo

Con Public Function cargar_Combo es como alimento el combo que da problemas en el segundo acceso si el DataGridView tiene datos, he cambiado tu rutina para poder pasarle parametros desde el LostFocus del combo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Public Function cargar_Combo(ByVal ComboBox As ComboBox, ByVal sql As String)
    Cadena = "Data Source=" & RutaBaseDato
    Dim conexion = New SQLiteConnection(Cadena)
    Try
        conexion.Open() 'cn
 
        Dim cmd As New SQLite.SQLiteCommand(sql, conexion)
        ' Inicializar un nuevo SqlDataAdapter
        Dim da As New SQLite.SQLiteDataAdapter(cmd)
 
        Dim ds As New DataSet
        da.Fill(ds)
 
        ComboBox.DataSource = ds.Tables(0)
        ' Asignar el campo a la propiedad DisplayMember del combo
        ComboBox.DisplayMember = ds.Tables(0).Columns(0).Caption.ToString
    Catch ex As Exception
        MessageBox.Show(ex.Message.ToString,
                       "error", MessageBoxButtons.OK,
                       MessageBoxIcon.Error)
    Finally
        If conexion.State = ConnectionState.Open Then
            conexion.Close()
        End If
    End Try
    Return vbNull
End Function
 
Private Sub CmbInsp_LostFocus(sender As Object, e As EventArgs) Handles CmbInsp.LostFocus
    If CmbInsp.SelectedIndex = -1 Then
        Exit Sub
    Else
        sqlExp = "Select Id_Expediente,Traces,Tipo,FechaSum,FechaPar,Transitario,Mercancia,nPdf,Fisico,AV,Id_Estado,Pais," &
        "Open_Close,Bloqueo,Fumigado,CargaSeca,C_V,Tasa,Matricula from Expediente where Open_Close='O'" &
        " And Id_Inspector='" & CmbInsp.Text & "' order by FechaSum asc,FechaPar,Id_Expediente asc"
 
        Call cargar_datos_exp(sqlExp, CmbInsp.Text, DGridExp)
 
    End If
 
End Sub
 
Public Sub cargar_datos_exp(ByVal sql As String, ByVal cParam As String, ByRef Dgrid As DataGridView)
 
    Using Con1 As New SQLiteConnection("Data source=" & RutaBaseDato & "; version=3;")
 
        Try
 
            Con1.Open()
 
            Dim cmd As New SQLiteCommand(sql, Con1)
 
            Dim da As New SQLiteDataAdapter(cmd)
 
            Dim dt As New DataTable
 
            da.Fill(dt)
 
            Dgrid.DataSource = dt
 
        Catch ex As Exception
 
            MsgBox(ex.Message)
 
        Finally
 
            Con1.Close()
 
        End Try
 
    End Using
 
End Sub

Muchas gracias y espero ideas
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 melqui
Val: 430
Bronce
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por melqui (122 intervenciones) el 15/07/2020 01:17:36
carlos la verdad no vi las mudanzas que hiciste conforme mi ejemplo.
mas solo una cosa importante estoy viendo que estas llamando una consulta asi

1
from Expediente where Open_Close='O'" & 
despues usas el concatenar

claro que te da dando ese error porque le estas pidiendo que busque en la coluna
1
Open_Close
todos los registros que contine la letra
1
 'O' 

ahora no entendi por que unes el concatenar, mas imagino que quieres quebrar la linea entonces use asi
1
2
" Open_Close,Bloqueo,Fumigado,CargaSeca,C_V,Tasa,Matricula from Expediente where Open_Close='O' "
sqlExp += " And Id_Inspector= ' "

cuando usas concatenar estas diciendo a la tabla que necesito un parametro o variable para identicar que en este caso seria
1
CmbInsp.Text

mas en tu caso estas errando bstante es en el concatenar .[ & ]


como esta

Screenshot_1

como deveria quedar

Screenshot_2

siempre de un espacio despues de inicio de las comillas para que no ocurra ese erro tal como esta en mi ejemplo 2
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 Carlos
Val: 116
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Carlos (40 intervenciones) el 15/07/2020 06:44:43
Muy buenas de nuevo:

Si el error fuese la concatenación lo daría incluso la primera vez que entras en esa rutina, simplemente cortaba la linea con el &, de todas formas la he cambiado a como tu dices y seguimos igual.
Todo ha quedado de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Sub CmbInsp_LostFocus(sender As Object, e As EventArgs) Handles CmbInsp.LostFocus
    If CmbInsp.SelectedIndex = -1 Then
        Exit Sub
    Else
        sqlExp = "Select Id_Expediente,Traces,Tipo,FechaSum,FechaPar,Transitario,Mercancia,nPdf,Fisico,AV,Id_Estado,Pais,"
        sqlExp += " Open_Close,Bloqueo,Fumigado,CargaSeca,C_V,Tasa,Matricula from Expediente where Open_Close='O'"
        sqlExp += " And Id_Inspector='" & CmbInsp.Text & "' order by FechaSum asc,FechaPar,Id_Expediente asc"
        Call cargar_datos_exp(sqlExp, CmbInsp.Text, DGridExp)
    End If
End Sub
 
Public Sub cargar_datos_exp(ByVal sql As String, ByVal cParam As String, ByVal Dgrid As DataGridView)
    Using Con1 As New SQLiteConnection("Data source=" & RutaBaseDato & "; version=3;")
        Try
            Con1.Open()
            Dim cmd As New SQLiteCommand(sql, Con1)
            Dim da As New SQLiteDataAdapter(cmd)
            Dim dt As New DataTable
            da.Fill(dt)
            Dgrid.DataSource = dt
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            Con1.Close()
        End Try
    End Using
End Sub

Y sigo con el mismo problema, perdona las molestias que te estoy ocasionando.
Saludos
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 melqui
Val: 430
Bronce
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por melqui (122 intervenciones) el 15/07/2020 07:47:23
tranquilo,

la verdad, este metodo devia de solucior todo el problema
no se cual es el proposito de separar el string dentro del combobox y dentro de un trecho.
para mi seria duplo trabajo,
mas el proceso mas simples que puedo usar es conforme ya te lo pase, ahora
creo que puedes ser que tengas problemas de validacion en tus columnas.
necesitaria analisar mas con calma pues
viendo de lejos veo varios errores de declaracion de las variables sin tratamiento.
te recomiendo siempre que uses el try cada vez que vas usar una validacion.
ahora para mim la respuesta está en este condigo que te pase de lo vuelvo a colocar.
ahora si está dando problema necesitas verificar tu base de datos que tipo de datos estas trabajando.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public sub cargar_datos
 
    Using cn As SqlConnection = new SqlConnection('aqui colocar el camino de la base de datos)
        Try
            cn.Open()
            Dim Script As String = "SELECT * FROM TABLA WHERE COLUNA_2 ='" & COMBOBOX.TEXT & "' ORDER BY COLUMNA_PARA_ORDENAR ASC"
            Dim cmd As New SqlCommand(Script, cn)
                           Dim da As New SqlDataAdapter(cmd)
Dim dt As New DataTable
            da.Fill(dt)
 
            datagridview datasource= dt
 
        Catch ex As Exception
            msg(ex.message)
        Finally
            cn.Close()
        End Try
    End Using
 
end suB


cuando tienes un problema grave te recomiendo que uses el breackpoint para validar paso a paso en tu codigo asi evitas 90% de errores.
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 Carlos
Val: 116
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Carlos (40 intervenciones) el 15/07/2020 08:51:11
Muy buenas:

Considero que tu código es correcto, igual que el mio, de hecho los dos dan el mismo error, cuando el datagridview ya tiene datos y debe de cambiar esos por la nueva Sql. Efectuado el breack Point, el error es el ya comentado en ambos codigos:

La operación no se puede realizar en este controlador de eventos

Por eso me inclino a pensar que puede ser por los datos ya existentes, pero la verdad, no se como vaciar el Datasource para cambiarlo por los nuevos datos que se reciben desde el Combobox. Y parametrizo en el LostFocus del mismo la sql para coger el valor del Combobox.tex en mi caso CmbInsp.text.

Problemas con los nombres de columna no puede ser puesto que me carga correctame el primer DataGridView si hay datos.

Gracias y un saludo desde España
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 Carlos
Val: 116
Ha disminuido su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Sql a traves de un combobox

Publicado por Carlos (40 intervenciones) el 15/07/2020 09:20:18
Muy buenas:

Despúes de la tabarra que te he dado, comentar que la solución parece que ha sido simplemente hacer lo siguiente:

programar el evento GotFocus del combobox de la siguiente manera:

1
2
3
Private Sub CmbInsp_GotFocus(sender As Object, e As EventArgs) Handles CmbInsp.GotFocus
    DGridExp.DataSource = ""
End Sub

Y parece ser que ya funciona correctamente.

Saludos y gracias por todo
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

Sql a traves de un combobox

Publicado por Oscar Rivera C (13 intervenciones) el 17/07/2020 04:34:17
Buenas noches estimado, en todo caso para ahorrar código puedes probar dejar antes de asignar datos:

Private Sub CmbInsp_LostFocus(sender As Object, e As EventArgs) Handles CmbInsp.LostFocus

DGridExp.DataSource = nothing

sqlExp = "Select * from Expediente where Open_Close='O' and Id_Inspector='" & CmbInsp.Text & "' order by Fecha asc"
Cargar_SQLite(sqlExp, DGridExp)
end Sub
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