Page 416 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼ADOでのレコード検索について 豆輔 03/10/24(金) 11:57 ┣Re:ADOでのレコード検索について こうちゃん 03/10/24(金) 12:22 ┗Re:ADOでのレコード検索について かわうそ 03/10/24(金) 12:22 ┗Re:ADOでのレコード検索について 豆輔 03/10/24(金) 13:04 ┣Re:ADOでのレコード検索について こうちゃん 03/10/24(金) 13:31 ┗Re:ADOでのレコード検索について かわうそ 03/10/24(金) 14:08 ┣ありがとうございました 豆輔 03/10/24(金) 16:11 ┗Re:ADOでのレコード検索について こうちゃん 03/10/24(金) 16:54 ┣SQL文について 豆輔 03/10/24(金) 17:30 ┃ ┗Re:SQL文について 豆輔 03/10/24(金) 18:15 ┃ ┗Re:SQL文について よろずや 03/10/25(土) 16:26 ┗Re:ADOでのレコード検索について かわうそ 03/10/27(月) 10:17 ─────────────────────────────────────── ■題名 : ADOでのレコード検索について ■名前 : 豆輔 ■日付 : 03/10/24(金) 11:57 -------------------------------------------------------------------------
こんにちは。 今日はADOでのレコード検索について教えて頂きたく投稿しました。 お忙しい中すみませんがよろしくお願い致します。 (Access2000バージョン) あるKEYを入力してテーブルより一致するレコードを見つけ、ワークテーブルへ書き込むという処理をしたいのですが、検索先のテーブルには何十万件ものレコードが入っていて、検索項目をKEYにしても処理に時間がかかってしまっています。 私のやり方はDoUntil−Loopで1件目からの検索な為、時間がかかるのは分かるのですが、他のやり方が分かりません。 申し訳ありませんが検索時間が短くなるような方法がありましたら教えて下さい。 [モジュール] TM_Enkan.MoveFirst Do Until TM_Enkan.EOF If TM_Enkan![水道番号] = Me![水道番号] Then ・・・ Loop |
豆輔さん、こんにちは >[モジュール] > TM_Enkan.MoveFirst > Do Until TM_Enkan.EOF > If TM_Enkan![水道番号] = Me![水道番号] Then > ・・・ > Loop 抽出条件を以下のように指定した追加クエリではいかがですか? forms!フォーム名![水道番号] まずは選択クエリで確認してみてください。 また、SQLで対応する手もありますが、テーブルの詳細等条件が不明なので、コードはレスできません。 |
こんにちは。 Findメソッドではダメですか? ▼豆輔 さん: >こんにちは。 >今日はADOでのレコード検索について教えて頂きたく投稿しました。 >お忙しい中すみませんがよろしくお願い致します。 >(Access2000バージョン) > >あるKEYを入力してテーブルより一致するレコードを見つけ、ワークテーブルへ書き込むという処理をしたいのですが、検索先のテーブルには何十万件ものレコードが入っていて、検索項目をKEYにしても処理に時間がかかってしまっています。 >私のやり方はDoUntil−Loopで1件目からの検索な為、時間がかかるのは分かるのですが、他のやり方が分かりません。 >申し訳ありませんが検索時間が短くなるような方法がありましたら教えて下さい。 > > >[モジュール] > TM_Enkan.MoveFirst > Do Until TM_Enkan.EOF > If TM_Enkan![水道番号] = Me![水道番号] Then > ・・・ > Loop |
こうちゃんさん、かわうそさん早速のお返事ありがとうございます。 こうちゃんさん、いろいろなマスタテーブルより値を持ってきたりするため、できればクエリーは使いたくないのです。 かわうそさん、ヘルプでFindメソッドを見つけたのですが、書き方がよく分かりません。 もしよろしければ書き方を教えて下さい。 よろしくお願い致します。 [モジュール] TM_Enkan.MoveFirst Do Until TM_Enkan.EOF If TM_Enkan![水道番号] = Me![水道番号] Then ・・・ Loop |
豆輔さん、こんにちは >こうちゃんさん、いろいろなマスタテーブルより値を持ってきたりするため、できればクエリーは使いたくないのです。 >かわうそさん、ヘルプでFindメソッドを見つけたのですが、書き方がよく分かりません。 >もしよろしければ書き方を教えて下さい。 >よろしくお願い致します。 > >[モジュール] > TM_Enkan.MoveFirst > Do Until TM_Enkan.EOF > If TM_Enkan![水道番号] = Me![水道番号] Then > ・・・ > Loop Findの構文は以下のようになりますが、該当するレコードが複数件ある場合は少々面倒です。 また、レコードセットも全件取得なのでお勧めできません。 TM_Enkan.Open "SELECT * FROM TM_Enkan" TM_Enkan.Find "[水道番号] = " & Me![水道番号] WHERE条件でレコードとったらいかがですか? strSQL="SELECT * FROM TM_Enkanのテーブル名 " strSQL=strSQL & "WHERE [水道番号] = " & Me![水道番号] TM_Enkan.Open strSQL,Connection 繰り返しになりますが条件の詳細がわかりませんのでレスが返しづらいです。 また、前のレスでお勧めした選択クエリのSQLを確認いただければ上記のようになっていると思います。 クエリオブジェクトを残したくない場合は、一旦クエリを作成して、そのクエリのSQLを参考にSQL文で処理するのがお勧めです。 SELECTしたレコードをワークテーブルにINSERTするSQLを書けば処理が一度ですみますので、処理時間も短くなりますよ。 |
>かわうそさん、ヘルプでFindメソッドを見つけたのですが、書き方がよく分かりません。 以下に記述します。 ------ set DB = CurrentDb set rs = db.openrecordset("テーブル名",dbopendynaset) rs.findfirst "キー項目 = 検索キー" do until rs.nomatch 処理 .findnext loop rs.close db.close ------- かわうそ的には 「SQL文でレコードセットを開く = クエリーを作成して開く」と考えています。 どちらの処理が速いのかは、一概にはいえないと思うので いろいろ試してみるといいかもです。 |
Find文にて出来ました!! ありがとうございました。 SQL文はスペースやコーテーションの入力がややこしく、こうちゃんさんの言われるとおりクエリーからコピッて行うのですが、過去の開発作業でも何時間もかけてしまっていました。勉強の為、SQLでもやってみます! お忙しい中、何度も回答いただき、かわうそさん・こうちゃんさん本当にありがとうございました。 |
かわうそさん、こんにちは >以下に記述します。 >------ >set DB = CurrentDb >set rs = db.openrecordset("テーブル名",dbopendynaset) > >rs.findfirst "キー項目 = 検索キー" > >do until rs.nomatch > 処理 > .findnext >loop > >rs.close >db.close DAOならかわうそさんのおっしゃる処理でもいいとは思うのですが、ADO指定でしたのでご意見申しあげました。 かわうそさんの気分を害したのでなければいいのですが・・ >かわうそ的には >「SQL文でレコードセットを開く = クエリーを作成して開く」と考えています。 >どちらの処理が速いのかは、一概にはいえないと思うので そうですね。 ただADO前提でしたので、将来的にSQLServer接続まで考えているのかと勝手に推察して、その場合ならレコードセットは最小のもののほうがいいかと思われますので、レコードセットを開く際にWHERE条件等で絞ったほうが有利と思われます。 いずれにしろケースバイケースですので、かわうそさんのおっしゃるように >いろいろ試してみるといいかもです。 ですね(^^) |
こうちゃんさん、度々すみません。 SQLのSELECTで検索してみました。 ちゃんと検索でき、処理時間も早いのですが、以下の点についてご指導いただきたく再度投稿させていただきました。 以下のように記述し、水道番号がヒットしたらワークテーブル(TW_Daicho)へ書き込みにいくのですが、無い場合はヒットしないため「レコードが削除されています」エラーがでてしまいます。水道番号を入力ミスした場合の為に、ヒットしなかった場合を確認したいのですが分かりません。 先ほど、お返事頂いたのとはやり方が違うのですが、下記の書き方での確認方法はありますか? お忙しいところすみませんがお力を貸してください。よろしくお願い致します。 TM_Enkan.Open "SELECT * " & "FROM TM_調査 WHERE 水道番号 = " & Me![水道番号] & "", _ db, adOpenStatic, , adCmdTableDirect TW_Daicho.AddNew TW_Daicho![水道番号] = TM_Enkan![水道番号] TW_Daicho![区域コード] = TM_Enkan![区域コード] TW_Daicho![市名] = TM_Enkan![市名] TW_Daicho![区名] = TM_Enkan![区名] TW_Daicho![町名] = TM_Enkan![町名] TW_Daicho![番地] = TM_Enkan![番地] TW_Daicho.Update |
すみません。 SELECTの前にDCountで存在チェックを行い、ある場合のみSELECTを実行するようにしたところ、存在しない場合でもエラーにならないようにできました。 もし他に方法がありましたら、教えて下さい。 お騒がせしてしまって申し訳ありませんでした。 |
▼豆輔 さん: >すみません。 >SELECTの前にDCountで存在チェックを行い、ある場合のみSELECTを実行するようにしたところ、存在しない場合でもエラーにならないようにできました。 >もし他に方法がありましたら、教えて下さい。 ヘルプで EOF を見てください。 |
こうちゃんさん、おはようございます。 >DAOならかわうそさんのおっしゃる処理でもいいとは思うのですが、ADO指定でしたのでご意見申しあげました。 >かわうそさんの気分を害したのでなければいいのですが・・ 気分を害するなんてとんでもないです。 書き方が素っ気なかったでしょうか(^^; なんにも考えていませんでした。 レスした手前、途中でほうりだすのもまずいかなって。。。 こちらこそ、なんだか申し訳ないです。 文字だけなので、気持ちを汲むのが難しいですね。 以後、ちょっと考えてから書き込みします。(笑) |