Usando o Controle Hierarchical FlexGrid


O controle Hierarchical FlexGrid (MSHFlexGrid) esta disponível a partir da versão 6.0 do VB e você poderá utilizá-lo para exibir grupos de dados relacionados em um formato compacto e amigável.

Usando o cursor hierárquico podemos definir um objeto Recordset Filho como relacionamento de um campo Recordset Pai. Temos também uma nova sintaxe para manipular essas informações que nos permite criar consultas que resultam em um Recordset hierárquico.

Isto pode ser feito de duas maneiras: primeiro anexando um Recordset Filho ao Recordset Pai enquanto o segundo atua em um operação agregada em um Recordset filho  e gera um recordset Pai.

O acesso ao Recordset hierárquico pode ser feito via código ou através de um controle visual como o Data Environment.

Para Vincular dados ao controle Hierarchical FlexGrid iremos usar o provedor MSDataShape , ele nos dará a capacidade de executar comandos usando um superconjunto da sintaxe SQL permitindo a descrição de uma relação entre dois conjuntos de registros. 

Embora a relação entre duas tabelas possa ser escrita usando uma junção SQL ( Join ),   a relação hierárquica faz o serviço com mais eficiência  pois evita exibir diversos registros repetidos do lado "UM" .

Para ilustrar vamos construir um projeto onde usaremos o controle MSHFlexGrid em duas situações: 

Iniciando o Projeto

  1. Cria um novo projeto STANDARD EXE  no VB
  2. Adicione os controles Microsoft Hierarchical FlexGrid Control 6.0 OLE DB e o controle Microsoft ADO Data Control   ao seu projeto.
  3. Insira os controles no seu formulário e inclua um controle Frame com dois botões de opção e um botão de comando conforme figura abaixo
No formulário do projeto temos a opção de escolher qual a conexão vamos usar. Para isto basta selecionar a conexão desejada e clicar  no botão iniciar.

Obs: A conexão para a base Access usa o provedor OLE DB Jet versão 3.51 (access 97). Se você for usar uma base de dados Access 2000 use a versão 4.0.

Nota : A conexão com o SQL Server esta específica para a configuração da minha máquina. Ao utilizar o exemplo no seu equipamento refaça a configurção do DATA SOURCE.

  1. Agora insira o seguinte código no formulário:
Private Sub Command1_Click()
   iniciar_conexao
End Sub

Private Sub iniciar_conexao()
Dim conexao As String
Dim sql As String

If optsqlserver Then
  'CONEXAO COM SQLSERVER tabela Nortwind 
  conexao = "Provider=MSDataShape;" & _
  "Data Source=MACORATI;Initial Catalog=Northwind;Persist Security Info=False;User ID=sa;" & _
  "Data Provider=SQLOLEDB.1;"


  sql = "SHAPE {SELECT DISTINCT Country FROM Customers } " & _
  "APPEND ({SELECT * FROM Customers} " & _
  "RELATE Country TO Country)"


Else
  'CONEXAO COM ACCESS : BIBBLIO.MDB tabelaS - Publishers e Titles
  conexao = "Provider=MSDataShape;" & _
  "Data Source=C:\teste\biblio.mdb;" & _
  "Data Provider=Microsoft.Jet.OLEDB.3.51;"

  sql = "SHAPE {SELECT PubID,Name FROM Publishers } " & _
  "APPEND ({SELECT * FROM Titles} " & _
  "RELATE PubID TO PubID)"


End If

With Adodc1
  .ConnectionString = conexao
  .RecordSource = sql
End With

 Adodc1.Refresh
 Set MSHFlexGrid1.DataSource = Adodc1

End Sub

Como funciona ?

Ao clicar no botão Iniciar a procedure iniciar_conexão é chamada , e , conforme a seleção de conexão feita realiza a conexão.

Embora a configuração para as conexões sejam diferentes , a sintaxe usada é a da linguagem DATA SHAPING . Podemos dividir a instrução em três partes:

  1. A instrução SQL que gera o Recordset Pai ( Parent Recordset)
  2. A instrução SQL que gera o Recordset Filho ( Child Recordset)
  3. A instrução que faz o relacionamento entre os dois Recordsets

A sintaxe é a seguinte:

"SHAPE {parent-command} [[AS] table-alias]

APPEND {child-command}

RELATE(parent-column TO child-column)"

 

"SHAPE {< INSTRUÇÃO  SQL 1 >} [[AS] table-alias]

APPEND {<INSTRUÇÃO SQL 2>}

RELATE(<INSTRUÇÃO SQL 3>)"

 

Nota: O aliás usado no comando SHAPE , ([AS] table-alias]) é opcional

Vamos dar uma olhada em uma das  conexões usadas:

conexao = "Provider=MSDataShape;" & _
                   "Data Source=C:\teste\biblio.mdb;" & _
                   "Data Provider=Microsoft.Jet.OLEDB.3.51;"

Observe que usamos um provedor - Provider -  chamado MSDataShape , é ele que forma o recordset hierárquico além disso tivemos que informar o Data Source que indica  a localização da nossa base de dados e o Data Provider que informa a fonte original de dados e determina quais características do SQL o Shape pode usar.

A instrução SQL usada constrói a estrutura do Recordset que desejamos exibir. Ela usa a sintaxe Shape já explicada acima.

Se você levar em conta que a podemos passar parâmetros para o comando SHAPE , como por exemplo:

"SHAPE {SELECT * FROM customer} 
APPEND {SELECT * FROM orders WHERE cust_id = ?} 
RELATE (cust_id TO PARAMETER 0)"

Aqui as tabelas tem em comum  a coluna cust_id , então usamos  o coringa ? em {child-command} que é referenciado na cláusula RELATE e relacionado com PARAMETER 0 , que neste caso é a coluna {child-command} atribuida a ? Verá que temos muitas possibilidades para aplicação desta técnica.

Vejamos o resultado da execução para a conexão SQL Server :

Ao lado o resultado da conexão com o SQL Server.

Vemos uma lista de países e todos os clientes desses países. 

Os registros são exibidos em um formato de contorno que você pode expandir (+) ou reduzir (-). 

Tudo isto produz um formato compacto que pode ser percorrido com mais facilidade.

Com isto apenas arranhamos os recordsets hierárquicos e o Data Shaping. Mais informações ?  Visite o site msdn.microsoft.com  e bom estudo...


Copyright (c) 2001 - José Carlos Macoratti e amigos (Toda a Web)