VB - Carregando dados em um MSFlexGrid e DataGrid


Neste artigo irei mostrar como preencher um controle MSFLexGrid e depois um DataGrid com dados de uma tabela de um banco de dados Access. Creio que já escrevi um artigo sobre este assunto , mas aqui eu quero chamar a atenção para a formatação das colunas e dos grids no formulário.

Eu tenho uma tabela clientes em um banco de dados clientes.mdb que tem a seguinte estrutura:

Pois bem , vou exibir os dados desta na tabela em um controle MSFlexGrid do VB6. Para isto inicie um novo projeto no VB e no formulário padrão insira um controle MSFlexGrid no menu Project|Add Components. Seu form deve ficar parecido com a figura abaixo:

Agora eu vou criar uma função que deve receber dois parâmetros :

  1. O caminho e nome do banco de dados - no exemplo usarei - c:\teste\clientes.mdb
  2. A instrução SQL para extrair os dados da tabela - "Select * From Clientes ORDER By nome"

O código da função que chamarei - encheGrid - é o seguinte :

Private Function encheGrid(dados As String, sql As String)

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim coluna As Integer
Dim linha As Integer
Dim largura_coluna() As Single
Dim largura_campo As Single

' abre a conexao
Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & dados & ";" & "Persist Security Info=False"
conn.Open

' pega os registros
Set rs = conn.Execute(sql, , adCmdText)

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

' define o numero de linhas e colunas e cria uma matrix com o total de registros a exibir
MSFlexGrid1.Rows = 1
MSFlexGrid1.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
   MSFlexGrid1.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
   MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

   For coluna = 0 To rs.Fields.Count - 1                                                                      
      MSFlexGrid1.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 MSFlexGrid1.Cols - 1
     MSFlexGrid1.ColWidth(coluna) = largura_coluna(coluna) + 240
Next coluna
End Function

No código acima estou fazendo o acesso ao banco de dados usando ADO. A string de conexão é :

conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & dados & ";" & "Persist Security Info=False"

O grid é preenchido em um laço For/Next usando a propriedade TextMatrix(linha,Coluna)

 MSFlexGrid1.TextMatrix(linha, coluna) = rs.Fields(coluna).Value

rs.fields(coluna).Value representa o valor dos campos da tabela.

A seguir basta chamar a função ; pode ser no evento Load do formulário como mostrado a seguir :

Private Sub Form_Load()
   Call encheGrid("c:\teste\clientes.mdb", "Select * from clientes ORDER BY nome")
End Sub

Para ajustar o tamanho do grid ao formulário insira o código a seguir no evento Resize do formulário:

Private Sub Form_Resize()
   MSFlexGrid1.Move 0, 0, ScaleWidth, ScaleHeight
End Sub

Executando o projeto teremos:

Carregando dados em DataGrid e exibindo o valor de uma célula selecionada

Agora vou fazer a mesma coisa usando um controle DataGrid e usando um Ado Data Control. O objetivo é exibir os dados no DataGrid . Para isto eu vou fazer a conexão com o banco de dados usando o Ado Data Control e depois vincular este controle ao DataGrid.

Vamos então inserir os componentes DataGrid e Ado Data Control no formulário através do menu Project|Add Components.(Insira também um botão de comando). O layout do formulário deverá ser parecido com a figura abaixo:

DataGrid - name = grdClientes

ADODC - name = adodcClientes

Botão de comando - name = cmdSeleciona

O usuário irá selecionar uma célula e suas coordenadas ( linha , coluna) serão exibidas , juntamente com o valor da célula em uma mensagem.

Vou criar uma função chamada - CarregaDados - que irá exibir os dados no dataGrid. Seu código é o seguinte:

Public Sub CarregaDados()
Dim dados As String

' pega o caminho do banco de dados
dados = App.Path
If Right$(dados, 1) <> "\" Then dados = dados & "\"
dados = dados & "clientes.mdb"

' Conecta o controle ADODC com o banco de dados
adodcClientes.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & dados & ";"
adodcClientes.RecordSource = "SELECT * FROM clientes ORDER BY nome"

' vincula o adodc ao datagrid
Set grdClientes.DataSource = adodcClientes
End Sub

O código do botão - Seleciona - que irá exibir os valores das células e suas linhas e colunas é :

Private Sub cmdSeleciona_Click()
   ' Exibe o valor atual da celula
   MsgBox "Celula (" & grdClientes.Row & ", " & grdClientes.Col & ") " & vbCrLf & "Valor = " & grdClientes.Text
   grdClientes.SetFocus
End Sub

Incluimos também um código no evento Resize do formulário para ajustar o grid ao formulário:

Private Sub Form_Resize()
'ajusta o tamanho do dbgrid ao formulário quando este for dimensionado
Dim largura As Single

largura = ScaleWidth - cmdSeleciona.Width - 120

If largura < 120 Then largura = 120
    grdClientes.Move 0, 0, largura, ScaleHeight
    cmdSeleciona.Left = ScaleWidth - cmdSeleciona.Width - 60
End Sub

Para chamar a função que carrega e exibe os dados podemos usar o evento Load do formulário: 

Private Sub Form_Load()
  CarregaDados
End Sub

Pronto ! Matei dois coelhos de uma vez... Até o próximo artigo...


José Carlos Macoratti