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