電脳リアルタイム通信 ONLINE
DENNOU REALTIME TSUUSHIN ONLINE.
Vol.3

■データアクセス・コンポーネント編
   ――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 次ページ

本サイト掲載の記事・写真等の無断での転載・複写を禁じます。
本ページは、技術評論社様のご好意により掲載許可をいただいたものです。 
技術評論社

Copyright(c)GIJYUTSU-HYORON Co., Ltd. All rights reserved.