VB - Armazenando dados de uma tabela em um array


Neste artigo eu vou mostrar como você pode armazenar os dados de um tabela em um array (matriz) formando assim uma matriz de dados.

A idéia é armazenar os dados de uma busca em uma tabela em um array predefinido. Para variar um pouco vou mostrar como usar o controle slider para navegar pelos registros obtidos pela consulta e armazenados no array.

A idéia é a seguinte : Vamos usar o banco de dados Biblio.mdb e fazer uma busca na tabela Publishers pela coluna Name de forma que todos os registros obtidos pelo critério de seleção informado pelo usuário em uma caixa de texto sejam armazenados em array.

Introdução

Já ouviu falar no controle Slider ? Não ? bem , então vou apresentá-lo... Eí-lo

O controle Slider esta presente na OCX - MSCOMCTL.OCX - Microsoft Windows Common Controls , e é muito útil quando desejamos associar valores consecutivos dentro de um intervalo. No nosso caso teremos sempre um conjunto de registros obtidos pelo critério de seleção associados ao controle Slider

Ao mover o controle usando o mouse ou o teclado temos a movimentação pelos valores associados , no nosso caso os registros da tabela Publishers. A tabela Publishers possui a seguinte estrutura:

A tabela possui 10 campos. A pesquisa será feita pelo campo Name e iremos exibir os campos :
  • PubID - Código
  • Company Name - Empresa
  • Address - Endereço

Inicie um novo projeto no VB e no formulário padrão insira os seguintes controles no formulário :

  1. Um controle TextBox - text1 - onde o usuário vai informa o critério para busca
  2. Um controle CommandButton - command1 - Procurar - onde é disparado a rotina para iniciar a busca e preencher o array
  3. um controle Frame - frame1 - para agrupar os dados que vamos exibir como resultado da busca
  4. Os controles : text2 para exibir o código , text3 para exibir a empresa e text4 para exibir o endereço
  5. Um controle Slider - Slider1 - que iremos associar aos registros armazenados no array como resultado da busca

O jeitão do formulário deverá ser o seguinte:

E vou usar uma conexão DAO , mas você pode usar uma conexão ADO ou RDO , não importa...

O código do projeto

Na seção General Declarations vamos declarar as variáveis usadas no sistema :

Option Explicit
Private Tab_encontrados() As String
Dim bdBiblio As Database
Dim rsPublishers As Recordset

bdBiblio e rsPublishers são variáveis objeto para o banco de dados e recordset.

Declaramos também um array chamado Tab_encontrados() do tipo String que vai armazenar os dados da tabela Publishers.

Vamos agora ao código do evento Click do botão de comando - command1 :

Private Sub Command1_Click() 

Dim i As Integer, f As Byte, encontrado As Boolean

If Len(Text1.Text) = 0 Then
   MsgBox "Informe um critério para busca ! ", vbCritical, "Procurar"
   Exit Sub
Else ' Vamos buscar
   Set bdBiblio = OpenDatabase(App.Path & "\Biblio.mdb")
   Set rsPublishers = bdBiblio.OpenRecordset("Publishers")
With rsPublishers
   .MoveFirst
   encontrado = False

   Do While Not .EOF
       'se encontrou o criterio informado na coluna 1 - campo Name
      If InStr(1, .Fields(1), Text1, vbTextCompare) > 0 Then
          ReDim Preserve Tab_encontrados(9, i)
          For f = 0 To 9
              Tab_encontrados(f, i) = .Fields(f) & ""
          Next f
          i = i + 1
         encontrado = True
     End If
     .MoveNext
   Loop
  .Close
End With
bdBiblio.Close
Set rsPublishers = Nothing
End If

If encontrado Then
    Slider1.Enabled = True
    'verifica o tamanho do vetor para a dimensao 2
    If UBound(Tab_encontrados, 2) = 0 Then
        Slider1.Visible = False
    Else
        Slider1.Visible = True
        Slider1.Max = UBound(Tab_encontrados, 2) + 1
        Slider1.Min = 1
        Slider1.SetFocus
   End If
Else
   MsgBox "Nada foi encontrado para o critério informado !", vbCritical, "Procurar"
   Exit Sub
End If

mostra_dados 0

End Sub

Vou explicar as partes mais importantes do código acima:

1- Após declarar as variáveis e verificar se algum critério foi fornecido pelo usuário abrimos a base de dados e definimos a tabela a usar . (Eu usei uma conexão DAO mas fique a vontade você pode usar qualquer outra conexão...)

2- Em seguida se algo foi encontrado de acordo com o critério ( o critério pode ser uma letra , uma palavra , etc...) percorremos o recordset fazemos a seguinte verificação :

If InStr(1, .Fields(1), Text1, vbTextCompare) > 0 (para maiores detalhes veja: strings, strings, strings.)

Aqui eu estou usando a função Instr que tem a seguinte sintaxe:

Instr$(Inicio,string1,string2,[Compare])   - Determina a posição da primeira ocorrência de uma substring contida em uma string. Retorna uma variant do tipo Long.

Eu estou procurando a partir da posição 1 na string representada por .Fields(1) - que aqui é a coluna Name - então eu estou procurando a partir da posição 1 no campo nome , pelo critério informado em Text1 usando o modo de comparação - vbTextCompare - ou seja uma comparação Textual. Se eu encontrar então teremos que o valor retornado será maior que zero .

3- O próximo bloco a se executado será o seguinte :

ReDim Preserve Tab_encontrados(9, i)
For f = 0 To 9
   Tab_encontrados(f, i) = .Fields(f) & ""
Next f
i = i + 1
encontrado = True

Aqui eu estou usando a instrução Redim para realocar o espaço de armazenagem do array Tab_encontrados.

Como a tabela Publishers possui 10 campos , eu vou definir o array bidimensional , com o tamanho : Tab_encontrados(9, i) (como o primeiro elemento tem índice 0 , 9 indica que teremos 10 elementos)

A seguir em um laço for/next eu vou percorrer os dez elementos do array e atribuir a cada um o respectivo campo definido em - . Fields(f)

No final teremos um array bidimensional preenchido com os valores encontrados pela busca no recordset Publishers.

4- Podemos então fechar o banco de dados e o recordset , habilitar o controle slider se houver algum valor no array. Para verificar isto usamos a função Ubound :

If UBound(Tab_encontrados, 2) = 0 Then

Aqui estamos usando a função Ubound ,UBound - Retorna um valor do tipo Long contendo o MAIOR índice para a dimensão definida de um array. Sintaxe:     LBound(nome_do_array[, dimensão])

Se o índice for maior que zero então temos dados no array

5- A seguir atribuimos os valores máximos e mínimos para o controle slider em :

Slider1.Max = UBound(Tab_encontrados, 2) + 1
Slider1.Min = 1

6- Só falta mostrar os dados , para isto invocamos a função : mostra_dados. Vejamos o seu código :

Public Sub mostra_dados(num As Integer)

Dim i As Byte

If UBound(Tab_encontrados, 2) = 0 Then
  Frame1.Caption = "Registro: 1/1"
Else
  Frame1.Caption = "Registro: " & Slider1.Value & "/" & Slider1.Max
End If

Text2.Text = Tab_encontrados(0, num) ' coluna codigo
Text3.Text = Tab_encontrados(2, num) ' coluna empresa
Text4.Text = Tab_encontrados(3, num) ' coluna endereco

End Sub

Este código apenas atribui os valores do array - Tab_Econtrados() - a cada caixa de texto.

Para permitir que os dados sejam exibidos pela movimentação do controle precisamos do seguinte código :

Private Sub Slider1_Change()
    mostra_dados Slider1.Value - 1
End Sub

Private Sub Slider1_Click()
    mostra_dados Slider1.Value - 1
End Sub

Lembrando que podemos movimentar o controle com o mouse , teclado e com as teclas PgDown Page Up.

Executando o projeto teremos a seguinte tela para uma busca pela letra Z :

Exibimos o registro atual e quantidade total de registros e o controle slider ao ser movido indica para qual registro se move e exibe na parte inferior este numéro e as marcas representando a quantidade de valores associados ao controle. Assim você esta exibindo os dados sem uma conexão com a base de dados.

Gostou ???? Então pegue o código arqui - - Slider.zip Até mais , bye ...


José Carlos Macoratti