Access2000で複数条件検索を行う方法

このQ&Aのポイント
  • Access2000で複数条件検索を行う方法について教えてください。
  • 条件に異なる演算子を使用することは可能でしょうか?
  • 処理に時間がかかる場合、INDEXの設定とSEEKの使用は効果的でしょうか?
回答を見る
  • ベストアンサー

Access2000でseekの複数条件検索

M_SQL = "SELECT * FROM T_請求残高 WHERE 得code='" & T10![得code] & "' AND 請求対象日2<#" & Me![締切日] & "# ORDER BY 請求対象日2 DESC" Set T02 = DB.OpenRecordset("" & M_SQL & "", dbOpenDynaset) という条件でデータを抽出していますが、 いくつか処理および多数のデータを処理する為に、1度の処理に1、2時間が掛かってしまいます。 この処理を テーブルにINDEXを設定し、SEEKを使用したいと思っていますが、 "="と"<"という異なった条件を処理することは可能でしょうか? VBA初心者です。わかりやすく教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

引き続き。 まずはご質問の回答から。 Seekでは複数条件を設定できないようです。 複数条件をつけるなら、Findfirstで行けるとは思います。 さて、その上で質問になりますが、上記の  得code='" & T10![得code] & "' AND 請求対象日2<#" & Me![締切日] にあたるレコードは1件だけなのでしょうか? (たとえば、上記の条件該当するレコード(商品)は1件のみで、その価格を参照  したいだけなどの場合) SeekにしてもFindfirstにしても、カレントレコードに移動するだけですので 該当レコードが複数ある場合は使えませんよ。 重ねて質問ですが、25万件のレコードは「T_請求残高」のレコード数でしょうか? また、「T_請求残高」から上記の条件(得コードと締日)で抽出されるレコード 数は概算でどれくらいになるのでしょうか? それとも、(処理2)内で別に参照するテーブルのレコード数でしょうか? 申し訳ないですが、状況がわかりにくいです。もう少しテーブルの構造、処理内容、 レコード数を示してもらえるといい回答ができると思います。

rie-mama
質問者

お礼

ありがとうございました。 該当するレコードは、複数件数があるので、無理ということですね。 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件程です。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

どんな処理か不明ですが、レコードの更新ならば UPDATEによる更新クエリを考えるべきです。 レコードセットを使う方法に比べ、1000倍以上は 効率的です。 また、同等の処理を4回とありますので、マルチ プロセスを使うのが有力です。つまり、4プロセスを 立ち上げ、各プロセスで個別の条件の更新を行い ます。私は実務でよくこの手を使います。 経験的に見て、8プロセスくらいまでなら、マルチ プロセスにしてもシステム資源の枯渇(他に重い 処理が無いと仮定)による効率の低下を上回る効果が 期待できます。但し、プロセスの起動、プロセス間の 同期と言った制御に関して、かなり知識が必要です。 プロセスの起動にはCreateProcess(API)を使います。 同期方法としては私はウィンドウ(フォーム)に 特別なメッセージを送ることで処置しています。 ウィンドウはサブクラス化し、特別なメッセージを 拾えるようにします。何故、ウィンドウを使うかと 言うと、特別な手続き無しにプロセス間で継承可能な ハンドルになるからです。ファイル等ではハンドルに 継承属性を与えたり、プロセス起動時に指定が必要です。 また、非同期入出力が厄介で、受身の割り込み処理と してはイベントドリブンなウィンドウの方が適しています。 フォームにもイベントプロシージャがあると思いますが、 ポーリング(CPU効率が悪い)をせずに操作できます。 実際の経験では12時間かかる(400マンレコード)の 処理を1時間45分に短縮したことがあります。 マルチプロセスの技法は覚えると、応用範囲が広く、 格段の効果も期待できますが、初心者にはチト難しい と思います。とりあえず、更新/挿入クエリでの処理を 試み、次にマルチプロセスに挑戦してみてください。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.3

本当にリンク元もMDBですか?  私には25万件のレコードをアクセスで管理することが正気とは思えません。  (遅いし、大体壊れたらどうしようもない。) 早くする方法としては、 ・別のDBに乗り換える。 ・PCの性能を上げる。 ・テーブルを分割する。 ・要らないデータを他の場所に移す。(テーブル構造を見直す) などがお勧めですが、 ・where句に使われているフィールドにインデックスをつける。 ・order byをはずしてみる。 ・mdbの最適化をする。 などによって、効果が得られることもあります。

回答No.1

データ数、処理内容等がどのようなものか提示なさって おられないので、はっきりとした回答はできませんが、 レコードセットを作る(抽出する)過程ではそれほど 時間を要していないのではないかと推測します。 (ORを多用すると複雑になり、処理速度は落ちるといわれていますが、  今回のSQL文はそれほど複雑とは思えません) おそらく レコードセットを作る(処理1)  (ループして)   その各レコードでデータ処理して何かしらやる(処理2)  (ループを閉じる) レコードセットを閉める の(処理2)に時間を要してるのではないでしょうか? 処理2の1件あたりの処理時間はどれくらいですか? それを把握できていますか? そのあたりから対策をしてみてはいかがでしょうか? たとえば、(処理2)の前後に debug.print "Start: " & now() (処理2) debug.print "End: " & now() とやってみて1処理の所要時間を概算するとか。

rie-mama
質問者

補足

言葉足らずで申し訳ありません。 おっしゃる通り、(処理2)のLOOPに時間が掛かります。 (処理2)では、 他のmdbからリンクしており、データが25万件ほどの中から抽出する処理のため、この25万件のテーブルをOPENTABLEにし、”=”「得code」と”<”「締切日」で抽出したいと考えています。 テーブルが異なったもので、同様の処理を同じアクションの中で、4回程の処理を行うため、4~5時間の処理となってしまっています。

関連するQ&A

  • Access SQLを使ったソートがずれる

    Access2003で以下のfunctionを組みました。 ************************************* Dim SQL As String Dim strList As String SQL = "" strList = "" 'サブテーブルの削除 SQL = "DELETE * FROM SUB_T" CurrentProject.Connection.Execute SQL SQL = "INSERT INTO SUB_T SELECT Master_T.* FROM Master_T WHERE " With Forms!SEARCH! '検索条件がnullの場合 If IsNull(.CODE_SRH) Then SQL = "INSERT INTO SUB_T SELECT Master_T.* FROM Master_T" End If 'コードの条件 If .CODE_SRH <> "" Then strList = "Master_T.CODE Like '" & .CODE_SRH & "%'" End If End With SQL = SQL & strList & " ORDER BY (val(CODE))" CurrentProject.Connection.Execute SQL ************************************* Master_T テーブルの CODE は テキスト型 内容は以下のとおり "001","あいうえお",.... "003","さしすせそ",.... "002","かきくけこ",.... "013","GHI",.... "011","ABC",.... 検索条件Nullの場合SUB_T テーブルには "001","あいうえお",.... "002","かきくけこ",.... "003","さしすせそ",.... "011","ABC",.... "013","GHI",.... とインサートされるはずですが、何回か実行すると・・・・ "003","さしすせそ",.... "011","ABC",.... "013","GHI",.... "001","あいうえお",.... "002","かきくけこ",.... こんなだったり "011","ABC",.... "013","GHI",.... "001","あいうえお",.... "002","かきくけこ",.... "003","さしすせそ",.... このような感じに並びます。 試しに、明示的に"ORDER BY (val(CODE)) ASC"にしても また降順ではどうかと思い、"ORDER BY (val(CODE)) DESC"にしても 同じ現象が出ます。 コードの条件を入れても同様な現象が出ます。 何が原因なのかさっぱり分かりません。 Accessのどこかを確認すべきか、VBAを見直すべきなのか ご教授いただきたいです。

  • ACCESS VBAでSeekメソッドの処理記述

    ACCESSでテーブルにIndexを定義しています。 (重複ありで) そのIndexに入っているデータAというのが3件ほどあり、それを全て検索して、処理したいのです。 そのためにseekを使って、最初のデータを検索し、次々のデータに行きたいのですが、その場合、対象データの1件目を検索して、次のレコードに移動するには、どのように記述すればよいのでしょうか。 本などには、 If rs.EOF thenのような書き方ばかりで1件の処理の場合のみのサンプルしかないのです。 よろしくお願いします。

  • ACCESSの条件について

    何時も大変お世話になっております。 windows7 ACCESS2007(初心者レベルです) の環境になります。 ACCESSのシステムを作成しており、こちらでの書き込みを参考にさせて頂いた事により、一つ問題が解決したのですが、新たな問題が発生してしまいましたので、ご質問をさせて頂きます。 解決しましたsql文 SELECT T_○.URL, T_○.日, T_○.時, T_○.マシン名, T_○.ユーザ名, T_○.タイトル, T_○.IPアドレス, T_○.グループ名, T_○.ホストID, T_○.登録日時 INTO T_●1 IN 'D:\LOG\Database1.accdb' FROM T_○, T_条件 IN 'D:\LOG\Database1.accdb' WHERE (((T_○.URL) Like Choose([T_条件].[SP],"","*","*") & [T_条件].[FN] & Choose([T_条件].[SP],"*","*",""))); 上記により大量にあります条件をテーブルから呼び出して無事に抽出が可能となりました。 そこで今回は逆のパターン(上記の抽出から外れたデータ)を別テーブルに作成したく以下のsql文を作成してみました。 SELECT T_○.URL, T_○.日, T_○.時, T_○.マシン名, T_○.ユーザ名, T_○.タイトル, T_○.IPアドレス, T_○.グループ名, T_○.ホストID, T_○.登録日時 INTO T_除外データ IN 'D:\LOG\Database1.accdb' FROM T_○, T_条件 IN 'D:\LOG\Database1.accdb' WHERE (((T_○.URL) Not Like Choose([T_条件].[SP],"","*","*") & [T_条件].[FN] & Choose([T_条件].[SP],"*","*",""))); 結果、同じ内容のレコードが100件以上に膨れ上がりデータが莫大な物になってしまいました。 つたない文章とsql文で大変申し訳ございませんが、なぜ同じレコードが何件も出来てしまうのでしょうか? ご指摘及びアドバイスを頂けますと幸いでございます。

  • SQLの条件分に ( ) が入っている場合

    Access97を使用しています。 SQLの条件で、項目名に '(' が入っている場合 どうすればいいのでしょうか? 例えば 下記の場合 " 式に未定義関数 '出荷日'があります " と出てきます。 Set DB = CurrentDb() strSQL = "SELECT SUM(数量) AS A FROM GAH100 WHERE " strSQL = strSQL + "出荷日(新)='" & Me.日付入力 "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) 項目名に() が無いようにするしかないのでしょうか?

  • T-SQL 一件のみのデータ取得について

    T-SQL(SQL Server2000)で対象データを一件のみ取得する場合、どのようにすれば良いでしょうか? 処理的に無理でしょうか? PL/SQLの"ROWNUMBER = 1"のような条件は使うことが出来ないのでしょうか? 説明が苦手で分かりづらいかも知れませんが、宜しくお願いします。

  • アクセス2000で複数条件での検索

    アクセス2000で、試験結果の管理をしようと思っています。 試験によって合格点が違うので、合否結果はフラグ(1=合格、2=不合格)で管理しています。 フォームにボタンを作って、ボタンをクリックしたら合格者(あるいは不合格者) だけを表示する形にしたのですが、受験日と合否のフラグの両方を条件として、 データの抽出を行いたいのですが、ボタンのコードビルダはどのようにしたら良いのでしょうか?ちなみに、ボタンを作った時の関連付けは受験日となっているのでコードは下記のようになっています。 Private Sub 抽出採用日_Click() On Error GoTo Err_抽出採用日_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "対象者" stLinkCriteria = "[受験日]=" & "#" & Me![受験日] & "#" DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_抽出採用日_Click: Exit Sub Err_抽出採用日_Click: MsgBox Err.Description Resume Exit_抽出採用日_Click End Sub

  • 複数条件での検索について教えてください

    PHPとMySQLで構築するという内容の参考書2冊を読んだ程度の知識レベルです。しばらくPHPと離れていたので、さらに退化しているかもしれません。。。 環境はWindowsXP、PHP4.3.2.2です。 ぜひ、皆さんの知恵をお借りできればと思い、質問をさせていただきます。 DBには  発売日(outday) お菓子名(name) 発売店(shop) などが入っております。 発売日やお菓子名、発売店など1つ~3つの条件で検索することが目的です。 例えば、お菓子名のみの検索をしようとして、 HTMLフォーム <INPUT size="44" type="text" name="name" maxlength="100"> ↑に検索したいお菓子名を記入して、 $sql="select * from okashi where (name like '%$name%') order by outday; ↑でnameのデータを受けとって、欲しいお菓子データを取り出すことはできたのですが、 ↓のように <INPUT size="44" type="text" name="shop" maxlength="100">; <INPUT size="44" type="text" name="name" maxlength="100">; フォームを2つ作り $sql = "select * from okashi where (shop like '$%shop%') and (name like '%$name%')by outday; ↑のように2つ以上の検索条件が重なると、 「0件」みつかりました。と検索が出来なくなってしまいます。 検索条件は、検索項目が1つでも2つでも同じ同一です。   本に書いてあるまま、名前を換えて動かしているつもりなのですが、 どこが間違っているか本当に分かりません。 文字制限で全体を載せることができず、はしょってしまいましたが、 わからない点がありましたらおっしゃってください。 お忙しい中恐れ入りますが、ぜひ皆さんのお知恵をお借りしたいのです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 条件分に数値型は可能?

    ACCESS97を使用しています。 SQLの中で 数値型の場合、条件式に適用できないのでしょうか? 例えば 下記の場合 Set DB = CurrentDb() strSQL = "SELECT * FROM テーブルA WHERE " strSQL = strSQL + "コード ='" & YU(i) & "'" strSQL = strSQL + " AND ラベルNO='" & RA(i) & "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) YU(i)は、文字型、RA(i)は数値型です。 RA(i)で"抽出条件でデータ型が合いません"と出ます。 コードは文字型、ラベルNOは数値型です。数値型では条件として適用できないのでしょうか? 可能な場合、上のような表現ではできないのでしょうか?

  • 複数検索について

    urizakaです。 現在、SQL-ServerとJBUilderでJSPの開発を行っているのですが、そのときに 一覧表を表示させるために、次のようなテーブルを作りました テーブル名:m_project code_proj projname makestaff  repstaff workstaff approvestaff 1      開発    1       2      1      2 2      購買    3       1      2      3 3      支援    2       3      1      2 テーブル名:m_staff code_staff   name 1        瓜坂 幸四郎 2        小野里 圭吾 3        藤原 二三四 そして、m_projectの値を検索してその結果をVector変数へと代入して、 結果として表示したいのですが、この時に現在は数字で入力されている makestaff、repstaff、workstaff、approvestaffをテーブル名の nameのcode_staffに対応する名前にしたいのですが、何かいい手は ないでしょうか?  SELECT * FROM m_staff,m_project where m_project.makestaff=m_staff.code_staff  で結合するところまではわかるのですが、Where以降で、この場合 複数の条件を指定する方法がわからないもので・・・(unionでの指定を すればいいのかもしれませんが、それもよくわからないもので)  すみませんが、宜しくお願いします。

  • ワイルドカードの検索

    項目に'%'が入力されているデータを抽出したいのですが、 以下のようなSQLだとデータがすべて抽出されていまいます。  SELECT *   FROM t_table  WHERE code_name LIKE '%%%' '%'を検索するにはどうのようにすればいいのでしょうか?

専門家に質問してみよう