VB - Busca dinâmica com MSFlexgrid


O componente MSFlexGrid é um componente muito versátil ; além de não ser um componente muito 'pesado' se comparado com outros componentes do tipo grid.

Neste artigo vou mostrar como podemos realizar uma busca dinâmica exibindo os resultados em um controle MSFlexgrid.

Vamos supor que sua aplicação possua um base de clientes e que você precisa cadastrar alguns destes clientes em uma tabela , que eu vou chamar Cadastro.  Os dados já estão em uma tabela chamada tblClientes e você só precisa selecionar o cliente desejado para que o mesmo seja salvo na tabela Cadastro. (Você pode imaginar muitas outras variantes para esta situação)

Ambas as tabelas estão no banco de dados Clientes.mdb.

Neste artigo vou mostrar como você pode criar um formulário para buscar e selecionar clientes de forma dinâmica exibindo o resultado em um MSFlexgrid de forma que ao selecionar o cliente da relação o mesmo estará apto a ser salvo na tabela Cadastro com um clique de mouse.

A estrutura das duas tabelas é a seguinte:

Inicie agora mesmo um novo projeto no VS e no formulário padrão inclua os componentes conforme o layout a seguir:

O nome de cada controle esta em azul.

Eu optei por usar o nome padrão dos controles , mas não aconselho esta prática em uma aplicação de produção.

O nome do formulário é : frmlocalizaCliente

 

Temos como critério de busca os campos da tabela tblClientes pelos quais poderemos efetuar a busca dinâmica.

A digitar qualquer caractere em uma das caixas de texto escolhida será efetuada um consulta SQL com base no critério informado e o resultado exibido no controle MSFlexgrid.

Primeiro vamos definir as variáveis usadas no projeto:

Option Explicit

Dim regContador As Integer
Dim vCodigo As String
Dim vNome As String
Dim vApelido As String
Dim vEndereco As String
Dim vTelefone As String
Dim dataTemp As Date

Vamos incluir um módulo .bas na nossa aplicação chamado Funcoes.bas que irá conter duas rotinas:

Option Explicit

Public CON As ADODB.Connection
Public RS As ADODB.Recordset

Sub Connect()

Set CON = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
CON.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = d:\teste\Clientes.mdb"
RS.CursorLocation = adUseClient

End Sub
Sub Disconnect()
RS.Close
CON.Close

Set RS = Nothing
Set CON = Nothing

End Sub

 

vejamos como fica o código do formulário :

1- Código do evento Load do formulário:

Este código monta o cabeçalho do MSFlexgrid definindo a largura e o nome do titulo do cabeçalho.

Private Sub Form_Load()

dataTemp = Date

MSFlexGrid1.ColWidth(0) = 0
MSFlexGrid1.ColWidth(1) = 900
MSFlexGrid1.ColWidth(2) = 2400
MSFlexGrid1.ColWidth(3) = 2400
MSFlexGrid1.ColWidth(4) = 0
MSFlexGrid1.ColWidth(5) = 900
MSFlexGrid1.TextMatrix(0, 0) = "IdCliente"
MSFlexGrid1.TextMatrix(0, 1) = "Codigo"
MSFlexGrid1.TextMatrix(0, 2) = "Nome"
MSFlexGrid1.TextMatrix(0, 3) = "Apelido"
MSFlexGrid1.TextMatrix(0, 4) = "Endereço"
MSFlexGrid1.TextMatrix(0, 5) = "Telefone"
End Sub

 

Iremos trabalhar com dois eventos das caixas de texto:

  1. Change - quando houver qualquer alteração no conteúdo de qualquer uma das caixas de texto iremos realizar as seguintes tarefas:

                A estrutura dos comandos SQL é a seguinte :

                SELECT * FROM tblClientes WHERE Nome Like '%" & Text2.Text & "%'"

                Estamos usando a cláusula Like para selecionar todos os registros que tenham o critério.

    Abaixo temos o código do evento Change para a caixa de texto Text2 - Nome:

Private Sub Text2_Change()
 

If Text2.Text = "" Then

  MSFlexGrid1.Enabled = False

  vCodigo = ""

  vNome = ""

  vApelido = ""

  vEndereco = ""

  vTelefone = ""

Else

  MSFlexGrid1.Enabled = True

End If
 

If Text1.Text = "" And Text2.Text = "" And Text3.Text = "" And Text4.Text = "" Then

  MSFlexGrid1.Rows = 2

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = ""

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = ""

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 2) = ""

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 3) = ""

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = ""

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 5) = ""

  MSFlexGrid1.Rows = MSFlexGrid1.Rows - 1

  Me.Caption = "Buscar Cliente"

  Exit Sub

End If
 

MSFlexGrid1.Rows = 2
 

Connect

RS.Open "SELECT * FROM tblClientes WHERE Nome Like '%" & Text2.Text & "%'", CON, adOpenStatic, adLockOptimistic

Do While Not RS.EOF

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = RS.Fields(0).Value

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = RS.Fields(1).Value

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 2) = RS.Fields(2).Value

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 3) = RS.Fields(3).Value

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = RS.Fields(4).Value

  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 5) = RS.Fields(5).Value

  MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

  RS.MoveNext

Loop

MSFlexGrid1.Rows = MSFlexGrid1.Rows - 1

regContador = CStr(RS.RecordCount)

If MSFlexGrid1.Rows = 2 Then

  Me.Caption = "Buscar Cliente - " & regContador & " clientes encontrados"

Else

  Me.Caption = "Buscar Cliente - " & regContador & " clientes encontrados"

End If

Disconnect

End Sub

2 - Outro evento da caixa de texto que iremos usar é o evento Click.

Quando o usuário clicar em uma caixa de texto iremos limpar o conteúdo das caixas e desabilitar o botão de comando - command2 - Salvar Cliente Selecionado.

Veja abaixo o código para o evento Click da caixa de texto - Text2 - Nome.

Private Sub Text2_Click()

Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Command2.Enabled = False

End Sub

A seguir vou apenas mostrar o código para as demais caixas de texto.

Private Sub Text1_Change()
If Text1.Text = "" Then
  MSFlexGrid1.Enabled = False
  vCodigo = ""
  vNome = ""
  vApelido = ""
  vEndereco = ""
  vTelefone = ""
Else
  MSFlexGrid1.Enabled = True
End If
If Text1.Text = "" And Text2.Text = "" And Text3.Text = "" And Text4.Text = "" Then
  MSFlexGrid1.Rows = 2
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 2) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 3) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 5) = ""
  MSFlexGrid1.Rows = MSFlexGrid1.Rows - 1
  Me.Caption = "Buscar Cliente"
  Exit Sub
End If

MSFlexGrid1.Rows = 2

Connect
RS.Open "SELECT * FROM tblClientes WHERE Codigo Like '%" & Text1.Text & "%'", CON, adOpenStatic, adLockOptimistic
Do While Not RS.EOF
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = RS.Fields(0).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = RS.Fields(1).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 2) = RS.Fields(2).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 3) = RS.Fields(3).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = RS.Fields(4).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 5) = RS.Fields(5).Value
  MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
  RS.MoveNext
Loop
MSFlexGrid1.Rows = MSFlexGrid1.Rows - 1
regContador = CStr(RS.RecordCount)
If MSFlexGrid1.Rows = 2 Then
  Me.Caption = "Buscar Cliente - " & regContador & " clientes encontrados"
Else
  Me.Caption = "Buscar Cliente - " & regContador & " clientes encontrados"
End If
Disconnect
End Sub
Private Sub Text1_Click()
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Command2.Enabled = False
End Sub
Private Sub Text3_Change()

If Text3.Text = "" Then
  MSFlexGrid1.Enabled = False
  vCodigo = ""
  vNome = ""
  vApelido = ""
  vEndereco = ""
  vTelefone = ""
Else
  MSFlexGrid1.Enabled = True
End If

If Text1.Text = "" And Text2.Text = "" And Text3.Text = "" And Text4.Text = "" Then
  MSFlexGrid1.Rows = 2
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 2) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 3) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 5) = ""
  MSFlexGrid1.Rows = MSFlexGrid1.Rows - 1
  Me.Caption = "Buscar Cliente"
  Exit Sub
End If
MSFlexGrid1.Rows = 2
Connect

RS.Open "SELECT * FROM tblClientes WHERE apelido Like '%" & Text3.Text & "%'", CON, adOpenStatic, adLockOptimistic
Do While Not RS.EOF
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = RS.Fields(0).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = RS.Fields(1).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 2) = RS.Fields(2).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 3) = RS.Fields(3).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = RS.Fields(4).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 5) = RS.Fields(5).Value
  MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
  RS.MoveNext
Loop

MSFlexGrid1.Rows = MSFlexGrid1.Rows - 1
regContador = CStr(RS.RecordCount)

If MSFlexGrid1.Rows = 2 Then
  Me.Caption = "Buscar Cliente - " & regContador & " clientes encontrados"
Else
  Me.Caption = "Buscar Cliente - " & regContador & " clientes encontrados"
End If
Disconnect
End Sub

Private Sub Text3_Click()
Command2.Enabled = False
Text1.Text = ""
Text2.Text = ""
Text4.Text = ""
End Sub
Private Sub Text4_Change()

If Text4.Text = "" Then
  MSFlexGrid1.Enabled = False
  vCodigo = ""
  vNome = ""
  vApelido = ""
  vEndereco = ""
  vTelefone = ""
Else
  MSFlexGrid1.Enabled = True
End If

If Text1.Text = "" And Text2.Text = "" And Text3.Text = "" And Text4.Text = "" Then
  MSFlexGrid1.Rows = 2
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 2) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 3) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = ""
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 5) = ""
  MSFlexGrid1.Rows = MSFlexGrid1.Rows - 1
  Me.Caption = "Buscar Cliente"
Exit Sub
End If

MSFlexGrid1.Rows = 2

Connect

RS.Open "SELECT * FROM tblClientes WHERE Telefone Like '%" & Text4.Text & "%'", CON, adOpenStatic, adLockOptimistic

Do While Not RS.EOF
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = RS.Fields(0).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = RS.Fields(1).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 2) = RS.Fields(2).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 3) = RS.Fields(3).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = RS.Fields(4).Value
  MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 5) = RS.Fields(5).Value
  MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1
  RS.MoveNext
Loop

MSFlexGrid1.Rows = MSFlexGrid1.Rows - 1

regContador = CStr(RS.RecordCount)

If MSFlexGrid1.Rows = 2 Then
  Me.Caption = "Buscar Cliente - " & regContador & " clientes encontrados"
Else
  Me.Caption = "Buscar Cliente - " & regContador & " clientes encontrados"
End If

Disconnect

End Sub

Private Sub Text4_Click()
Command2.Enabled = False
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
End Sub

O código do evento Click do botão de comando - command2 - Salvar cliente Selecionado é dado a seguir:

Ele faz a conexão como banco de dados e inclui um novo registro(AddNew) na tabela Cadastro. A seguir atribui os valores das variáveis de memória ao recordset e atualiza(Update) o registro.

Private Sub Command2_Click()

If Text1.Text = "" And Text2.Text = "" Then
  Unload Me
End If

Connect
RS.Open "Select * FROM Cadastro", CON, adOpenStatic, adLockOptimistic
RS.AddNew
RS("Nascimento") = Format(dataTemp, "dd-mm-yy")
RS("ID") = vCodigo
RS("Nome") = vNome
RS("Apelido") = vApelido
RS("Endereco") = vEndereco
RS("Telefone") = vTelefone
RS.Update
Disconnect
MsgBox "O Cliente <" & vNome & "> foi incluído com sucesso na tabela Cadastro.", vbInformation
End Sub

 

Finalmente o evento Click do controle MSFlexgrid irá atribuir o valor da célula que foi clicada as variáveis de memória que serão usadas para salvar os dados na tabela Cadastro.

 

Private Sub MSFlexGrid1_Click()

Dim Posit As Single

Posit = MSFlexGrid1.Row

vCodigo = MSFlexGrid1.TextMatrix(Posit, 1)
vNome = MSFlexGrid1.TextMatrix(Posit, 2)
vApelido = MSFlexGrid1.TextMatrix(Posit, 3)
vEndereco = MSFlexGrid1.TextMatrix(Posit, 4)
vTelefone = MSFlexGrid1.TextMatrix(Posit, 5)

Command2.Enabled = True
End Sub

Abaixo temos uma visão da seleção dos registros em duas etapas de digitação do critério para o nome:


Ao selecionar o cliente , clicando na célula desejada , o botão para salvar será habilita. Clicando no botão iremos salvar os dados na tabela Cadastro.

Pegue o projeto completo aqui : incClientes.zip

Eu sei, é apenas VB , mas eu gosto...


José Carlos Macoratti