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 é :

SHAPE {parent-command} [[AS] table-alias]
APPEND {child-command}
RELATE(parent-column TO child-column)"

Onde :

Para o nosso caso a estrutura do código ficaria assim:

"SHAPE {select * from categorias} " & _
"APPEND ({select * from produtos} " & _
"RELATE CódigodaCategoria TO CódigodaCategoria) AS CategoriaProdutos", cn

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