VB - FlashBack :  MsFlexGrid preenchendo o controle com dados II


Continuando o flashback sobre o MSflexGrid vamos melhorar o projeto do artigo -  VB - FlashBack :  MsFlexGrid preenchendo o controle com dados- e criar um visualizador genérico de tabelas só que vamos variar um pouco fazendo o acesso aos dados usando DAO.

Para saber mais sobre DAO leia os seguintes artigos do site:

Se você esta chegando agora e pretende aprender Visual Basic para acessar dados , o MsFlexGrid é um controle com muitos recursos que você pode usar para obter resultados satisfatórios. Então leia os artigos do site já publicados a respeito:

Preenchendo um MSFlexGrid com dados de uma tabela selecinada

Abre o seu Visual Studio o u Visual Basic e crie um novo projeto do tipo Standard EXE

Antes de iniciar é preciso incluir os controles CommonDialog e  MSflexGrid na ToolBox. Faça isto no menu Project|Components e selecione em seguida os controles indicados.

No formulário padrão inclua os controles : TextBox ,Label, CommandButton, CommondDialog  e MSFlexGrid

Na seção General Declarations do formulário defina as variáveis que serão visíveis em todo o formulário:

Option Explicit
'define as variaveis objeto para banco de dados e recordset
Dim db As Database
Dim rs As Recordset
Dim arquivoDB As String
Dim senhaDB As String

O evento Load do formulário irá chamar a janela de diálogo para selecionar o banco de dados:

Private Sub Form_Load()
   Call mostra_db
End Sub

No evento Click do botão que irá abrir a janela de diálogo - Selecione o Banco de Dados - irá limpar as caixas de listagem e também chamar a rotina que exibe a janela para selecionar o banco de dados:

Private Sub Command2_Click()
List1.Clear
List2.Clear
Call mostra_db
End Sub

O código da rotina mostraDB que mostra a janela de diálogo para selecionar o banco de dados é o seguinte :

Sub mostra_db()
'filtra os arquivos com extensão .mdb
CDialog.Filter = "MDB Arquivos (*.mdb)|*.mdb"
'define o titulo da janela
CDialog.DialogTitle = "Arquivo Mdb selecionado"
'abre a janela
CDialog.ShowOpen
arquivoDB = CDialog.FileName

lblnomedb.Caption = arquivoDB
senhaDB = InputBox("Informe a senha do Banco de dados se ele estiver protegido com senha", "Banco de dados")
End Sub

No evento Click do botão - Exibir Tabelas -  que irá exibir as tabelas no ListBox.

Private Sub Command1_Click()
Dim i As Integer
On Error GoTo trata_Erro

'limpa o conteudo do controle listbox
List1.Clear
'se foi informado o nome do arquivo então abre o arquivo e preenche o  listbox com as tabelas
If arquivoDB <> "" Then
    If senhaDB <> "" Then
        Set db = OpenDatabase(arquivoDB, False, False, "MS Access;pwd=" & senhaDB)
    Else
        Set db = OpenDatabase(arquivoDB, False, False)
    End If
    'prenche o listbox com todas as tabelas do banco de dados
    For i = 0 To db.TableDefs.Count - 1
        List1.AddItem db.TableDefs(i).Name
    Next
End If
Exit Sub

trata_Erro:
    'se houver senha deve ser informada
    If Err.Number = 3031 Then
        senhaDB = InputBox("Informe a senha : ")
    Else
        MsgBox Err.Number & " : " & Err.Description
    End If
End Sub

Quando o usuário clicar no controle ListBox para selecionar uma tabela a mesma deverá ter sua estrutura exibida no segundo ListBox e os seus dados no controle MsFlexGrid. O código que faz isto é o seguinte :

Private Sub List1_Click()

Dim i As Integer
Dim sno As Integer
'MousePointer = vbHourglass

'limpa o listbox
List2.Clear

'inclui o cabeçalho no listbox
List2.AddItem "Nome" & vbTab & vbTab & "Tipo" & vbTab & "Tamanho"
For i = 0 To db.TableDefs(List1.ListIndex).Fields.Count - 1
    List2.AddItem db.TableDefs(List1.ListIndex).Fields(i).Name & vbTab & _ 
            db.TableDefs(List1.ListIndex).Fields(i).Type & vbTab & db.TableDefs(List1.ListIndex).Fields(i).Size
Next

'Exibindo os dados da tabela selecionada
'limpa o controle msflexgrid
MSFlexGrid1.Clear
'tratamento de erro
On Error Resume Next
Set rs = db.OpenRecordset("select count(*) from [" & List1.List(List1.ListIndex) & "]")
If Err.Number <> 0 Then
    MsgBox "O recordset não pode ser aberto devido ao erro:  " & Err.Description
    MousePointer = vbDefault
    Exit Sub
End If

If rs(0) > 0 Then
    MSFlexGrid1.Rows = rs(0) + 1
Else
    MSFlexGrid1.Rows = 2
End If

'abre um recordset para a tabela selecionada
Set rs = db.OpenRecordset("select * from [" & List1.List(List1.ListIndex) & "]")
MSFlexGrid1.Cols = rs.Fields.Count + 1
sno = 1

MSFlexGrid1.Row = 0
MSFlexGrid1.Col = 0
MSFlexGrid1.Text = "Sno"
For i = 0 To rs.Fields.Count - 1
    MSFlexGrid1.Col = i + 1
    MSFlexGrid1.Text = rs.Fields(i).Name
Next

If rs.EOF = False Then
'Atribuindo o nome das colunas para o flexgrid
    While Not rs.EOF
        MSFlexGrid1.Row = sno
        MSFlexGrid1.Col = 0
        MSFlexGrid1.Text = sno
        For i = 0 To rs.Fields.Count - 1
            MSFlexGrid1.Col = i + 1
            MSFlexGrid1.Text = IIf(IsNull(rs(i)), "", rs(i))
        Next
        sno = sno + 1
        DoEvents
        rs.MoveNext
    Wend
End If
MousePointer = vbDefault
End Sub

O resultado será exibido conforme a janela abaixo:

Pegue o projeto completo aqui : flexEstrutura.zip

Eu sei é apenas VB.NET , e daí , eu gosto ....


José Carlos Macoratti