VB e MySQL - Preenchendo um MSFlexGrid e um ListView


Você já deve saber que podemos acessar o MySQL usando o VB. É muito simples e eu já tratei deste assunto nos artigos:

Neste artigo vou mostrar como podemos acessar o MySQL e preencher dois controles básicos : MSFlexGrid e ListView.

Você vai precisar ter instalado o MySQL e o MyOBDC 3.5x em seu computador. Você pode pegar estes programas gratuitamente no site www.mysql.com . Seria bom você também instalar uma ferramenta com interface gráfica para administrar o MySQL : criar banco de dados , tabelas , inserir registros. Existem algumas opções que são free (Free Mascon); no link http://dev.mysql.com/downloads/administrator/index.html você pode pegar o MySQL Administrator que é muito útil.

Se você estiver instalando o MySQL pela primeira vez vai notar que ele vem com dois banco de dados : mysql e test. Neste exemplo eu criei um banco de dados Clientes e uma tabela Agenda com a estrutura mostrada abaixo:

Você pode criar este banco de dados diretamente da ferramenta gráfica ou usar os comandos da linha de prompt do MySQL. Uma forma simples de fazer isto é a seguinte :

Neste exemplo eu não vou atualizar dadaos apenas irei selecionar os dados da tabela agenda e exibir nos controles. Mas se você tiver que trabalhar com atualização de tabelas você precisa definir uma chave primária para a tabela . ADO não consegue tratar o tipo de dados big integer , com isto , algumas consultas como SHOW PROCESSLIST não irão funcionar. Para corrigir o problema defina na abertura do recordset a opção OPTION=16834 na string de conexão ou altere a coluna com o tipo BIGINT para INT.

O argumento OPTION é usado para informar o Conector ODBC 3.51 que o cliente não é 100% compatível com ODBC. A lista dos principais valores para o argumento OPTION é a seguinte :

Bit Descrição
1 O cliente não pode tratar que o Connector/ODBC retorne a largura real da coluna.
2 O cliente não pode tratar que o MySQL retone o valor de linhas afetadas.
8 Não define qualque pacote limite para results e parametros.
32 Habilita ou desabilita o suporte ao cursor dinamico.
64 Ignora o uso do nome do banco de dados em : 'database.table.column'.
128 Força o uso do gerenciador de cursor ODBC.
512 Faz os campos CHAR preencher o comprimento da coluna.
1024 SQLDescribeCol() irá retornar o nome completo das colunas.
2048 Usa o protocolo compactado do server/client.
4096 Informa o servidor para ignorar espaco depois do nome da função e antes de '(' .
8192 Conecta com o Connect with named pipes to a mysqld server running on NT.
16384 Altera colunas LONGLONG columns para colunas INT.
65536 Lê parametros do cliente e grupos odbc do `my.cnf'
262144 Desabilita transações.
1048576 Não guarda em chace os resultados locais no driver, ao invés , lê do servidor.

Você pode combinar mais de uma opção no argumento OPTION concantenando os valores com (+). Ex: ( 4+8).

Bem , vamos ao nosso projeto. Inicie o VB e crie um novo projeto do tipo STANDARD EXE.

Inclua no projeto a referência a biblioteca ADO - Microsoft ActiveX Data Objects 2.x - e os componentes : Microsoft MSFlexGrid Control e Microsoft Tabbed Dialog Control e Microsoft Wndows Common Controls 6.0 ( ListView)..

Inclua no formulário o SSTab . Na primeira Tab insira o MSFlexGrid e na segunda o ListView. Abaixo insira um botão de comando. O layout do formulário deve ser parecido com :

Na seção - General Declarations - do formulário insira o código :

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset

No evento Click do botão de comando vamos incluir o código que vai fazer a conexão com o MySQL e chamar as rotinas : encheGrid() e encheList().

Private Sub Command1_Click()
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

conn.CursorLocation = adUseClient

conn.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
& "SERVER=127.0.0.1;" _
& "DATABASE=Clientes;" _
& "UID=macoratti;" _
& "PWD=jcm;" _
& "OPTION=" & 1 + 2 + 8 + 32 + 2048 + 16384


conn.Open

rs.Open "SELECT * FROM Agenda", conn, adOpenDynamic, adLockOptimistic

Call encheGrid(rs, MSFlexGrid1)
rs.MoveFirst
Call encheList(ListView1, rs)
rs.MoveFirst

rs.Close
Set rs = Nothing

conn.Close
Set conn = Nothing

End Sub
A string de conexão realiza a conexçao com o banco de dados Clientes.
O servidor é local - 127.0.0.1
O usuário usado é macoratti e a senha jcm

A rotina encheGrid() passa dois parâmetros :
- o recordset - rs
- o controle MSFlexGrid

A rotina encheList() passa dois parâmetros:
- O nome do controle ListView
- o recordset - rs

 

A rotina para preencher o MsflexGrid esta no próprio formulário é a seguinte :

Public Sub encheGrid(rs As ADODB.Recordset, msfGrid As MSFlexGrid)

Dim coluna As Integer
Dim linha As Integer
Dim largura_coluna() As Single
Dim largura_campo As Single

' define linhas fixas igual a uma e não usa colunas fixas
msfGrid.Rows = 2
msfGrid.FixedRows = 1
msfGrid.FixedCols = 0

' define o numero de linhas e colunas e cria uma matrix com o total de registros a exibir
msfGrid.Rows = 1
msfGrid.Cols = rs.Fields.Count

ReDim largura_coluna(0 To rs.Fields.Count - 1)

' exibe os cabeçalhos das colunas
For coluna = 0 To rs.Fields.Count - 1
   msfGrid.TextMatrix(0, coluna) = rs.Fields(coluna).Name
   largura_coluna(coluna) = TextWidth(rs.Fields(coluna).Name)
Next coluna

' exibe o valor de cada linha
linha = 1
Do While Not rs.EOF
   msfGrid.Rows = msfGrid.Rows + 1

  For coluna = 0 To rs.Fields.Count - 1
     msfGrid.TextMatrix(linha, coluna) = rs.Fields(coluna).Value

    
' verifica o tamanho dos campos
      largura_campo = TextWidth(rs.Fields(coluna).Value)

    If largura_coluna(coluna) < largura_campo Then largura_coluna(coluna) = largura_campo
 Next coluna

 rs.MoveNext
linha = linha + 1
Loop

' fecha o recordset e a conexao
'rs.Close
'conn.Close

' define a largura das colunas do grid
For coluna = 0 To msfGrid.Cols - 1
msfGrid.ColWidth(coluna) = largura_coluna(coluna) + 300
Next coluna

End Sub

Vamos colocar a rotina que preenche o ListView em um módulo. Para isto , no menu selecione Project | Add Module e de o nome a ao modulo de vbmysql. Agora insira o seguinte código no módulo :

Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long

Private Const LVM_SETITEMCOUNT As Long = 4096 + 47

Public Sub encheList(lvwData As Control, rs As ADODB.Recordset)

On Error Resume Next

Dim contador As Long
Dim PrimeiraColuna As Boolean

lvwData.View = lvwReport
lvwData.LabelEdit = lvwManual
lvwData.GridLines = True
lvwData.FullRowSelect = True

lvwData.ListItems.Clear
lvwData.ColumnHeaders.Clear

For contador = 0 To rs.Fields.Count - 1
    lvwData.ColumnHeaders.Add , , rs.Fields(contador).Name 'cria os cabeçalhos
Next

'
aloca memoria para os itens do listview
SendMessage lvwData.hwnd, LVM_SETITEMCOUNT, rs.RecordCount, 0&

Dim mitens As MSComctlLib.ListItems
Set mitens = lvwData.ListItems

Do Until rs.EOF
 PrimeiraColuna = True
'a primeira coluna é um listitem as demais subitens
 For contador = 0 To rs.Fields.Count - 1
  If PrimeiraColuna Then
     If Not IsNull(rs.Fields(contador).Value) Then
            mitens.Add , , rs.Fields(contador).Value
      Else
            mitens.Add , , ""
'campo com NULL precisa de item em branco
      End If
       PrimeiraColuna = False
   Else
      If Not IsNull(rs.Fields(contador).Value) Then
           mitens(mitens.Count).ListSubItems.Add , , rs.Fields(contador).Value
       Else
           mitens(mitens.Count).ListSubItems.Add , , ""
       End If
  End If
 Next
 rs.MoveNext
Loop
End Sub

Pronto para rodar o projeto ? Pressione F5 e você deverá obter como resultado o seguinte:

Neste artigo você reviu como fazer a conexão ADO com o MySQL usando o conector MyODBC e ganhou duas rotinas genéricas para preencher Grids.

Eu sei , é apenas Visual Basic , mas eu gosto !


José Carlos Macoratti