Makale numarası: 189657 - Son Gözden Geçirme: 13 Temmuz 2004 Salı - Gözden geçirme: 1.4

ADO SHAPE komutu nasıl kullanılır?

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu makalede, hiyerarşik kayıt kümeleri üretme ADO SHAPE komutu sözdizimi'ni açıklar ve hiyerarşik kayıt kümeleri geçiş açıklar. VBA örnek kod da sağlanır.

Daha fazla bilgi

Üst-altöge ve Özet verileri erişmek istediğinizde, hiyerarşik kayıt kümeleri JOIN ve GROUP BY sözdizimi alternatif olarak kullanabilirsiniz.

Hiyerarşik kayıt kümeleri çok ürünlerde kullanılır: ürünleri için dahili olarak gruplandırma düzeyine raporlarıyla "Bölümlenmiş sanal tablolar" Access kullanır RELATION SET komutunu kullanın ve benzeri Xbase. Hiyerarşileri, bir veya daha çok kayıt kümeleri olu?turmak gruplandırmaları tanımlayın ve alt kayıt kümesi üzerinde toplam hesaplamalarını belirtmek sağlıyor. Benzer işlevler koduyla uygulamak, ancak bu işlevselliği s?radan iş çoğunu geliştirici sisteme geçirir.

Hiyerarşik kayıt kümeleri, istemci imleç altyapısı tarafından uygulanan MSDataShape sağlayıcı aracılığıyla edinilebilir.

Bir JOIN ile birlikte, ana tablo alanları ve alt tablo alanları aynı kayıt içinde gösterilir, hiyerarşik kayıt kümeleri SQL JOIN ve GROUP BY deyimlerinden farklı. Sıradüzensel bir recordset ile kayıt yalnızca <a0>üst</a0> tablosundan alanlar içerir. Buna ek olarak, kayıt, ikinci bir recordset değişkenine atayın ve geçiş ilgili alt verisini temsil eden bir fazladan alan içerir.

GROUP BY ve toplama işleçleri kullanarak toplama işlevleri gerçekleştirirken, yalnızca toplam değerleri recordset içinde görünür. Hiyerarşik kayıt kümeleri alt recordset ayrıntı kayıtları olan ve toplam değerlerini üst recordset içinde gösterilir.

Üç şekiller oluşturabilir ve her tür, kendi güçlü ve zayıf yanları vardır. Uygulamanız, uygulama çalıştırıyor olmanız ortam ve gereksinimlerinize en iyi uyan mekanizması'ı seçmeniz gerekir. SHAPE türleri şunlardır:
  • Temel ilişki
  • Parametre tabanlı
  • Temel Grup
Bunlar, başka bir SQL JOIN deyimi ile temsil bir hiyerarşi oluşturmak için ilk iki benzer. Tüm üst ve alt kayıtların önce herhangi bir işlem, yerel önbelleğine okunur devam eder, ilişki tabanlı hiyerarşisinde, farklı. Bu tür bir sıradüzeni yüksek ilk ek yükü kayıtlar alınırken olsa da, yükü sonra ilk alma yetersiz.

Başlangıçta, parametre tabanlı hiyerarşileri yalnızca üst kayıt okunamıyor ve alt kayıtları istek üzerine getirin. Ilk ek yükü azalır, ancak erişilen her üst kaydı için yeni bir alt sorgu kesmeniz gerekir ve kayıt kümesi açık olduğu sürece için veri kaynağı bağlantısı korumalısınız.

Ayrıntı için SQL birleştirilmiş bir toplam SQL deyimi üretmek için temel grubu hiyerarşisi eşdeğerdir olmayan normalleştirilmiş verilerini toplama işlevleri gerçekleştiren <a0>deyimi veya</a0>. Bunlar birden fazla kayıt türetilmiş, Özet sütunları ve hesaplanan sütunları güncelleştirilemiyor. Ilişki tabanlı hiyerarşileri gibi tüm kayıtların en fazla ön okumak zorunda.

Hiyerarşik kayıt kümeleri SHAPE yan tümcesi ile yeniden kullanılabilir. Ilk olarak, Basitleştirilmiş sözdizimi örnekleri ile diyagramları sonra sağlanır. SHAPE sözdizimi oldukça karmaşık almak için resmi dilbilgisi ŞEKLI için örnekler genişletmenizi izin vermek için bu makalenin sonunda yan tümcesi sağlanır. Program, bu makalenin sonunda kendi SHAPE ifadeleri sınamak için de kullanılabilir. Örnekler, Northwind örnek veritabanındaki tabloları kullanın.

Basitleştirilmiş sözdizimi

   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]
				

NOTLAR:

  1. Farklı tablolardan aynı adlı alanlar'ı seçerseniz, diğer SHAPE çözümleyici çalıştığından emin olmak için bunları gerekebilir.
  2. Alt kayıt için bulunsa bile SHAPE APPEND işlevlere benzer bir OUTER JOıN'I olan, bir üst kayıt, döndürülür.
  3. Toplamları yalnızca hemen altındaki alt kümesinin alanlar üzerinde çalışabilir. De ve alanlar üzerinde çalışmak için <a0></a0>, ara toplamları üretmelidir. Bir örnek için bu makalenin sonundaki toplu örnekle Grup hiyerarşisini</a1> konusuna bakın.
  4. SHAPE APPEND sözdizimi ile bir toplama işlevi kullanırsanız, toplam değeri üst deyimi alanları içeren ana resultset eklenen bir alanı kaplayacağı. Buna ek olarak, SHAPE COMPUTE ve SHAPE BY toplamları için yeni bir üst düzey oluşturmak ve alt recordset olmayan-normalleştirilmiş-deyimi olur.
  5. Diğer ad dahil SHAPE sağlayıcı gerektirir non-normalleştirilmiş-deyiminde SHAPE COMPUTE kullanırken COMPUTE yan tümcesi için. Karşın, bir sözdizimi hatası neden görünmüyor işlevselliğini desteklenmediğini, iletide bunu yapmak için hata neden olur.

Örnekler

Basit bir Relation hiyerarşisi:

   SHAPE  {select * from customers}
   APPEND ({select * from orders} AS rsOrders
           RELATE customerid TO customerid)
				
hangi sayıları:
   Customers.*
   rsOrders
        |
        +----Orders.*
				
önceki şemada üst recordset Müşteriler tablosundaki tüm alanları içerir ve rsOrders rsOrders adlı alan alt recordset için bir başvuru sağlar ve siparişlerin tüm alanları içeren tabloyu. Diğer örnekler arasında benzer bir biçimde kullanın.

Parametreli sıradüzen:

   SHAPE  {select * from customers}
   APPEND ({select * from orders where customerid = ?} AS rsOrders
           RELATE customerid TO PARAMETER 0)
				
Bu basit ilişkisi sıradüzeni olarak aynı hiyerarşi olur.

Relation sıradüzeni bileşik:

Bu örnekte üç düzeyli sıradüzeni, müşteriler ve Siparişler sipariş ayrıntılarını gösterir:
   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)
				
hangi sayıları:
   Customers.*
   rsOrders
        |
        +----Orders.*
             rsDetails
                 |
                 +----[Order Details].*
				

Birden çok ilişki hiyerarşisi:

Bu örnek biri parametreli bir üst recordset'i ve iki alt kayıt kümesi hiyerarşisini gösterir:
   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
				
hangi sayıları:
   Customers.*
   rsOldOrders
        |
        +----Orders.*
   rsRecentOrders
        |
        +----Orders.*
				

Hiyerarşi topluluğu:

   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
				
hangi sayıları:
   Orders.*
   rsDetails
       |
       +----orderid
            ExtendedPrice
   OrderTotal
				

Grup hiyerarşisi için:

   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
				
hangi sayıları:
   rsOrders
       |
       +----cust_id
            Orders.*
   cust_id
				

Grup hiyerarşisi topluluğu olan:

Not: Bu örnekte SHAPE yan tümce toplu örnekle hiyerarşisinde kullanılan deyime aynıdır.
   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
				

Birden çok grupları:

   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
				
hangi sayıları:
   rsCustSummary
        |
        +-----Contact
              Region
              CustTotal
              rsDetail
                   |
                   +----Customers.*
                        ExtendedPrice
              customerid
   Region
				

Genel toplamı:

   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
				
Dış Özet eksik BY yan tümcesi unutmayın. Üst satır genel toplamı ve alt recordset için bir işaretçi içeren tek bir kayıt içerdiğinden genel toplam tanımlar.
   GrandTotal
   rsCustSummary
        |
        +-----Contact
              CustTotal
              rsDetail
                  |
                  +----Customers.*
                       ExtendedPrice
              customerid
				

Karmaşık hiyerarşisi için:

Bu örnek, bir üst satır içeren bir hiyerarşi, biri parametrelenmiştir, iki alt satır kümeleri ve bir grup ayrıntıları gösterir.
   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
				

Gruplandırılmış bir üst gruplandırılmış alt için ilgili:

   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
				
hangi sayıları:
   rsCustomers
        |
        +-----customers.*
              rsOrdByMonth
                 |
                 +-----rsOrders
                            |
                            +---- Orders.*
                       customerid
                       OrderYear
                       OrderMonth
   region
				

SHAPE yan tümcesi biçimsel dilbilgisi

  <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 sınama programı

Aşağıdaki VBA program kod türü kendi SHAPE komutunu etkinleştirir ve alan hiyerarşisini görüntülemek veya sözdizimi hatası konumunu belirtin.

UYARı: Bu MAKALEYI YOUR KENDI RISKI AT KODU SAğLANAN USE. Microsoft, hiçbir garanti, ya da veya zımni, dahil ancak bunlarla sınırlı olmamak satılabilirlik ve/veya belirli bir amaca uygunluk zımni hiçbir garanti olmadan "olduğu gibi", bu kodu sağlar.
  1. Denetim Masası içinde ODBC Yöneticisi bir DSN (veya NWIND) Northwind veritabanına işaret OLE_DB_NWIND_JET adlı Microsoft Access 97 ODBC sürücüsü ekleyin.
  2. Yeni bir proje oluşturun. Iki metin kutusu (Metin1; metin2) ve (Command1) bir <a0>komut düğmesi ekleyin.
  3. Her iki metin kutularının birkaç satırlık bir metin görüntülemek ve aşağıdaki özelliklerini ayarlamak için yeterli büyüklükte olun:
          Multiline: True                (Visual Basic only)
          Scrollbars: Vertical
          Font: Courier New 10 Point
    					
  4. Proje menüsünde başvuru ' ı seçin ve bir başvuru için Microsoft ActiveX Data Objects kitaplığı.
  5. Aşağıdaki kodu ekleyin:
       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. Projeyi çalıştırın. Metin1, Metin2 komut düğmesinin ve sıradüzeni görünür tıklatın SHAPE komutunu yazın.
Not: Microsoft Jet OLEDB Sağlayıcısı ile SHAPE sağlayıcısı kullanarak bir örnek aşağıdaki metni sağlar:
  cn.Provider = "MSDataShape"
  cn.Open "Data Provider=Microsoft.Jet.OLEDB.4.0"
				
Not: Access 97 ODBC sürücüsü veya JOLT sağlayıcıları'nı kullanırken, alan veya tablo adlarını yazdığınız, aşağıdaki iletiyi alırsınız:
Çok az parametre. Beklenen n.
Diğer sağlayıcılarla farklı bir ileti üretebilir.

Referanslar

ADO 2.0 sıradüzensel imleç belirtimi

SHAPE APPEND sözdizimi ve hiyerarşik kayıt kümeleri çapraz geçiş yapma hakkında ek bilgi için lütfen Microsoft Knowledge Base'de aşağıdaki makaleye bakın:
185425  (http://support.microsoft.com/kb/185425/EN-US/ ) <a1>ADO</a1> sıradüzensel Recordset üzerinden SHAPE APPEND aracılığıyla C + +/ VBA/Java

Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbmt kbdatabase kbhowto kbprovider KB189657 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:189657  (http://support.microsoft.com/kb/189657/en-us/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.