Shape コマンドの APPEND 句で、列 (複数も可) を Recordset に追加します。ほとんどの場合、追加する列は、子 Recordset を参照するチャプタ列です。
構文
SHAPE [parent-command [[AS] parent-alias]]
APPEND ( column-list [ [[AS] child-alias]
[RELATE parent-column TO child-column], ... ] )
[[AS] chapter-alias]
[, ... ]
要素の説明
かっこ ("()") は必須のキーワードです。このかっこで、プロバイダ コマンドによって返された親 Recordset にチャプタ列が追加されます。
この句の要素には、次のものがあります。
parent-command
次のうちの 1 つです。または、parent-command をまったく指定しなくてもかまいません。
parent-alias
親 Recordset を参照するオプションのエイリアス。
column-list
次のうちの 1 つ以上です。
child-alias
子 Recordset を参照するエイリアス。
parent-column
parent-command で返される Recordset 内の列。
child-column
child-command で返される Recordset 内の列。
chapter-alias
親へ追加されたチャプタ列を参照するエイリアス。
...
"parent-column TO child-column" 句は、実際には、定義されたそれぞれの関係がカンマで区切られた一覧です。
...
APPEND キーワードの後の句は、実際には各句がカンマで区切られた一覧であり、親へ追加される別の列が定義されます。
非パラメータ化コマンドの操作
parent-command がある場合はそれが発行され、親 Recordset が返されます。次に child-command が発行され、子 Recordset が返されます。
たとえば、parent-command で Customers テーブルからある会社の顧客の Recordset を取得し、child-command で Orders テーブルから顧客全員の注文の Recordset を取得することができます。
SHAPE {SELECT * FROM Customers}
APPEND ({SELECT * FROM Orders} AS chapOrders
RELATE customerID TO customerID)
パラメータ化されていない親子関係の場合、親と子の Recordset オブジェクトは、共通の列を持っていて互いに関連付けられている必要があります。このような列は、最初に parent-column、次に child-column という順序で、RELATE 句に指定します。それぞれの列は、対応する Recordset オブジェクト内で別の名前にすることができますが、意味のある関係を指定するために、同じ情報を参照させる必要があります。たとえば、Customers および Orders Recordset オブジェクトの両方に、customerID フィールドを持たせることができます。
データ シェイプによって、チャプタ列が親 Recordset に追加されます。チャプタ列の値は、RELATE 句の条件を満たしている、子 Recordset の行への参照です。つまり、指定された親行の parent-column にある値と、子チャプタのすべての行の child-column にある値は、同じです。複数の TO 句が同じ RELATE 句で使用された場合は、AND 演算子によって暗黙的に結合されます。
チャプタ列の参照にアクセスした場合、ADO は参照によって表された Recordset を自動的に取得します。パラメータ化されていないコマンドでは、子 Recordset 全体が取得されても、"チャプタ" は行の部分集合を表すだけであることに注意してください。
追加された列に chapter-alias がない場合、自動的に名前が作成されます。列に対応する Field オブジェクトは Recordset オブジェクトの Fields コレクションに追加され、データ型が adChapter になります。
階層 Recordset 内の移動については、「階層 Recordset 内の行へのアクセス」を参照してください。
パラメータ化コマンドの操作
大きな子 Recordset を処理する場合、特に、親 Recordset のサイズと比べて大きいにもかかわらず、わずかな子チャプタにアクセスするだけの場合は、パラメータ化コマンドを使用する方が効率的です。
"非パラメータ化コマンド" では、親および子 Recordsets の全部を取得し、チャプタ列を親に追加してから、親の行それぞれに対して関連する子チャプタへの参照を割り当てます。
"パラメータ化コマンド" では、親 Recordset 全体を取得しますが、チャプタ列にアクセスするときにのみチャプタの Recordset を取得します。この取得方法の違いが、パフォーマンスに大きく影響します。
たとえば、次のように指定することができます。
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
親テーブルと子テーブルに、共通の列名の cust_id があります。child-command には、RELATE 句の参照先 ("...PARAMETER 0") へのプレースホルダ (?) が指定されています。
注意 PARAMETER 句は、Shape コマンドの構文にのみ関係があります。ADO の Parameter オブジェクトまたは Parameters コレクションのどちらにも関連付けられません。
パラメータ化された Shape コマンドが実行されると、次のようになります。
既定では、Cache Child Rows ダイナミック プロパティは True に設定されています。キャッシングの動作は、クエリのパラメータ値によって変化します。単一パラメータが指定されたクエリの場合、指定されたパラメータ値に対応する子のレコードセットは、その値を持つ子に対する次の要求があるまで、キャッシュに入れられます。次のコードは、このことを示しています。
...
SCmd = "SHAPE {select * from customer} " & _
"APPEND({select * from orders where cust_id = ?} " & _
"RELATE cust_id TO PARAMETER 0) AS chpCustOrder"
Rst1.Open sCmd, Cnn1
Set RstChild = Rst1("chpCustOrder").Value
Rst1.MoveNext ' Next cust_id passed to Param 0, & new rs fetched
' into RstChild.
Rst1.MovePrev ' RstChild now holds cached rs, saving round trip.
...
2 つ以上のパラメータが指定されたクエリの場合は、すべてのパラメータ値がキャッシュに入れられた値と等しいときにのみ、キャッシュに入れられた子が使用されます。
混合型コマンド
混合型コマンドとは、部分的にパラメータ化されたコマンドです。次に例を示します。
SHAPE {select * from plants}
APPEND( {select * from customers where country = ?}
RELATE PlantCountry TO PARAMETER 0,
PlantRegion TO CustomerRegion )
混合型コマンドのキャッシング動作は、通常のパラメータ化コマンドの場合と同じです。
挿入 Shape COMPUTE 句
次の例のように、Shape COMPUTE コマンドが任意の数だけネストされた中に、パラメータ化された Shape コマンドのパラメータ化コマンドを埋め込むことができます。
SHAPE {select au_lname, state from authors} APPEND
((SHAPE
(SHAPE
{select * from authors where state = ?} rs
COMPUTE rs, ANY(rs.state) state, ANY(rs.au_lname) au_lname
BY au_id) rs2
COMPUTE rs2, ANY(rs2.state) BY au_lname)
RELATE state TO PARAMETER 0)