tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル抽出したレコードセットのコピー
記事No12334
投稿日: 2008/05/22(Thu) 22:57
投稿者赤鴉
初めまして。

VB6.0上にてADOでmdbに接続し、openしたレコードセットについてなのですが、
普通にオープンして全件取得(RS_1)
RS_1.Filterをして抽出。
別のレコードセット(RS_2)にコピーしたいのですが、

Set RS_2 = RS_1で見かけは出来ているように見えるのですが実際は出来ていません。
全件残ったまま?で代入されてしまいます。

どうすればよろしいでしょうか?

[ツリー表示へ]
タイトルRe: 抽出したレコードセットのコピー
記事No12335
投稿日: 2008/05/22(Thu) 23:17
投稿者魔界の仮面弁士
> Set RS_2 = RS_1
これは単なるインスタンス共有です。
1 つの Recordset が、2 つの変数から参照されるだけです。


> 別のレコードセット(RS_2)にコピーしたいのですが、
この場合の「コピー」とは、どのような動作を想定しているのか
読み取れませんでしたが、とりあえず思いつきで回答。


Private Sub Form_Load()
    Dim RS_1 As ADODB.Recordset
    Dim RS_2 As ADODB.Recordset
    Dim RS_3 As ADODB.Recordset

    Set RS_1 = CreateSampleRecordset()
    
    'オリジナル
    Debug.Print "== RS_1 (all) ==="
    Debug.Print RS_1.GetString(, , "|")
    Debug.Print "== RS_1 (F1=123) ==="
    RS_1.Filter = "F1=123"
    Debug.Print RS_1.GetString(, , "|")
    
    '同一カーソルを持つ複製の作成
    Set RS_2 = RS_1.Clone(adLockBatchOptimistic)
    Debug.Print "== RS_2 (all) ==="
    Debug.Print RS_2.GetString(, , "|")
    Debug.Print "== RS_2 (F2='CDE') ==="
    RS_2.Filter = "F2='CDE'"
    Debug.Print RS_2.GetString(, , "|")
    
    'カーソルを共有しない複製の作成
    Set RS_3 = CreateStaticClone(RS_1)
    Debug.Print "== RS_3 (all) ==="
    Debug.Print RS_3.GetString(, , "|")
    Debug.Print "== RS_3 (F2='CDE') ==="
    RS_3.Filter = "F2='CDE'"
    Debug.Print RS_3.GetString(, , "|")
    
    '編集テスト
    Debug.Print "--- Edit ---"
    RS_2.MoveFirst
    RS_2.Update "F1", 999
    RS_3.MoveFirst
    RS_3.Update "F1", 555
    
    '再度、全件表示
    Debug.Print "== RS_1 (all) ==="
    RS_1.Filter = adFilterNone
    Debug.Print RS_1.GetString(, , "|")

    Debug.Print "== RS_2 (all) ==="
    RS_2.Filter = adFilterNone
    Debug.Print RS_2.GetString(, , "|")

    Debug.Print "== RS_3 (all) ==="
    RS_3.Filter = adFilterNone
    Debug.Print RS_3.GetString(, , "|")
End Sub

Private Function CreateStaticClone(ByVal source As ADODB.Recordset) As ADODB.Recordset
    Dim stm As ADODB.Stream
    Set stm = New ADODB.Stream
    stm.Type = adTypeBinary
    source.Save stm, adPersistADTG
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.Open stm
    stm.Close
    Set CreateStaticClone = rs
End Function

Private Function CreateSampleRecordset() As ADODB.Recordset
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.Fields.Append "F1", adInteger
    rs.Fields.Append "F2", adVarWChar, 10
    rs.Open
    rs.AddNew Array("F1", "F2"), Array(123, "ABC")
    rs.AddNew Array("F1", "F2"), Array(123, "CDE")
    rs.AddNew Array("F1", "F2"), Array(456, "xxx")
    rs.AddNew Array("F1", "F2"), Array(456, "yyy")
    rs.AddNew Array("F1", "F2"), Array(789, "zzz")
    rs.MoveFirst
    Set CreateSampleRecordset = rs
End Function

[ツリー表示へ]
タイトルRe^2: 抽出したレコードセットのコピー
記事No12336
投稿日: 2008/05/23(Fri) 06:44
投稿者赤鴉
魔界の仮面弁士様

ご返信ありがとうございます。

> この場合の「コピー」とは、どのような動作を想定しているのか
> 読み取れませんでしたが、
仮にRS_1をopenした時に1000件あるとして、Filterで500件まで絞り込めるとします。
その500件だけをRS_2に入れたいのです。
説明不足で申し訳ないです。

[ツリー表示へ]
タイトルRe^3: 抽出したレコードセットのコピー
記事No12337
投稿日: 2008/05/23(Fri) 09:43
投稿者魔界の仮面弁士
> 仮にRS_1をopenした時に1000件あるとして、Filterで500件まで絞り込めるとします。
> その500件だけをRS_2に入れたいのです。

聞きたいのは、その RS_2 を「その後どうしたいのか」という事です。

読取専用で良いのか、それとも、RS_2 を編集して DB に書き戻せるように
するのかによって、必要な処理が変わってくるので。

読取専用で良いなら、
 (案1) Filter 結果を ADTG にシリアライズしてから、RS_2 にデシリアライズ
 (案2) スタンドアロン Recordset に対して AddNew
のいずれかで行けるでしょうし、更新も必要なら、
 (案1) Recodset クローンに対して、Filter を再適用する
 (案2) デシリアライズされた 切断型 Recodset に対して、ActiveConnection を設定
となるでしょう。

で、それらに必要なサンプルについては、先のコードから読み取って下さい。

[ツリー表示へ]
タイトルRe^4: 抽出したレコードセットのコピー
記事No12338
投稿日: 2008/05/23(Fri) 10:06
投稿者赤鴉
> 聞きたいのは、その RS_2 を「その後どうしたいのか」という事です。
現状では、DataGridに表示及び、印刷です。

>  (案1) Filter 結果を ADTG にシリアライズしてから、RS_2 にデシリアライズ
サンプルの方を元にこれで考えてみます。
サンプルまで書いていただき、ありがとうございました。

[ツリー表示へ]
タイトルRe^3: 抽出したレコードセットのコピー
記事No12339
投稿日: 2008/05/23(Fri) 10:12
投稿者
こんなのではだめですかね

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

Dim strSQL

cn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\.mdb"
strSQL = "INSERT INTO Ret1 SELECT * FROM Ret2 WHERE FG =0"
rs.Open strSQL, cn, adOpenStatic, adLockOptimistic, adCmdText  

[ツリー表示へ]