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...