- ベストアンサー
Access2000で複数条件検索を行う方法
- Access2000で複数条件検索を行う方法について教えてください。
- 条件に異なる演算子を使用することは可能でしょうか?
- 処理に時間がかかる場合、INDEXの設定とSEEKの使用は効果的でしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
引き続き。 まずはご質問の回答から。 Seekでは複数条件を設定できないようです。 複数条件をつけるなら、Findfirstで行けるとは思います。 さて、その上で質問になりますが、上記の 得code='" & T10![得code] & "' AND 請求対象日2<#" & Me![締切日] にあたるレコードは1件だけなのでしょうか? (たとえば、上記の条件該当するレコード(商品)は1件のみで、その価格を参照 したいだけなどの場合) SeekにしてもFindfirstにしても、カレントレコードに移動するだけですので 該当レコードが複数ある場合は使えませんよ。 重ねて質問ですが、25万件のレコードは「T_請求残高」のレコード数でしょうか? また、「T_請求残高」から上記の条件(得コードと締日)で抽出されるレコード 数は概算でどれくらいになるのでしょうか? それとも、(処理2)内で別に参照するテーブルのレコード数でしょうか? 申し訳ないですが、状況がわかりにくいです。もう少しテーブルの構造、処理内容、 レコード数を示してもらえるといい回答ができると思います。
その他の回答 (3)
- nda23
- ベストアンサー率54% (777/1415)
どんな処理か不明ですが、レコードの更新ならば UPDATEによる更新クエリを考えるべきです。 レコードセットを使う方法に比べ、1000倍以上は 効率的です。 また、同等の処理を4回とありますので、マルチ プロセスを使うのが有力です。つまり、4プロセスを 立ち上げ、各プロセスで個別の条件の更新を行い ます。私は実務でよくこの手を使います。 経験的に見て、8プロセスくらいまでなら、マルチ プロセスにしてもシステム資源の枯渇(他に重い 処理が無いと仮定)による効率の低下を上回る効果が 期待できます。但し、プロセスの起動、プロセス間の 同期と言った制御に関して、かなり知識が必要です。 プロセスの起動にはCreateProcess(API)を使います。 同期方法としては私はウィンドウ(フォーム)に 特別なメッセージを送ることで処置しています。 ウィンドウはサブクラス化し、特別なメッセージを 拾えるようにします。何故、ウィンドウを使うかと 言うと、特別な手続き無しにプロセス間で継承可能な ハンドルになるからです。ファイル等ではハンドルに 継承属性を与えたり、プロセス起動時に指定が必要です。 また、非同期入出力が厄介で、受身の割り込み処理と してはイベントドリブンなウィンドウの方が適しています。 フォームにもイベントプロシージャがあると思いますが、 ポーリング(CPU効率が悪い)をせずに操作できます。 実際の経験では12時間かかる(400マンレコード)の 処理を1時間45分に短縮したことがあります。 マルチプロセスの技法は覚えると、応用範囲が広く、 格段の効果も期待できますが、初心者にはチト難しい と思います。とりあえず、更新/挿入クエリでの処理を 試み、次にマルチプロセスに挑戦してみてください。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
本当にリンク元もMDBですか? 私には25万件のレコードをアクセスで管理することが正気とは思えません。 (遅いし、大体壊れたらどうしようもない。) 早くする方法としては、 ・別のDBに乗り換える。 ・PCの性能を上げる。 ・テーブルを分割する。 ・要らないデータを他の場所に移す。(テーブル構造を見直す) などがお勧めですが、 ・where句に使われているフィールドにインデックスをつける。 ・order byをはずしてみる。 ・mdbの最適化をする。 などによって、効果が得られることもあります。
- Bacillus_natto
- ベストアンサー率75% (3/4)
データ数、処理内容等がどのようなものか提示なさって おられないので、はっきりとした回答はできませんが、 レコードセットを作る(抽出する)過程ではそれほど 時間を要していないのではないかと推測します。 (ORを多用すると複雑になり、処理速度は落ちるといわれていますが、 今回のSQL文はそれほど複雑とは思えません) おそらく レコードセットを作る(処理1) (ループして) その各レコードでデータ処理して何かしらやる(処理2) (ループを閉じる) レコードセットを閉める の(処理2)に時間を要してるのではないでしょうか? 処理2の1件あたりの処理時間はどれくらいですか? それを把握できていますか? そのあたりから対策をしてみてはいかがでしょうか? たとえば、(処理2)の前後に debug.print "Start: " & now() (処理2) debug.print "End: " & now() とやってみて1処理の所要時間を概算するとか。
補足
言葉足らずで申し訳ありません。 おっしゃる通り、(処理2)のLOOPに時間が掛かります。 (処理2)では、 他のmdbからリンクしており、データが25万件ほどの中から抽出する処理のため、この25万件のテーブルをOPENTABLEにし、”=”「得code」と”<”「締切日」で抽出したいと考えています。 テーブルが異なったもので、同様の処理を同じアクションの中で、4回程の処理を行うため、4~5時間の処理となってしまっています。
お礼
ありがとうございました。 該当するレコードは、複数件数があるので、無理ということですね。 25万件は・・・LOOPの中で検索する件数(T_売上明細)です。 とりあえず、”=”で1件ができるテーブルを全てOPENTABLEとし、SEEKで行った結果、処理がかなり早くなりましたので、それで対応しました。 ありがとうございました。 本来、行いたかった事は、 (1)T_請求該当テーブルから、 画面上で指定した「締切日」と一致するデータを W_請求該当テーブルにセット。 (2)W_請求該当のテーブルをLOOPさせ、 【今回のご質問の内容】 T_請求残高から「得CODE」が共通し、 「請求対象日2」が画面テキストボックスの「締切日」よりも以前 のレコードで一番直近のレコードを抽出しつつ、 (3) さらに(2)をLOOPして、25万件あるT_売上テーブルの「得code」と 「納品日」がT_請求残高の「請求対象日2」以後「締切日」までのデータを抽出しつつ、 (4) T_売上明細テーブルの「管理NO」とT_売上テーブルの「管理NO」との一致するデータの中から 「商品名」で”材料”という商品名文字がつくものは除外しT_売上データをW_請求書売上にセットする ということをしています。 ※この前後に更に処理がありますが・・・ この処理の中で、【T_】とつくテーブルは、全てリンク。【W_】がワークテーブルとして使っています。 1.請求書を発行する際に、まず、月末締めの得意先を出す。 2.得意先の過去の請求履歴から前回の請求残高と最終請求済み日を確認する。 3.納品書の納品日が今回の請求する期間の対象の売上データを出す。 4.その詳細データの品名から、「材料」は別請求書を発行するため、その額は今回の請求の対象外としたい。 という内容です。 その後の処理は、請求対象期間にその得意先が入金されていれば、その入金額の合計をセットし、前回請求、入金額、繰越額、今回請求額 を親レポートに、商品名等の詳細を子レポートとして、請求書に印刷します。 おおよそ、得意先件数が160件、子となる詳細データが800件程です。