Microsoft KB Archive/191744

= How To Extract Child Recordsets from Shaped Recordset =

Article ID: 191744

Article Last Modified on 3/2/2005

-

APPLIES TO


 * 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

-



This article was previously published under Q191744



SUMMARY
When shaping a hierarchical recordset, examine the Type property of each field object to determine if it is actual data or a child recordset (Type = adChapter).



MORE INFORMATION
Consider the following sample SHAPE statement: SHAPE {SELECT * FROM customers} APPEND ({SELECT * FROM orders} AS rsOrders

RELATE customerid TO customerid) The first N columns of the recordset returned correspond to the columns returned by the SQL statement in the first set of brackets after the SHAPE statement. That is, the first N columns will be actual data. After that, a given column in the recordset may be of type adChapter, which indicates a child recordset, or it could be data from a calculated column. (This is not demonstrated in the preceding SQL statement.)

The following Visual Basic sample code demonstrates returning a shaped recordset and a function, PrintTbl, that displays the contents of the returned recordset. Note that the test for the field type of adChapter is to identify child recordsets for a given row.

WARNING: ANY USE BY YOU OF THE CODE PROVIDED IN THIS ARTICLE IS AT YOUR OWN RISK. Microsoft provides this code "as is" without warranty of any kind, either expressed or implied, including but not limited to the implied warranties of merchantability and/or fitness for a particular purpose. Microsoft does not support modifications to this code.

Example
 In Visual Basic or Visual Basic for Applications (VBA), create a new project with a Form (Form1) and a Module (Module1). Add a reference for the Microsoft ActiveX Data Objects Library.  Add the following code to the module: Public Sub PrintTbl(rs, indent) Dim s As String, col As ADODB.Field, rsChild As ADODB.Recordset

' This routine distinguishes between columns in the recordset with ' data, i.e. type <> adChapter, and those which contain a child ' recordset, for example, type = adChapter. Do While Not rs.EOF

s = Space(indent) For Each col In rs.Fields If col.Type <> adChapter Then If Len(s) > indent Then s = s & " | " s = s & col.Value Else ' Display data columns encountered so far (if any). If Len(s) > indent Then Debug.Print Space(indent) & s          ' Recursively call printtbl to display child recordset. Set rsChild = col.Value PrintTbl rsChild, indent + 4 ' Reset in case there are further data columns. s = Space(indent) End If      Next

' In case we have any data columns that have not been ' displayed yet. If Len(s) > indent Then Debug.Print s

rs.MoveNext Loop

End Sub  Add a Command button to the form (Command1).  Add the following code to the form: Private Sub Command1_Click Dim strConnect, rst As ADODB.Recordset

Set rst = New ADODB.Recordset

strConnect = "Provider=MSDataShape;data provider=msdasql;" _ & "data source=dsnNwind;database=nwind;"

rst.Source = "SHAPE {SELECT * FROM customers} APPEND " _ & "({SELECT * FROM orders} AS rsOrders " _             & "RELATE customerid TO customerid)"

rst.ActiveConnection = strConnect rst.Open, , adOpenStatic, adLockBatchOptimistic

debug.print " PRINTING CUSTOMERS TABLE" printtbl rst, 0

Set rst.ActiveConnection = Nothing rst.Close Set rst = Nothing

End Sub NOTE: Make sure that you change the Connect string appropriately for your system. That is, change "dsnNwind" to the name of a ODBC dsn that points to the Nwinds.MDB that comes with Visual Basic. Alternatively, create an ODBC DSN named dsnNwind that points to the Nwinds.MDB that comes with Visual Basic.

 Run the project, display the form, and click the Command button. Note that the hierarchical data appears in the Immediate or Debug window.</ol>

<div class="references_section">