Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2041 / 2272 ツリー ←次へ | 前へ→

【4131】ADOのレコードセットをフォーム(一覧)に表示 みほ 05/1/12(水) 19:09 質問[未読]
【4134】Re:ADOのレコードセットをフォーム(一覧)... かろちん 05/1/13(木) 0:31 回答[未読]
【4142】Re:ADOのレコードセットをフォーム(一覧)... みほ 05/1/13(木) 23:17 発言[未読]

【4131】ADOのレコードセットをフォーム(一覧)に...
質問  みほ  - 05/1/12(水) 19:09 -

引用なし
パスワード
   いつもお世話になっています。(かろちんさん、いつもありがとうございます)

ADOを使ってフォームにデータ一覧を表示させたいと思い、
以下のコードをフォームのOpenイベントに書いています。
ケース1)
  rs.Open "テーブルA", cn, adOpenKeyset, adLockOptimistic
  rs.Filter = "ID = 5"
  MsgBox (rs.RecordCount)
  Set Me.Recordset = rs
ケース2)
  rs.Open "テーブルA", cn, adOpenKeyset, adLockOptimistic
  MsgBox (rs.RecordCount)
  Set Me.Recordset = rs

実行すると、ケース1のRecordCountは1になり、ケース2のRecordCountは10
になるのですが、フォームに表示されるのは、ケース1も2も10件で
ケース1の場合は、ID=5がカレントレコードになるだけです。
RecordCountでチェックするとちゃんと件数が変わっているので
フィルタできているとは思うのですが、どうしてこうなってしまうのか・・・。

そもそもがこういった使い方はイレギュラーなのか。。

やりたいことは、
「検索条件を入れて検索ボタンをクリックすると該当するデータの一覧が
表示される」処理を汎用性のあるコード(アクセス以外に移行可能)で
書きたい。ということです。それにはADOで処理するのがよい、
と聞きかじったので、チャレンジしてみました。
SQL(Oracle)はわかるのですが、VB等の知識がなく(Accessも初心者)
悪戦苦闘しています。

ご教授よろしくおねがいいたします。

【4134】Re:ADOのレコードセットをフォーム(一覧...
回答  かろちん  - 05/1/13(木) 0:31 -

引用なし
パスワード
   みほ さん こんばんは

>(かろちんさん、いつもありがとうございます)

 お気遣いありがとうございます。
 でも、これを書くのは止めた方が良いと思います。
 優秀な回答者よりレスが来なくなる原因になるかも
 しれません。
 これを書くなら、その人からレスがきたときに書く
 方が良いですよ。

>実行すると、ケース1のRecordCountは1になり、ケース2のRecordCountは10
>になるのですが、フォームに表示されるのは、ケース1も2も10件で
>ケース1の場合は、ID=5がカレントレコードになるだけです。
>RecordCountでチェックするとちゃんと件数が変わっているので
>フィルタできているとは思うのですが、どうしてこうなってしまうのか・・・。

 ADOでRecordCountを使ったことがないので良く
 分かりませんが、私は基本的にRecordCountは
 使わないようにしています。
 以前、DAOで開発を行った時、同じような現象が
 起きました。
 いろいろ調べてみましたが、RecordCountは不定
 であると判断しました。

 例えば10万件位のデータを抽出するとしましょう
 RecordCountで抽出件数を判断させようとした場合
 10万件のデータを抽出しないと分かりませんよね
 そうすると、かなりの時間がかかってしまいます。
 ある程度のデータが抽出された時点で、Open処理
 を終わってくれれば、途中まで抽出したデータを
 先に処理できますよね。
 この方法を取っているのだと思います。
 したがって、RecordCountはレコード件数を判断
 するときには使わない方が良いのだと判断し、
 それ以来は使っていません。

 でも最後のレコードを抽出した後は、RecordCount
 は正しい結果が返ってきていると思います。
 でも、その時点で使えるかどうかは疑問ですが...


>処理を汎用性のあるコード(アクセス以外に移行可能)で
>書きたい。ということです。それにはADOで処理するのがよい、
>と聞きかじったので、チャレンジしてみました。

 これはどうでしょう?
 アクセス以外といっても、VBやExcelなどなど?
 ADOをサポートしている言語?
 言語が変われば若干書き方が変わってきたりするん
 ですよ。そうすると使えるところは、SQLだけって
 いうことになってしまうケースが多々あります。

 移行可能な方法があれは、私も教えてほしいです。

>SQL(Oracle)はわかるのですが、VB等の知識がなく(Accessも初心者)
>悪戦苦闘しています。

 SQLが分かるのであれば、RecordCountを使わずに

 strSQL = ""
 strSQL = strSQL & "SELECT COUNT(*) As 件数 FROM テーブルA"
 strSQL = strSQL & " WHERE ID=5"
 rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic

 MsgBox rs("件数")

 で件数を調べた方が良いです。

【4142】Re:ADOのレコードセットをフォーム(一覧...
発言  みほ  - 05/1/13(木) 23:17 -

引用なし
パスワード
   だらだら感想めいたものを書いてしまいました。

>>(かろちんさん、いつもありがとうございます)
> お気遣いありがとうございます。
> でも、これを書くのは止めた方が良いと思います。
> 優秀な回答者よりレスが来なくなる原因になるかも
> しれません。
> これを書くなら、その人からレスがきたときに書く
> 方が良いですよ。
なるほど、です。

>>処理を汎用性のあるコード(アクセス以外に移行可能)で
>>書きたい。ということです。それにはADOで処理するのがよい、
>>と聞きかじったので、チャレンジしてみました。
> これはどうでしょう?
> アクセス以外といっても、VBやExcelなどなど?
> ADOをサポートしている言語?
強いて言えば、VBライクな書き方をしておきたい
といった感じでしょうか。自分としても以前VBぽい雰囲気の
あるツール(もうちょっとDBまわりが充実してた)を
使っていたので、ベタベタのアクセスの
作り方よりもVBライクに作ったほうが作りやすい気もしたのです。
VB知らないのに無謀かなあ・・・。

> SQLが分かるのであれば、RecordCountを使わずに
> strSQL = ""
> strSQL = strSQL & "SELECT COUNT(*) As 件数 FROM テーブルA"
> strSQL = strSQL & " WHERE ID=5"
> rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic
> MsgBox rs("件数")
> で件数を調べた方が良いです。
了解です。

ADOですが、調べたところ私の使ってるAccess2000
(また書き忘れてました。ごめんなさい)では
フォームとの連動で、更新処理などができないということのようですね。
検索画面では使えても更新画面では使えないのでは
なんだか中途半端でかえって使わないほうがよいのかなあ
と思ったりもしています。

私が作成中のシステム自体は、わりと単純なものなのですが
同じ動作をするものでも、色々な作り方があって迷ってしまいます。
なるべくメンテナンスが楽で、次に生かせるようなものを作りたいと思う
んですけどね。あと、accessでいい感じのプログラムがバリバリ組める人が見て、
「ナニコレ、意味わかんない。こんなんでよく動くよなー」
なんて思われないようなものがいいです。
実力の割に"かっこつけしい"かなあ。。

2041 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078230
(SS)C-BOARD v3.8 is Free