■データアクセス・コンポーネント編 ――DAOを使ってRecordsetのレコード総数を数える
Q. RecordsetオブジェクトのRecordCountプロパティを使ってレコード数を取得しようとしたのですが、どんなクエリーのときでも結果が1しか返ってきません。どうしたらよいのでしょう?
A. RecordCountプロパティは単純にレコード数を返すものではありません。基本的には「アクセスしたレコードの絶対数」を返すものです。 細かな点はRecordsetのタイプ(OpenRecordsetのtype引数で指定)によって変わります。それぞれのタイプで次のような特徴があります。
・dbOpenTable(テーブル・タイプ) ……レコードセットをオープンしたあとはいつでも正しいレコード数を得ることができます。TableDefオブジェクトのRecordCountプロパティの場合でも同じです。
・dbOpenDynaset(ダイナセット・タイプ) ……一度でもアクセスしたことがあるレコードの数を返します。 レコードセットをオープンした直後には先頭レコードがカレントレコードになっているので、1を返します。正しいレコード数を返すためにはMoveLastメソッドを用いて最後のレコードまで移動する必要があります。 ただし、クエリーで、並べ替え(SQL文のORDER
BY句)を指定したものや集計クエリーでは、レコード移動をしなくても全レコード数を返します。
・dbOpenSnapshot(スナップショット・タイプ) ……ダイナセット・タイプと同じです。
・dbOpenForwardOnly(前方スクロール・タイプ) ……一度でもアクセスしたことがあるレコードの数を返します。 ただし、このレコードセットではMoveLastは使えません(エラーになります)。MoveNextメソッド、もしくは前方方向へのMoveメソッドだけが使えます。 また、EOFに達するとRecordCountは-1となります。他のレコードセットと異なり、ORDER
BY句を指定したクエリーや集計クエリーでも同じです。
さて、MoveLastメソッドを用いたあとでなければ正しいRecordCountが得られないとなると、パフォーマンスの問題が生じます。カレントレコードをレコードセットの末尾に移動するには、ある程度の処理時間がかかります。 ただ、こんにちのマシン性能であれば1000件程度のレコードセット内でのMoveLastは気にするほどの時間はかからないでしょう。一方、万の単位のレコード数となるとユーザーが気にかかるほどの時間がかかる可能性もあります。
これを回避するには、直接レコード数を求めるクエリーを利用します(詳細は"クエリ/SQL編"を参照)。
ダイナセット・タイプのレコードセットでRecordCountプロパティを利用する簡単なプログラム・コードを掲げておきます。
Sub RecordCountDynaset() Dim
dbs As DAO.Database Dim rst As
DAO.Recordset
On Error GoTo
Err_Sub
Set dbs = CurrentDb Set rst =
dbs.OpenRecordset("SELECT * FROM tblCustomer",
dbOpenDynaset) rst.MoveLast Debug.Print
"レコード数は: " & rst.RecordCount & "
です." rst.Close Set rst = Nothing Set dbs
= Nothing End
Sub
|
|
1/3 |
|
本サイト掲載の記事・写真等の無断での転載・複写を禁じます。
本ページは、技術評論社様のご好意により掲載許可をいただいたものです。
| |