Criando um formulário Mestre-Detalhes.
Ao utilizar um banco de dados relacional durante a normalização dos dados geralmente os dados ficam em diversas tabelas. Como exemplo podemos citar o relacionamento entre as tabelas Categorias e Produtos. Veja a figura a seguir:
Aqui temos um relacionamento do tipo 1 para muitos . Uma categoria pode apresentar diversos produtos. E se você quiser exibir em um formulário os produtos por categoria como irá fazer ?
Você deverá exibir cada categoria em uma caixa de texto e os produtos relacionados em uma grade . Vamos mostrar como fazer isto usando o comando SHAPE /APPEND.
O comando SHAPE / APPEND define a estrutura da hierarquia de um recordset e os comandos necessários para preencher o recordset com os dados da hierarquia. O comando atribui um recordset filho para a propriedade Value dos objetos Fields de um Recordset Pai.
A sintaxe é :
Onde :
Para o nosso caso a estrutura do código ficaria assim:
Vamos então mostrar como criar um formulário Mestre-Detalhe usando esta técnica:
1- Inicie um novo projeto no Visual Basic e faça a seguintes referências no seu projeto no menu Project :
2- Insira os seguintes controles : 1 DataGrid , 2 textBox , 3 CommandButtons ; conforme layout abaixo:
3- Na secção General Declarations ponha o código abaixo para declarar as variáveis objeto usadas no projeto.
Option Explicit 'Declara as variaveis objeto : Connection , Recordset Private cn As ADODB.Connection Private rsMestre As ADODB.Recordset Private rsDetalhes As ADODB.Recordset |
4- No evento Load do formulário insira o código a seguir:
Private Sub Form_Load() 'Estabelece a conexão Set cn = New ADODB.Connection cn.Provider = "MSDataShape" cn.ConnectionString = "Data Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\teste\nwind.mdb" cn.CursorLocation = adUseClient cn.Open 'Define o recordset principal Set rsMestre = New ADODB.Recordset rsMestre.Open "SHAPE {select * from categorias} " & _ "APPEND ({select * from produtos} " & _ "RELATE CódigodaCategoria TO CódigodaCategoria) AS CategoriaProdutos", cn PreencheCampos 'Define o recordse secundario Set rsDetalhes = New ADODB.Recordset SelecionaDetalhe 'Define o Grid With grdDetalhe .Caption = "Produtos" .MarqueeStyle = dbgHighlightRow End With End Sub |
5- Agora no procedimento PreencheCampos ponha o código:
Public Sub PreencheCampos() txtNome.Text = rsMestre.Fields("NomedaCategoria") txtDescricao.Text = rsMestre.Fields("Descrição") End Sub |
6- O procedimento SelecionaDetalhe tem o seguinte código: Exibe os dados na Grade
Public Sub SelecionaDetalhe() Dim obj As Column On Error Resume Next Set rsDetalhes = rsMestre("CategoriaProdutos").Value 'Limpa a fonte de dados do grid Set grdDetalhe.DataSource = rsDetalhes 'Esconde os campos ID do grid For Each obj In grdDetalhe.Columns Select Case obj.DataField Case "CódigodoProduto", "CódigodaCategoria", "CódigodoFornecedor" obj.AllowSizing = False obj.Visible = False End Select Next End Sub |
7- O código para navegar pelos registros é o seguinte:
Private Sub cmdProximo_Click() rsMestre.MoveNext If rsMestre.EOF Then rsMestre.MoveLast PreencheCampos SelecionaDetalhe End Sub |
Private Sub cmdAnterior_Click() rsMestre.MovePrevious If rsMestre.BOF Then rsMestre.MoveFirst PreencheCampos SelecionaDetalhe End Sub |
8- Para encerrar o projeto usamos o código do botão Sair que ao ser clicado invoca o evento Form_Unload: : Aqui fechamos o recordset e liberamos a memória.
Private Sub cmdSai_Click() Unload Me End Sub |
Private Sub Form_Unload(Cancel As Integer) On Error Resume Next rsMestre.Close rsDetalhes.Close cn.Close Set rsMestre = Nothing Set rsDetalhes = Nothing Set cn = Nothing End Sub |
Ao rodar o projeto iremos obter a tela:
Quando você clicar nos botões <<Anterior e/ou Próximo>> as categorias irão mudar e exibirão no DataGrid os respectivos Produtos associados. Percebeu que usamos um DataGrid sem um controle de dados vinculados !!!
Até mais...