Microsoft Visual Basic
Este curso fornece conceitos avançados de programação com Visual Basic, tal como manipulação e criação de componentes e servidores COM e programação para a internet. Preparatório para prova da Microsoft.
Valor : R$ 246,00 ou 5 X de R$ 52,00

Quer saber mais?
Torne-se um MCP em Visual Basic
Faça um treinamento na Búfalo Informática

 

Treeview x Banco de dados - Usando o Data Environment

Este artigo é continuação do artigo "Utilizando o TreeView".

No artigo anterior vimos como utilizar a TreeView, mas apenas utilizamos informações fixas e vetores. Vamos agora carregar os dados da TreeView a partir de um banco de dados.

Precisaremos de uma tabela com estrutura adequada para guardar dados equivalentes aos que utilizamos no artigo anterior. Assim sendo, utilizaremos uma tabela com nome FUNC e a seguinte estrutura :

CodFunc Autonumber
Filial Text
Setor Text
Funcionário Text
Salário Currency

Para fazer o preenchimento da TreeView com os agrupamentos por filial e departamento, da mesma forma que no artigo anterior, precisaremos acessar essas informações ordenadas por filial e departamento. Vamos utilizar um Data Environment para fazer o acesso a dados. Adicione o Data Environment através do menu Project->Add Data Environment. Dê nome ao Data Environment de DE e a conexão de CN.

Feito isso, entre nas propriedades da conexão e configure a conexão apontando para o nosso banco de dados MDB (TreeView.MDB). Como você sabe, conexões com MDB são realizadas utilizando-se o provider Microsoft Jet 4.0

Feito isso, crie um Command dentro da conexão e chame-o de TreeView. Entre nas propriedades do Command e clique em SQL Statement. Utilizaremos a seguinte instrução SQL : Select * from func order by filial,setor.

Observe a necessidade de recuperar os dados ordenados pelo campo filial e setor, que serão os 2 campos utilizados para fazer agrupamentos dentro da Tree View.

Quando existem controles vinculados a um command do data environment o command é aberto automaticamente. Mas nesse caso não temos nenhum controle vinculado a ele, portanto teremos que abrir o comand manualmente no evento onload do form e, nesse momento, aproveitaremos para preencher a tree view.

Executar o Command é fácil, basta chamar pelo nome do command através do Data Environment, da seguinte forma :

DE.TreeView

Ao fazer isso o Command é executado e gera com resultado um RecordSet que pode ser acessado pelo próprio nome do command mas com RS na frente (seria DE.RSTreeview).

Para fazermos o preenchimento da Treeview precisaremos percorrer todo o RecordSet, registro a Registro. Mas não é um laço simples, pois sempre que o setor mudar deveremos corrigir a árvore, trocando de ramificação e sempre que a filial mudar também.

Assim sendo precisaremos de 3 níveis de laço : O 1o nível para realizar uma repetição através de todos os registros do RecordSet, o 2o nível para realizar uma repetição através de todos os registros de uma filial e o 3o nível para realizar a repetição através de todos os registros de um setor.

Veja como fica o código :

Private Sub Form_Onload()

Dim tmpfilial As String
Dim tmpsetor As String
DE.TreeView
Do While Not DE.rsTreeView.EOF
   TreeView1.Nodes.Add , , DE.rsTreeView!filial, DE.rsTreeView!filial, 1, 2
   tmpfilial = DE.rsTreeView!filial
   Do While DE.rsTreeView!filial = tmpfilial
        tmpsetor = DE.rsTreeView!setor
        TreeView1.Nodes.Add tmpfilial, tvwChild, tmpfilial & tmpsetor, tmpsetor, 4, 3
        Do While DE.rsTreeView!setor = tmpsetor
            TreeView1.Nodes.Add tmpfilial & tmpsetor, tvwChild, "k" & DE.rsTreeView!codfunc, DE.rsTreeView![funcionário], 5, 5
            DE.rsTreeView.MoveNext
            If DE.rsTreeView.EOF Then
               Exit Sub
            End If
        Loop
    Loop
Loop

End Sub

Dentro do 1o laço é feita a inserção do nó da filial. Este nó não é child de nenhum outro e foi usado como Key desse nó o próprio nome da filial.

Neste laço a filial é guardada em uma variável temporária e essa variável servirá de critério para o laço seguinte : enquanto estiver na mesma filial será feita a repetição do laço seguinte.

No 2o laço é feita a mesma coisa para o setor : O setor é inserido como um nó da TreeView e guardado dentro de uma variável temporária que servirá de condição ao terceiro laço. O setor é adicionado na treeview como child de filial (observe que aproveitamos aqui a variável temporária) e a Key será a concatenação de setor e filial.

O 3o laço, se repetirá enquanto o setor não mudar. Ele se encarrega de inserir o nó referente a cada funcionário. A Key desse nó é o código do funcionário acrescido de um "k", pois a key não pode ser numérica. É neste último laço que é feito o MoveNext e novamente é verificado se o fim do arquivo foi atingido. Observe que a verificação de fim de arquivo não pode ser inserida como uma condição a mais no Do While pois o VB não faz Short Circuit (ou seja, sempre avalia as expressões por inteiro) e a comparação dos campos geraria erro no caso de ser EOF.

Por fim deveremos fazer com que caso o usuário clique em um funcionário seja exibido o salário dele. Para fazermos isso teremos que, como antes, programar o clique de um nó na TreeView. Para sabermos se o nó é um funcionário basta descartarmos a 1a letra da key e verificarmos se o restante é numérico.

Ao identificarmos que o nó selecionado é de um funcionário deveremos buscar esse funcionário no RecordSet e exibir o seu salário. Veja como fica o código :

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)

If IsNumeric(Right(Node.Key, Len(Node.Key) - 1)) Then
   lblnome.Caption = Node.Text
   DE.rsTreeView.MoveFirst
   DE.rsTreeView.Find "codfunc=" & Right(Node.Key, Len(Node.Key) - 1)
   If Not DE.rsTreeView.EOF Then
        lblsal.Caption = DE.rsTreeView![salário]
   Else
      lblsal.Caption = "Falha"
   End If
End If

End Sub

Observe a situação apontada como "Falha" : Ela ocorre quando o registro não é encontrado no RecordSet. Se o RecordSet for estático isso é absolutamente impossível de ocorrer. Caso não seja então trata-se de um erro de concorrência de dados que deve ser tratado adequadamente, mas isso já não é assunto deste artigo.

Com isso o código já encontra-se funcionando e você já pode testa-lo.

 

Dennes Torres
MCSD,MCSE,MCDBA