Olá,
Você disse que quer fazer uma listagem, mas está querendo usar uma treeview, então eu imagino que o que você chama de listagem é apenas uma tela mostrando a relação entre os componentes e o produto principal, certo? Bom, nesse caso, a melhor forma de fazer o que você quer é usar a recursão, que nada mais é do que uma procedure (ou function) chamar a si própria. Seria algo mais ou menos assim:
Dim No as MsComctlLib.Node
Set No = TreeView1.Nodes.Add(,,Tabela!Id_P, Tabela!No_P)
If TemEstrutura Then
Carrega_Estrutura No, Tabela!Id_P, ""
End if
..........
Private Sub Carrega_Estrutura(NoPai as MsComCtlLib.Node, CodProd)
Dim No as MsComCtlLib.Node
Dim Sql as String
Dim RS as ADODB.Recordset
Sql="Select Estrutura.*, Produto.TemEstrutura From Estrutura inner Join Produto on Estrutura.Id_I = Produto.ID_P Where Estrutura.Id_P = " & CodProd
Rs.Open Sql, Conexao, adOpenKeyset
Do While Not RS.Eof
Set No = TreeView.Nodes.Add(NoPai.Key,tvwChild,"E" & RS!Id_I, RS!No_P)
No.EnsureVisible
If RS!TemEstrutura Then
Carrega_Estrutura No, RS!No_I
End If
RS.MoveNext
Loop
RS.close
Set No=Nothing
Set RS = Nothing
End Sub
Bom, é mais ou menos isso aí. É claro que eu não testei, mas a idéia básica é essa. Desta forma, o programa irá executar a procedure Carrega_Estrutura até que todos o s itens que compões o produto estejam na TreeView. Talvez você tenha que adaptar a parte que cria o novo nó na TreeView, pois em caso de um mesmo produto poder estar em duois lugares diferentes na hierarquia, vocÊ recebeá a mensagem de que a chave não é exclusiva dentro da coleção, nesse caso, você terá que inventar um jeito de criar chaves exclusivas para cada item da TreeView.
Espero ter ajudado.
um abraço,
Sandro.