MS Access Tips/Sample and VBA and Blog customize etc...

フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは?

フォーム上の複数レコードのデータを更新したい場合、更新クエリで更新して再クエリするというのが高速なのですが、フィルタがかかっていたりすると面倒なので、フォームのレコードセットを直接操作して更新したい場合もありますね。

フォームのレコードセットを参照、操作する方法としては、Recordsetプロパティ、RecordsetCloneプロパティがあります。さらには、Clone メソッドで複製を作成して参照する方法も考えられます。

これらの違いを検証してみました。

動作検証用フォーム

難易度:

サンプル作成

テーブル名 Tbl1
フィールド データ型フィールドサイズ
ID  オートナンバー型
F1 数値型単精度浮動小数点型

フォーム F_Tbl1
Tbl1よりオートフォーム:表形式 で作成。
フォームヘッダーにコマンドボタンを4つ配置して、名前をそれぞれ、cmdRecordsetUpdate, cmdRecordsetCloneUpdate, cmdRecordset_CloneUpdate, cmdSQLExecute とします。フォームモジュールは下記のようになります。

テーブルには事前に1000件のレコードを作成しておきます。それぞれのコマンドボタンは、全レコードのF1フィールドに Rnd関数で乱数を生成して代入する処理を、それぞれ、 Recordset, RecorsetClone, Recordset.Clone, 更新クエリ(SQL)を使って実行するものです。

テスト結果

私の環境でのテスト結果は、

Recordset 約5.8秒
RecodrsetClone 約3.8秒
Recordset.Clone 約0.02秒
SQL  約0.02秒

Recordset.Clone と 更新クエリ(SQL)が圧倒的に早いという結果でした。後者の2つは、差がTimer関数の精度以下なので、10000件のデータでテストしてみました。

Recordset.Clone 約0.15秒
SQL  約0.06秒

やはり更新クエリが早いですが、フォームに表示されているレコードを対象とするなら、体感できる差はないとみていいでしょう。となると、どちらを選ぶかは、好みでいいでしょう。フォームにフィルタがかかっていたりとかサブフォームの場合は、Recordset.Clone の方が抽出条件を考える必要がないので楽ですね。また、クエリでは重い処理になりがちな前後レコードが関係するような累計などの処理も Recordset.Clone のほうが有利ですね。

考察

Recordset プロパティ
RecordsetClone プロパティ
Clone メソッド

上記のヘルプの記述を読んでも、それぞれの内部的な処理の違いは明確に分かりませんが、実際の動作を見ていると、フォームが持っているレコードセットとの関連度が違うように思います。

Me.Recordset は、
Me.Recordsetのカレントレコードとフォームのカレントレコードは同じ。
Me.Recordsetでレコード移動すれば、フォームのカレントレコードも移動する。
フィールドを更新すれば、フォーム上のカレントレコードのフィールドにもすぐ反映される。
つりま、フォームのRecordsetオブジェクトを直接参照し、UIにも影響を与える。フォームとの関連度は高い。

Me.RecordsetClone は、
Me.RecordsetCloneのカレントレコードとフォームのカレントレコードが同じとはかぎらない。
Me.RecordsetCloneでレコード移動しても、フォームのカレントレコードは移動しない。
(同期しない、同期させるには Bookmark を利用して明示的に同期させるコードが必要)
フィールドのデータを更新すれば、フォーム上の対応レコードのフィールドにもすぐ反映される。
フォームのレコードセットのデータに影響を与えるが、フォームのUIには影響を与えない。フォームとの関連度は、中。

Me.Recordset.Clone は、
Me.Recordset.Cloneのカレントレコードとフォームのカレントレコードが同じとはかぎらない。
Me.Recordset.Cloneでレコード移動しても、フォームのカレントレコードは移動しない。
(同期しない、同期させるには Bookmark を利用して明示的に同期させるコードが必要)
フィールドのデータを更新しても、フォーム上の対応レコードのフィールドには反映されない。
(反映させるには、requery または、recalc などの再読込処理が必要)
フォームのRecordsetのデータをコピーした完全に別のレコードセットを作成して、そこで操作していると思われます。

以上の特性を理解して、用途や状況によって使い分けることが肝要ですね。

サンプルファイルが下記からダウンロードできます。
FrmRecordsetOperation_07.zip (Access 2007-2010 形式 - 26kb)
FrmRecordsetOperation.zip (Access 2002-2003 形式 - 17kb)
FrmRecordsetOperation_2k.zip (Access 2000 形式 - 16kb)

拍手する

4 Comments

ちーまげ says..."すごい人がいるものです。。。"

hatena様、こんにちは。

Access Clubでアドバイスをいただいたちーまげです。

このサイトを拝見して驚きました。
個人でここまで研究されているなんて。
(今まで散々ネットでAccessのVBAについて検索したのに、このサイトを
知らなかったなんて痛恨の極みです)
これからは、hatena chips で勉強させていただきます。

hatena様、これからもいろんなことを教えてください。
よろしくお願いします!


2009.09.30 11:47 | URL | #iydQorAY [edit]
hatena says..."褒めると伸びるタイプです"

お褒めの言葉、ありがとうございます。
ブログ更新の励みになります。

私のブログは気ままに思いついたものをアップしているだけなので、基本からの勉強というのには向かないですが、役にたったり、参考になることが見つかるかも知れません。ゆっくりご観覧くださいませ。

2009.10.01 13:50 | URL | #5uE6dEgY [edit]
Genzo says..."今更ながら…"

ご無沙汰しております。
(既に忘れられているかもしれませんが…)

相変わらず、HatenaさんのHPにお世話になっております。

今更ながら、RecordsetClone等の利用の仕方というか
意味が(このページを見て)理解できた気がします。

相変わらずの精力的な活動(?)に只々感服しております。

Hatenaさんのブログが無ければ、ここまでAccessに触れることは
無かったと思います。

これからも、頑張ってください。

2014.06.30 17:15 | URL | #- [edit]
hatena says..."re:今更ながら…"

> ご無沙汰しております。
> (既に忘れられているかもしれませんが…)

Genzoさん、お久しぶりでーすww
覚えてますよ。

Genzoさんのブログは、このブログのリンクリストにも登録されておりますので、更新されればすぐチェックできるようになってます。(Newマークが付く)

最近、更新されていないようなので残念におもってますよ。


> 今更ながら、RecordsetClone等の利用の仕方というか
> 意味が(このページを見て)理解できた気がします。
>
> 相変わらずの精力的な活動(?)に只々感服しております。
>
> Hatenaさんのブログが無ければ、ここまでAccessに触れることは
> 無かったと思います。

お役にたてて、良かったです。

最近、Accessもだんだん下火になってきている感をひしひしと感じて、寂しく思っていますので、こういう投稿は元気がでます。

Genzoさんのお子様の近況とか、また、ブログで聞かせてください。

私の娘は今、短大で、保育士を目指して頑張ってます。

2014.06.30 22:32 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/108-7d17a471
該当の記事は見つかりませんでした。