ID do artigo: 189657 - Última revisão: terça-feira, 13 de julho de 2004 - Revisão: 1.4

Como usar o comando de forma ADO

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo descreve a sintaxe de comando ADO SHAPE para produzir conjuntos de registros hierárquicos e explica como atravessar conjuntos de registros hierárquicos. Código de exemplo VBA também é fornecido.

Mais Informações

Você pode usar conjuntos de registros hierárquicos como uma alternativa para sintaxe JOIN e GROUP BY quando você precisa acessar dados de resumo e pai-filho.

Conjuntos de registros hierárquicos são usados em vários produtos: Xbase produtos use o comando SET RELATION, o Access usa "Segmented tabelas virtuais" internamente para relatórios com níveis de agrupamento e assim por diante. Hierarquias lhe dão a capacidade para criar um ou vários conjuntos de registros, definir agrupamentos e especificar cálculos agregados sobre conjuntos de registros filho. Embora você poderia implementar funcionalidade similar através de código, essa funcionalidade desloca grande parte do trabalho comuns do desenvolvedor para o sistema.

Conjuntos de registros hierárquicos estão disponíveis através o provedor MSDataShape, que é implementado pelo mecanismo de cursor do cliente.

Conjuntos de registros hierárquicos diferem instruções SQL JOIN e GROUP BY que com um JOIN , os campos da tabela pai e filho campos da tabela são representados no mesmo conjunto de registros. Com um conjunto de registros hierárquico, o conjunto de registros contém apenas os campos da tabela pai. Além disso, o conjunto de registros contém um campo extra que representa os dados relacionados filho, que você pode atribuir a uma segunda variável de conjunto de registros e percorrer.

Quando você estiver executando funções agregadas usando GROUP BY e operadores agregadas, somente os valores agregados aparecem no conjunto de registros. Com conjuntos de registros hierárquicos, os valores agregados são representados no conjunto de registros pai e os registros de detalhes estão no conjunto de registros filho.

Você pode criar três tipos de formas, e cada tipo tem sua própria pontos fortes e fracos. Você precisará escolher o mecanismo que melhor atenda às necessidades do seu aplicativo e do ambiente que é executar seu aplicativo em. Os tipos de SHAPE são da seguinte maneira:
  • Relação com
  • Parâmetro com
  • Grupo com
As duas primeiras são semelhantes em que eles produzem uma hierarquia que caso contrário poderia ser representada por uma instrução SQL JOIN . Diferem em que todos os registros pai e filho são lidos em um cache local antes de qualquer processamento continua na hierarquia da relação. Esse tipo de hierarquia tem uma alta sobrecarga inicial ao recuperar os registros, mas a sobrecarga é baixa após a recuperação inicial.

Inicialmente, hierarquias baseadas em parâmetro somente ler os registros pai e buscar o filho registros sob demanda. Embora a sobrecarga inicial é reduzida, você deve emitir uma nova consulta filho para cada registro pai que é acessado e você deve manter a conexão com a fonte de dados para, desde que o conjunto de registros seja aberto.

A hierarquia baseada em grupo é equivalente a produzir uma instrução SQL agregada associada a um detalhe SQL instrução ou executando funções agregadas em dados não-normalizados. Você não pode atualizar as colunas de resumo e as colunas calculadas porque pode ser derivados de mais de um registro. Como hierarquias baseadas em relação, todos os registros devem ser lidos antecipadamente.

Conjuntos de registros hierárquicos são disponibilizados pela cláusula SHAPE . Sintaxe simplificada é fornecido pela primeira vez, em seguida, exemplos com diagramas. Porque a sintaxe de forma pode obter bastante complexa, a gramática formal para a forma cláusula é fornecida no final do artigo para permitir que você estender os exemplos. Você também pode usar o programa no final deste artigo para testar suas próprias instruções de forma . Os exemplos a usam tabelas do banco de dados de exemplo Northwind.

Sintaxe simplificada

   SHAPE {parent-statement}
   APPEND Aggregate
        | ({child-statement} [As Alias]
          RELATE parent-field TO child-field | parameter-marker
                 [, parent-field TO child-field | parameter-marker ...])
          [, Aggregate | ({child statement})...]

   SHAPE {non-normalized-statement} [AS Alias]
   COMPUTE Aggregate
         | Alias
         | ({child-statement} [As Alias] RELATE parent-field TO
                                        child-field | parameter-marker)
           [, Aggregate | Alias | ({child-statement}...)]
   [BY grouping-field [, grouping-field]]

   SHAPE {non-normalized-statement} [AS Alias]
   BY grouping-field [, grouping-field]
				

OBSERVAÇÕES:

  1. Se você selecionar campos idêntico de diferentes tabelas, talvez seja necessário alias-los para garantir que o analisador de SHAPE funcione.
  2. As funções de Forma APPEND da mesma forma para um OUTER JOIN em que de um registro pai é em retornado, mesmo não se existe nenhum registro filho para ele.
  3. Agregações só podem operar em campos os filhos imediatos do conjunto de registros. Para operar em campos de netos e assim por diante, você deve produzir agregados intermediários. Consulte a hierarquia de grupo com Aggregate exemplo no final deste artigo para obter uma ilustração.
  4. Se você usar uma função agregada com a sintaxe de APPEND forma , o valor agregado ocupará um campo acrescentado ao conjunto de resultados pai, que também contém os campos da instrução pai. Por outro lado, a Forma COMPUTE e SHAPE BY crie um novo nível pai para os agregados e a não-normalizados-instrução se torna o conjunto de registros filho.
  5. O provedor SHAPE requer que você inclua alias para o não-normalizados-demonstrativo na cláusula COMPUTE ao usar a Forma COMPUTE . Caso contrário, resulta em uma mensagem que não há suporte para a funcionalidade, mesmo que ele não resulta em um erro de sintaxe.

Exemplos

Hierarquia de relação simples:

   SHAPE  {select * from customers}
   APPEND ({select * from orders} AS rsOrders
           RELATE customerid TO customerid)
				
que produz:
   Customers.*
   rsOrders
        |
        +----Orders.*
				
em diagrama anterior, o conjunto de registros pai contém todos os campos da tabela Customers e um campo chamado rsOrders. rsOrders fornece uma referência ao conjunto de registros filho e contém todos os campos de pedidos tabela. Outros exemplos usam uma notação semelhante.

Hierarquia parametrizada:

   SHAPE  {select * from customers}
   APPEND ({select * from orders where customerid = ?} AS rsOrders
           RELATE customerid TO PARAMETER 0)
				
Isso resulta na mesma hierarquia como a hierarquia simples de relação.

Composto Relation hierarquia:

Este exemplo ilustra uma hierarquia de três níveis de clientes, pedidos e detalhes do pedido:
   SHAPE  {SELECT * from customers}
   APPEND ((SHAPE  {select * from orders}
            APPEND ({select * from [order details]} AS rsDetails
                   RELATE orderid TO orderid)) AS rsOrders
          RELATE customerid TO customerid)
				
que produz:
   Customers.*
   rsOrders
        |
        +----Orders.*
             rsDetails
                 |
                 +----[Order Details].*
				

Hierarquia de relação vários:

Este exemplo ilustra uma hierarquia envolvendo um conjunto de registros pai e dois conjuntos de registros filho, um dos quais é parametrizado:
   SHAPE  {SELECT * FROM customers}
   APPEND ({SELECT *
            FROM orders
            WHERE orderdate < #1/1/1998# AND customerid = ?}
            RELATE customerid TO PARAMETER 0) AS rsOldOrders,
          ({SELECT *
            FROM orders
            WHERE orderdate >= #1/1/1998#}
            RELATE customerid TO customerid) AS rsRecentOrders
				
que produz:
   Customers.*
   rsOldOrders
        |
        +----Orders.*
   rsRecentOrders
        |
        +----Orders.*
				

Hierarquia com agregação:

   SHAPE  (select * from orders}
   APPEND ({select od.orderid, od.UnitPrice * od.quantity as ExtendedPrice
            from [order details] As od}
          RELATE orderid TO orderid) As rsDetails,
          SUM(ExtendedPrice) AS OrderTotal
				
que produz:
   Orders.*
   rsDetails
       |
       +----orderid
            ExtendedPrice
   OrderTotal
				

Hierarquia de grupo:

   SHAPE  {select customers.customerid AS cust_id, orders.*
           from customers inner join orders
           on customers.customerid = orders.customerid} AS rsOrders
   COMPUTE rsOrders BY cust_id
				
que produz:
   rsOrders
       |
       +----cust_id
            Orders.*
   cust_id
				

Hierarquia de grupo com agregação:

Observação : A cláusula interna SHAPE neste exemplo é idêntica à instrução usada na hierarquia com exemplo Aggregate.
   SHAPE
           (SHAPE   {select customers.*, orders.orderid, orders.orderdate
                     from customers inner join orders
                     on customers.customerid = orders.customerid}
            APPEND  ({select od.orderid,
                             od.unitprice * od.quantity as ExtendedPrice
                      from [order details] as od} AS rsDetails
                    RELATE orderid TO orderid),
                    SUM(rsDetails.ExtendedPrice) AS OrderTotal) AS rsOrders
   COMPUTE  rsOrders,
            SUM(rsOrders.OrderTotal) AS CustTotal,
            ANY(rsOrders.contactname) AS Contact
   BY       customerid
				
which yields:
   rsOrders
        |
        +----Customers.*
             orderid
             orderdate
             rsDetails
                  |
                  +----orderid
                       ExtendedPrice
             OrderTotal
   CustomerTotal
   Contact
   customerid
				

Vários agrupamentos:

   SHAPE
          (SHAPE  {select customers.*,
                          od.unitprice * od.quantity as ExtendedPrice
                   from (customers inner join orders
                   on customers.customerid = orders.customerid) inner join
                   [order details] as od on orders.orderid = od.orderid}
                          AS rsDetail
           COMPUTE ANY(rsDetail.contactname) AS Contact,
                   ANY(rsDetail.region) AS Region,
                   SUM(rsDetail.ExtendedPrice) AS CustTotal,
                   rsDetail
           BY customerid) AS rsCustSummary
   COMPUTE rsCustSummary
   BY      Region
				
que produz:
   rsCustSummary
        |
        +-----Contact
              Region
              CustTotal
              rsDetail
                   |
                   +----Customers.*
                        ExtendedPrice
              customerid
   Region
				

Total geral:

   SHAPE
          (SHAPE  {select customers.*,
                          od.unitprice * od.quantity as ExtendedPrice
                   from (customers inner join orders
                   on customers.customerid = orders.customerid) inner join
                   [order details] as od on orders.orderid = od.orderid}
                          AS rsDetail
           COMPUTE ANY(rsDetail.contactname) AS Contact,
                   SUM(rsDetail.ExtendedPrice) AS CustTotal,
                   rsDetail
           BY customerid) AS rsCustSummary
   COMPUTE SUM(rsCustSummary.CustTotal) As GrandTotal,
           rsCustSummary
				
Observe a cláusula BY ausente no resumo externa. Isso define o total principal porque o conjunto de linhas pai contém um único registro com o total geral e um ponteiro para o conjunto de registros filho.
   GrandTotal
   rsCustSummary
        |
        +-----Contact
              CustTotal
              rsDetail
                  |
                  +----Customers.*
                       ExtendedPrice
              customerid
				

Hierarquia complexa:

Este exemplo ilustra uma hierarquia que contém um conjunto de linhas pai, conjuntos de dois filho linhas, um dos quais é parametrizado, e um detalhe de grupo.
   SHAPE {select customers.* from customers} AS rsDetail
   COMPUTE rsDetail,
           ANY(rsDetail.companyname) AS Company,
           ({select * from orders where customerid = ?}
                   RELATE customerid TO PARAMETER 0) AS rsOrders,
           COUNT(rsOrders.orderid) AS OrderCount
   BY customerid
				
which yields:
rsDetail
        |
        +----Customers.*
   Company
   rsOrders
        |
        +----Orders.*
   OrderCount
   customerid
				

Pai agrupado relacionados a filho agrupado:

   SHAPE
          (SHAPE  {select * from customers}
           APPEND ((SHAPE {select orders.*, year(orderdate) as OrderYear,
                                  month(orderdate) as OrderMonth
                           from orders} AS rsOrders
                    COMPUTE rsOrders
                    BY customerid, OrderYear, OrderMonth)
                    RELATE customerid TO customerid) AS rsOrdByMonth )
           AS rsCustomers
   COMPUTE rsCustomers
   BY      region
				
que produz:
   rsCustomers
        |
        +-----customers.*
              rsOrdByMonth
                 |
                 +-----rsOrders
                            |
                            +---- Orders.*
                       customerid
                       OrderYear
                       OrderMonth
   region
				

Cláusula de forma gramática formal

  <shape-command>      ::=  SHAPE <table-exp> [AS <alias>]
                            [<shape_action>]

  <shape-action>       ::=  APPEND <aliased-field-list>
                            | COMPUTE <aliased-field-list>
                              [BY <field-list>]
                            | BY <field-list>

  <table-exp>          ::=  {<native-sql-statement>}
                            | ( <shape-command> )
 
  <aliased-field-list> ::=  <aliased-field> [, <aliased-field...]
 
  <aliased-field>      ::=  <field-exp> [AS <alias>]
 
  <field-exp>          ::=  ( <relation-exp> ) | <calculated-exp>
 
  <relation_exp>       ::=   <table-exp> [AS <alias>] RELATE
                             <relation-cond-list>
 
  <relation-cond-list> ::=   <relation-cond> [, <relation-cond>...]
 
  <relation-cond>      ::=   <field-name> TO <child-ref>
 
  <child-ref>          ::=   <field-name> | PARAMETER <param-ref>
 
  <param-ref>          ::=   <name> | <number>
 
  <field-list>         ::=   <field-name [, <filed-name>]
 
  <calculated-exp>     ::=   SUM (<qualified-field-name>)
                             | AVG (<qualified-field-name>)
                             | MIN (<qualified-field-name>)
                             | MAX (<qualified-field-name>)
                             | COUNT (<alias>)
                             | SDEV (<qualified-field-name>)
                             | ANY (<qualified-field-name>)
                             | CALC (<expression>)
 
  <qualified-field-name>::=  <alias>.<field-name> | <field-name>
 
  <alias>               ::=  <quoted-name>
 
  <field-name>          ::=  <quoted-name>
 
  <quoted-name>         ::=  "<string>" | '<string>' | <name>
 
  <name>                ::=  alpha [ alpha | digit | _ | # ...]
 
  <number>              ::=  digit [digit...]
 
  <string>              ::=  unicode-char [unicode-char...]
 
  <expression>          ::=  an expression recognized by the Jet
                             Expression service whose operands are
                             other non-CALC columns in the same row.
				

VBA SHAPE Test Program

O programa código VBA a seguir permite que você digita em seu próprio comando SHAPE e exibir a hierarquia de campo ou indicar o local do erro de sintaxe.

Aviso : USE O código fornecido IN este artigo YOUR próprio risco. A Microsoft fornece esse código "como estão" sem garantia de qualquer tipo, expressa ou implícita, inclusive mas não limitada às garantias implícitas de comercialização e/ou adequação a uma finalidade específica.
  1. O administrador de ODBC do painel de controle adicione um DSN para o driver ODBC do Microsoft Access 97 chamado OLE_DB_NWIND_JET apontando para o banco de dados Northwind (ou NWIND).
  2. Crie um novo projeto. Adicione duas caixas de texto (Text1 e Text2) e um botão de comando (Command1).
  3. Fazer ambas as caixas de texto grandes o suficiente para exibir várias linhas de texto e definir as seguintes propriedades:
          Multiline: True                (Visual Basic only)
          Scrollbars: Vertical
          Font: Courier New 10 Point
    					
  4. No menu Project , escolha referências e adicione uma referência ao Microsoft ActiveX Data Objects Library.
  5. Adicione o seguinte código:
       Private Sub Command1_Click()
       Dim cn As ADODB.Connection, rs As ADODB.Recordset
         Me!Text2.Text = ""
         Set cn = New ADODB.Connection
         Set rs = New ADODB.Recordset
         cn.Provider = "MSDataShape"
         cn.Open "dsn=OLE_DB_NWIND_JET"
         On Error Resume Next
         rs.Open Me!Text1.Text, cn, adOpenStatic, adLockReadOnly, adCmdText
         If Err Then MsgBox Error
         ListChapteredFields rs, 0
         rs.Close
         cn.Close
         Set rs = Nothing
         Set cn = Nothing
       End Sub
    
       Private Sub LogText(ByVal sLine As String)
         If Me!Text2.Text = "" Then
           Me!Text2.Text = sLine
         Else
           Me!Text2.Text = Me!Text2.Text & vbCrLf & sLine
         End If
       End Sub
    
       Private Sub ListChapteredFields(ByVal rs As ADODB.Recordset, _
                                          ByVal Level As Long)
       Dim I As Long
         For I = 0 To rs.Fields.Count - 1
           LogText Space$(Level * 3) & rs(I).Name
           If rs(I).Type = adChapter Then
             ListChapteredFields rs(I).Value, Level + 1
           End If
         Next I
       End Sub
    					
  6. Execute o projeto. Digite o comando SHAPE em Text1, clique no botão de comando e a hierarquia é exibido em Text2.
Observação : O texto a seguir fornece um exemplo de usando o provedor OLEDB do Microsoft Jet com o provedor SHAPE:
  cn.Provider = "MSDataShape"
  cn.Open "Data Provider=Microsoft.Jet.OLEDB.4.0"
				
Observação : se você digita errado nomes de campo ou tabela ao usar o driver ODBC do Access 97 ou JOLT provedores, receberá a seguinte mensagem:
Parâmetros insuficientes. N esperado.
Outros provedores podem produzir uma mensagem diferente.

Referências

ADO 2.0 hierárquicos especificação de cursor

Para obter informações adicionais sobre sintaxe de APPEND SHAPE e como percorrer conjuntos de registros hierárquicos, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
185425  (http://support.microsoft.com/kb/185425/EN-US/ ) Conjuntos de registros hierárquicos por meio de SHAPE APPEND via C + ADO / VBA/Java

A informação contida neste artigo aplica-se a:
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.1 Service Pack 2
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft ActiveX Data Objects 2.7
Palavras-chave: 
kbmt kbdatabase kbhowto kbprovider KB189657 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 189657  (http://support.microsoft.com/kb/189657/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.