POPULAR DATAGRIDVIEW

MOREIRA 07/09/2017 22:42:38
#476376
Boa noite,

Só consigo popular a grid na primeira pesquisa, para fazer outra pesquisa, é necessário fechar o formulário.

ou seja, não preenche a grid conforme solicitado, porem, existe o cadastro

  Private Sub txt_FiltraNome_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles txt_FiltraNome.PreviewKeyDown

If e.KeyCode = Keys.Enter Then

Using con As FbConnection = GetConnection()

If ActionSelect = 0 Then
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
End If

If ActionSelect = 1 Then
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CPF LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
End If

Using cmd As New FbCommand(Sql_Cliente, con)
Using dr As FbDataReader = cmd.ExecuteReader()

FlexGrid.Rows.Clear()

Dim l As Integer
While dr.Read()
FlexGrid.Rows.Add()
FlexGrid.Item(0, l).Value = dr.Item([Ô]CODIGO[Ô]).ToString
FlexGrid.Item(1, l).Value = dr.Item([Ô]CPFCNPJ[Ô]).ToString
FlexGrid.Item(2, l).Value = dr.Item([Ô]CLIENTE[Ô]).ToString
FlexGrid.Item(3, l).Value = dr.Item([Ô]CELULAR[Ô]).ToString
FlexGrid.Item(4, l).Value = dr.Item([Ô]FANTASIA[Ô]).ToString

End While

cmd.Dispose()
dr.Close()

End Using
End Using
End Using

End If

End Sub

KERPLUNK 08/09/2017 09:45:19
#476382
1 - Use parametrização na sua query, não concatenação, que, aliás, está incorreta. O parâmetro [Ô]ORDER BY[Ô] precisa ser separado do apóstrofo do seu parâmetro concatenado.
2 - Não use FlexGrid, é um controle ActiveX e não tem porque ser usado com .NET, quando você tem um componente muito melhor, o DataGridView
3 - Tente usar OOP.
MOREIRA 08/09/2017 10:10:37
#476383
Citação:

:
1 - Use parametrização na sua query, não concatenação, que, aliás, está incorreta. O parâmetro [Ô]ORDER BY[Ô] precisa ser separado do apóstrofo do seu parâmetro concatenado.
2 - Não use FlexGrid, é um controle ActiveX e não tem porque ser usado com .NET, quando você tem um componente muito melhor, o DataGridView
3 - Tente usar OOP.




Não use FlexGrid é apanas nomenclatura que user para o nome,

estou usando o DataGridView.

Tente usar OOP, por favor, dê apenas uma caminho das pedras.
KERPLUNK 08/09/2017 10:45:47
#476384
Ok:
Para saber o que está acontecendo exatamente, todo seu procedimento deveria estar [Ô]protegido[Ô] por blocos try...catch. Com eles você conseguiria pegar a exceção que está acontecendo e onde. Tem vários pequenos problemas que podem ser a causa, você está fazendo dispose de objetos já coberto por blocos [Ô]using[Ô], como o objeto cmd por exemplo.
GUIMORAES 08/09/2017 13:28:27
#476388
Citação:

:
Boa noite,

Só consigo popular a grid na primeira pesquisa, para fazer outra pesquisa, é necessário fechar o formulário.

ou seja, não preenche a grid conforme solicitado, porem, existe o cadastro

  Private Sub txt_FiltraNome_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles txt_FiltraNome.PreviewKeyDown

If e.KeyCode = Keys.Enter Then

Using con As FbConnection = GetConnection()

If ActionSelect = 0 Then
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
End If

If ActionSelect = 1 Then
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CPF LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
End If

Using cmd As New FbCommand(Sql_Cliente, con)
Using dr As FbDataReader = cmd.ExecuteReader()

FlexGrid.Rows.Clear()

Dim l As Integer
While dr.Read()
FlexGrid.Rows.Add()
FlexGrid.Item(0, l).Value = dr.Item([Ô]CODIGO[Ô]).ToString
FlexGrid.Item(1, l).Value = dr.Item([Ô]CPFCNPJ[Ô]).ToString
FlexGrid.Item(2, l).Value = dr.Item([Ô]CLIENTE[Ô]).ToString
FlexGrid.Item(3, l).Value = dr.Item([Ô]CELULAR[Ô]).ToString
FlexGrid.Item(4, l).Value = dr.Item([Ô]FANTASIA[Ô]).ToString

End While

cmd.Dispose()
dr.Close()

End Using
End Using
End Using

End If

End Sub



MOREIRA,

Percebo vários problemas no preenchimento da sua grid, mas o principal é a forma com que você está populando ela.
Existem várias formas de se popular uma grid, mas você deve estar tentando utilizar ela como se fosse o flexgrid do vb6, lamento, mas não é nem de perto o melhor modelo.

O primeiro erro na sua estruturá está na falta do incremento para a variável [Ô]I[Ô] que você definiu fora do bloco.



Dim l As Integer
While dr.Read()
FlexGrid.Rows.Add()
FlexGrid.Item(0, l).Value = dr.Item([Ô]CODIGO[Ô]).ToString
FlexGrid.Item(1, l).Value = dr.Item([Ô]CPFCNPJ[Ô]).ToString
FlexGrid.Item(2, l).Value = dr.Item([Ô]CLIENTE[Ô]).ToString
FlexGrid.Item(3, l).Value = dr.Item([Ô]CELULAR[Ô]).ToString
FlexGrid.Item(4, l).Value = dr.Item([Ô]FANTASIA[Ô]).ToString

End While



Onde ela está sendo incrementada?

O ideal Seria:
  

Dim l As Integer = 0
While dr.Read()
FlexGrid.Rows.Add()
FlexGrid.Item(0, l).Value = dr.Item([Ô]CODIGO[Ô]).ToString
FlexGrid.Item(1, l).Value = dr.Item([Ô]CPFCNPJ[Ô]).ToString
FlexGrid.Item(2, l).Value = dr.Item([Ô]CLIENTE[Ô]).ToString
FlexGrid.Item(3, l).Value = dr.Item([Ô]CELULAR[Ô]).ToString
FlexGrid.Item(4, l).Value = dr.Item([Ô]FANTASIA[Ô]).ToString

i += 1

End While



Da forma que estava, ele estava sobrescrevendo o registro 0, pois o mesmo não avançava.

O controle datagridview pode ser populado de diversas formas, como manualmente, adicionando linha a linha, ou passando um datasource a mesma (fonte de dados), que pode ser um list<t> de um objeto, um datatable, em fim, existem alternativas melhores da que você está fazendo.

Outros detalhes que o Kerplunk já destacou também estão influenciando para o não funcionamento, como não conter espaço entre o [ô] e o ORDER BY...
Além disso, há falta de parametrização na sua query, que pode evitar futuros problemas, como o uso do apóstrofo na pesquisa, além da prevenção de sql injection.

MOREIRA 08/09/2017 13:40:43
#476390
  Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô]) 


Amigos, para ser sincero, e perguntar não custa nada.. muito pelo contrario !

Como seria a melhor forma de parametrização essa query.

por favor,




KERPLUNK 08/09/2017 13:53:32
#476391
Bem você tem nessa query um parâmetro apenas, então é bem simples, adicione o parâmetro no comando e o alias dele na query.
GUIMORAES 08/09/2017 16:31:41
#476395
Tipo assim.

  

dim sql as string = [Ô][Ô]
sql = [Ô]Select * from tbcliente where cliente like @filtrarNome || [ô]%[ô][Ô]

Using cmd As New FbCommand(Sql_Cliente, con)

cmd.paramters.add([Ô]@filtrarNome[Ô], Me.txt_FiltraNome.Text)

Using dr As FbDataReader = cmd.ExecuteReader()
.......


NOWLIGHTS 11/09/2017 16:50:32
#476442
Cara, tenta fazer dessa forma, usando classes;

  Public Class Cliente
Public Id As integer
Public Propperty Cpf As String
Public Propperty Cliente As String
Public Propperty Celular As String
Public Propperty Fantasia As String

Public Sub New (_Id As Integer, _Cpf As String, _Cliente As String, _Celular As String, _Fantasia As String)
Me.Id = _Id
Me.Cpf = _Cpf
Me.Cliente = _Cliente
Me.Celular = _Celular
Me.Fantasia = _Fantasia
End Sub

Public Shared Function BuscarCliente(Valor As String) As List(of Cliente)
Dim Slq As String = [Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô]%[Ô] & Valor & [Ô]%[ô] Order By CLIENTE ASC;[Ô]
Dim result As New List(Of Cliente)
Try
Using conn As New MySqlConnection([Ô]Servidor[Ô])
Using cmd As New MySqlCommand(Slq, conn)
Try
conn.Open()
Catch ex As Exception
MsgBox([Ô]Houve um erro ao abrir uma conexão com o servidor[Ô] & vbNewLine & vbNewLine & ex.ToString)
End Try
Try
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
result.Add(New Cliente(rdr.Item([Ô]CODIGO[Ô]),
rdr.Item([Ô]CPFCNPJ[Ô]).ToString,
rdr.Item([Ô]CLIENTE[Ô]).ToString,
rdr.Item([Ô]CELULAR[Ô]).ToString))


End While
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Using
End Using
Catch ex As Exception
MsgBox([Ô]Houve um erro inesperado![Ô] & vbNewLine & vbNewLine & ex.ToString)
End Try
Return (result)
End Sub
End Class


Ai para chamar e preencher a datagridview:

  Dim Conex As Cliente
Dim List = Conex.BuscarCliente(Me.txt_FiltraNome.Text)
For Each i As Cliente In List
DataGridView1.Rows.Add(i.Id, i.Cpf, i.Cliente, i.Celular, i.Fantasia)
End For

GUIMORAES 11/09/2017 17:53:34
#476444
Citação:

:
Cara, tenta fazer dessa forma, usando classes;

  Public Class Cliente
Public Id As integer
Public Propperty Cpf As String
Public Propperty Cliente As String
Public Propperty Celular As String
Public Propperty Fantasia As String

Public Sub New (_Id As Integer, _Cpf As String, _Cliente As String, _Celular As String, _Fantasia As String)
Me.Id = _Id
Me.Cpf = _Cpf
Me.Cliente = _Cliente
Me.Celular = _Celular
Me.Fantasia = _Fantasia
End Sub

Public Shared Function BuscarCliente(Valor As String) As List(of Cliente)
Dim Slq As String = [Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô]%[Ô] & Valor & [Ô]%[ô] Order By CLIENTE ASC;[Ô]
Dim result As New List(Of Cliente)
Try
Using conn As New MySqlConnection([Ô]Servidor[Ô])
Using cmd As New MySqlCommand(Slq, conn)
Try
conn.Open()
Catch ex As Exception
MsgBox([Ô]Houve um erro ao abrir uma conexão com o servidor[Ô] & vbNewLine & vbNewLine & ex.ToString)
End Try
Try
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
result.Add(New Cliente(rdr.Item([Ô]CODIGO[Ô]),
rdr.Item([Ô]CPFCNPJ[Ô]).ToString,
rdr.Item([Ô]CLIENTE[Ô]).ToString,
rdr.Item([Ô]CELULAR[Ô]).ToString))


End While
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Using
End Using
Catch ex As Exception
MsgBox([Ô]Houve um erro inesperado![Ô] & vbNewLine & vbNewLine & ex.ToString)
End Try
Return (result)
End Sub
End Class


Ai para chamar e preencher a datagridview:

  Dim Conex As Cliente
Dim List = Conex.BuscarCliente(Me.txt_FiltraNome.Text)
For Each i As Cliente In List
DataGridView1.Rows.Add(i.Id, i.Cpf, i.Cliente, i.Celular, i.Fantasia)
End For



Só falta a parametrização.
Tópico encerrado , respostas não são mais permitidas