Access2003 Where条件について

このQ&Aのポイント
  • フォームから抽出区分を指定してデータを抽出する方法について説明します。
  • 直接数字を入力する方法とIIf関数を使用する方法の比較を行い、レスポンスの速さについても言及します。
  • 変更すべき箇所やレスポンスの改善方法について尋ねています。
回答を見る
  • ベストアンサー

Access2003 Where条件について

フォームから抽出区分を指定してデータを抽出したいと思っています。 抽出区分=0 DESALETYPEは0のデータを抽出 抽出区分=1 DESALETYPEは1~7のデータを抽出 下記のように条件を入力しましたが、 条件に直接0とか1or 2 or 3 ・・・・を入力したほうが レスポンスが速く、下記のようにIIf関数を指定すると、 抽出はできますがレスポンスが遅くなります。 レスポンスが速くなるよう変更したいのですが、 思うようにいきません。 どこか変更する箇所があるのでしょうか。 宜しくお願い致します。 IIf([Forms]![ブランド別出荷数]![テキスト28]=0,0,IIf([dbo_SALE].[DESALETYPE]=1,([dbo_SALE].[DESALETYPE])=1   Or ([dbo_SALE].[DESALETYPE])=2 Or ([dbo_SALE].[DESALETYPE])=3 Or ([dbo_SALE].[DESALETYPE])=4 Or ([dbo_SALE].[DESALETYPE])=5 Or ([dbo_SALE].[DESALETYPE])=6 Or ([dbo_SALE].[DESALETYPE])=7))

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

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

関数の中にフィールドを入れてしまうと、インデックスが利用されませんので、遅くなります。 関数の中に入れないように条件式を工夫します。 デザインビューだと フィールド_DESALETYPE_____[Forms]![ブランド別出荷数]![テキスト28] 抽出条件__0__________0 または___In (1,2,3,4,5,6,7)__1 WHERE句のSQL文だと、 ([Forms]![ブランド別出荷数]![テキスト28]=0 And [DESALETYPE]=1) OR ([Forms]![ブランド別出荷数]![テキスト28]=1 And [DESALETYPE]<>1); これなら、DESALETYPE フィールドにインデックスを設定しておけば高速抽出できます。 他にも条件があるとデザインビューですと複雑になるので、SQLビューで直接記述したほうがいいでしょう。

V02964
質問者

お礼

hatena1989 様 返信遅くなり申し訳ありません。 【関数の中にフィールドを入れてしまうとインデックスが利用されない】 知らなかったです。勉強になります。 上記のようにWHEREの指定で思うような結果が得れました。 助かりました。 有り難うございました。

その他の回答 (5)

  • naoto0216
  • ベストアンサー率46% (183/391)
回答No.5

抽出区分が入力されるなり選択されるなりした際に、抽出区分を参照して SQLを切り替えるってのはどうでしょうか。 要するに抽出区分は0か1の2パターンなので、SQLもあらかじめ2パターン 作成しておくって感じです。 If Forms![フォーム]![抽出区分] = 0 Then  DESALETYPEを0で抽出するSQLを実行 ELSE  DESALETYPEを0以外(<>0)で抽出するSQLを実行 End If あ、これってクエリでやりたいってことなんですかね。 このクエリの抽出結果をフォーム上のリストボックスに表示 するのであれば、クエリではなくVBAにSQLを書いて、その結果を リストボックスに表示した方がよいかもです。 見当違いな回答でしたらすみません。

V02964
質問者

お礼

naoto0216 様 返信遅くなり申し訳ありません。 VBAまでできませんが考え方が勉強できて良いです。 有り難うございました。

回答No.4

【補足】なぜに、先の回答なのか? 1、論理式を使えばIF()は1個にできます。 2、でも、レスポンス悪化の原因は通信量の多さでは? 3、だったら、レコードの取得と表示を工夫する。 4、あるいは、対象データを10%以下に絞り込む。 レスポンス悪化の原因は、検索対象と取得レコード数の多さじゃーありませんか?だとすれば、単表フォームなのかデータシート形式なのかで工夫の仕方は違ってくるかと思います。 PS、XXXX IN (1,2,5,7) などで XXXX にインでクスを設定して改善されなきゃー、通信量低減策に踏み込むしかないと思いますよ。

V02964
質問者

補足

f_a_007 様 有り難うございます。 SQLビューを貼り付けました。 これを実行すると5秒しないで日付・倉庫で指定した全件が表示されます。(7200件) 式1は0と―1で表示されますが、テキスト28で0の指定した時は 0だけ抽出、それ以外は―1を抽出ができればと考えています。 私の指定の仕方が間違っているのでしょうか。 SELECT dbo_SALE.DETYPE, dbo_SALE_M.DMBRAND, dbo_SALE_M.DMHINBAN, Sum(dbo_SALE_S.DSCOUNT) AS 合計, dbo_SALE.DEDATE, dbo_SALE.DEWNO, IIf(Forms!ブランド別出荷数!テキスト28=0,dbo_SALE.DESALETYPE=0,dbo_SALE.DESALETYPE In (1,2,3,4,5,6,7)) AS 式1 FROM ((dbo_SALE INNER JOIN dbo_SALE_M ON dbo_SALE.DENUMBER = dbo_SALE_M.DMNUMBER) INNER JOIN dbo_SALE_S ON (dbo_SALE_M.DMNUMBER = dbo_SALE_S.DSNUMBER) AND (dbo_SALE_M.DMSEQ = dbo_SALE_S.DSSEQ)) INNER JOIN dbo_CUSTOMER ON dbo_SALE.DETCODE = dbo_CUSTOMER.CU_CODE WHERE (((dbo_CUSTOMER.CU_SHOPTYPE)="1" Or (dbo_CUSTOMER.CU_SHOPTYPE)="2") AND ((dbo_SALE.DESLIPFLG)=0) AND ((dbo_SALE.DETYPE)=3)) OR (((dbo_CUSTOMER.CU_SHOPTYPE)="5") AND ((dbo_SALE.DESLIPFLG)=0) AND ((dbo_SALE.DETYPE)=1) AND ((dbo_CUSTOMER.CU_SHOPSTYLE)="04")) OR (((dbo_CUSTOMER.CU_SHOPTYPE)="3" Or (dbo_CUSTOMER.CU_SHOPTYPE)="4" Or (dbo_CUSTOMER.CU_SHOPTYPE)="7" Or (dbo_CUSTOMER.CU_SHOPTYPE)="8") AND ((dbo_SALE.DESLIPFLG)=0) AND ((dbo_SALE.DETYPE)=1)) GROUP BY dbo_SALE.DETYPE, dbo_SALE_M.DMBRAND, dbo_SALE_M.DMHINBAN, dbo_SALE.DEDATE, dbo_SALE.DEWNO, IIf(Forms!ブランド別出荷数!テキスト28=0,dbo_SALE.DESALETYPE=0,dbo_SALE.DESALETYPE In (1,2,3,4,5,6,7)) HAVING (((dbo_SALE.DEDATE)>=[Forms]![ブランド別出荷数]![テキスト9] And (dbo_SALE.DEDATE)<=[Forms]![ブランド別出荷数]![テキスト11]) AND ((dbo_SALE.DEWNO)=[Forms]![ブランド別出荷数]![テキスト26])) OR (((dbo_SALE.DEDATE)>=[Forms]![ブランド別出荷数]![テキスト9] And (dbo_SALE.DEDATE)<=[Forms]![ブランド別出荷数]![テキスト11]) AND ((dbo_SALE.DEWNO)=[Forms]![ブランド別出荷数]![テキスト26])) OR (((dbo_SALE.DEDATE)>=[Forms]![ブランド別出荷数]![テキスト9] And (dbo_SALE.DEDATE)<=[Forms]![ブランド別出荷数]![テキスト11]) AND ((dbo_SALE.DEWNO)=[Forms]![ブランド別出荷数]![テキスト26]));

回答No.3

SQL文を丸ごと載せてもらえば回答しやすかったかも。 クエリのデザイングリッドに フィールド:|DESALETYPE|ここへ| テーブル: |     |   | 並べ替え: |     |   | 表示:   |     |   | 抽出条件: |     |   | または:  |     |   | などとなっていたら |ここへ|には IIf([Forms]![ブランド別出荷数]![テキスト28]=0,[dbo_SALE].[DESALETYPE]=0,[dbo_SALE].[DESALETYPE] IN (1,2,3,4,5,6,7)) (WHERE句の部分) その抽出条件に、True ではダメ? または IIf([Forms]![ブランド別出荷数]![テキスト28]=0,[dbo_SALE].[DESALETYPE]=0,[dbo_SALE].[DESALETYPE] >0 ) とか・・・。

V02964
質問者

お礼

NotFound404 様 お手数をお掛け致します。 有り難うございます。 悪戦苦闘して色々と試しています。 思ったような結果が得られていません。 もう少し頑張ってみます。

  • panacon
  • ベストアンサー率31% (214/679)
回答No.2

V02964 さんへ フォームのヘッダーかフッターに、ラジオボタンなどのグループ(値は1つ)を用意して、このグループの更新後処理に、全レコードの表示+フィルタ(グループの値)をするようにすれば、ラジオボタンを選択しなおすたびに、フィルタ結果が変わって、速度も速いです。 グループの隣に、全レコード表示ボタンをつけておくと便利です。 グループボタンは、ボディに置かないようにしてください。抽出レコードが0件だと見えなくなってしまいます。

V02964
質問者

お礼

panacon 様 有り難うございます。 ラジオボタンとか方法があるのですね。 勉強になります。

回答No.1

Q、どこか変更する箇所があるのでしょうか? A、レスポンス重視ならばクエリ機能を利用しないに尽きます。

V02964
質問者

お礼

f_a_007 様 有り難うございます。 クエリ機能だと遅くなるのでしょうか。 今後の為に頭に入れときます。

関連するQ&A

  • クエリの抽出条件で困っています

    Access2007にて、クエリの抽出条件に下記を指定していますが、データが1件も抽出されません。 ※エラーは表示されません IIf([forms]![F_Home]![アンケート種別]="1級",1 Or Is Null,2 Or Is Null) この抽出条件をしているフォールドには"1"、"2"、nullのデータしか存在しません。 「アンケート種別」が"1級"の場合は、"1"とnullのデータをかえし、 それ以外の「アンケート種別」の場合は、"2"とnullのデータをかえしたいと思っています。 どのように条件を指定すれば、データを抽出できるようになるでしょうか。 宜しくお願い致します。

  • ACCESSのあいまいな条件のクエリ 

    フォームで金額を入力します。 この入力された金額を使ってクエリの条件を作りたいと考えています。 <条件> ・金額が未入力の場合は、全て抽出。 ・金額が入力されている場合は、その金額以上を抽出   (例:1000と入力された場合は、>=1000) 下記のような条件式を入れたら、金額を入力しているにも関わらず、 何も入力されてきませんでした。 IIf(IsNull([Forms]![フォームA]![txt金額]),Like "*",>=Val([Forms]![フォームA]![txt金額]))

  • AccessでBetween条件を含むクエリーで、Between条件を

    AccessでBetween条件を含むクエリーで、Between条件を入力しなくてもデータを抽出するには? Access97でデータの抽出を行いたいと思います。 「顧客名」「商品名」「出荷日」という項目を含むクエリーから、希望のデータを抽出するフォーム(名:検索フォーム)を作成しています。 検索フォームにそれぞれ「顧客名」「商品名」「出荷開始」「出荷終了」という名前の非連結のテキストボックスを作り(規定値を"*"にしています)、それに値を入力すると、これらのテキストボックスの下に配置したサブフォームに抽出されたデータが抽出される様にしたいのです。 現在、クエリーの「顧客名」項目の抽出条件に「[forms]![検索フォーム]![顧客名]」という様に入力し、同じ様な記述を「商品名」項目にも行い(条件は[商品名]としています)、出荷日に「Between[forms]![検索フォーム]![出荷開始]And[forms]![検索フォーム]![出荷終了]」と記述しています。(これらは全てAnd条件にしています) さて、この検索フォームの値入力項目で、全てのテキストボックスに入力しなくても(1つ以上値が入力されていれば)データをサブフォームに抽出できるようにしたいのです。 現在、「出荷開始」&「出荷終了」に値を入力すれば、その他の値(「顧客名」と「商品名」)を入力してもしなくてもデータが抽出できますが、「出荷開始」&「出荷終了」を入力しない限りデータが抽出されません。 この「出荷開始」&「出荷終了」を入力しないケースでもデータが抽出できる様なフォームを作成したいのですが、 どの様に記述を変えたらよいでしょうか?

  • ACCESS 選択クエリでの抽出条件について

    在庫マスターと得意先マスターのテーブルを使用して 在庫マスターのデータを抽出条件により出力したいと思っています。 在庫マスターは区分コード1の倉庫コードと区分コード3の店舗コードと分かれており、 抽出条件は区分コード1の時は倉庫コード199と155は除きます。 区分コード2の時は得意先マスターの形態コードから"1"と"2"のものを抽出します。 デザインビューでクエリ作成するで選択クエリから抽出条件を入力してデータを出力できないのでしょうか。 色々と試していますがエラーが表示され出力できません。 例) If([ST_WHTYPE]="1",([dbo_STOCK].[ST_WHNO]) Not In ("199","155"), IIf([ST_WHTYPE]="3",[CU_SHOPTYPE]="1" Or [CU_SHOPTYPE]="2")) この場合は集計関数・・・・・含んでないクエリーを実行しましたと表示されます。 他には複雑すぎるため評価できませんとかエラーが表示されます。 選択クエリでの抽出条件ではできないのでしょうか。

  • AccessのIIFの引数の条件について教えてください。

    こんにちは。 初心者すぎて申し訳ございませんが、ご教授お願いいたします。 クエリを作成し、そこにiifで条件を入れたいと思います。 そのフィールドには、”承認済”・”未承認”・”申請前”と、3種類があります。 また、フォームのオプションボタンは”1”・”2”があります。 (1)オプションボタンが”1”ならば”承認済” (2)でなければ、”未承認”と”申請前”となっている結果を表示させたく思います。 クエリの抽出条件に以下の条件を書いてみたところ、 「式が正しく入力されていないか、複雑すぎるために評価できませんでした。~」 となってしまいます。 IIf([Forms]![フォーム1]![フレーム8]=1,"承認済","未承認" Or "申請前") 条件を1つ削り以下の式は、正しく表示されるのですが・・・。 IIf([Forms]![フォーム1]![フレーム8]=1,"承認済","未承認") いろいろやってみたのですがわかりませんでした。 お手数ですが、以上よろしくお願いいたします。

  • access クエリでIIF文で抽出条件なし

    フォームにコンボボックスを用意し、(コンボボックスは、「両方」、「条件A」、「条件B」の3項目です) クエリで抽出条件にIIF文を使い、 IIf([Forms]![フォーム]![コンボボックス]="両方",'',[Forms]![フォーム]![コンボボックス]) ”両方”を選択した場合は、「抽出条件なし」としたいのですが、できませんでした。 別案として、 IIf([Forms]![フォーム]![コンボボックス]="両方","条件A" or "条件B",[Forms]![フォーム]![コンボボックス]) なども試しましたができませんでした。 どうか解決方法をご教授願います。

  • ACCESS クエリの抽出条件で全てを抽出したい

    初歩的な質問で申し訳ありません。 売上入力フォームのオプショングループに配置した3つのトグルスイッチによって、クエリからデータを抽出したいのですが、 オプション値1 全て  オプション値2 現場 オプション値3 得意先 IIf([Forms]![F_売上入力]![fr_2]=2,"現場",IIf([Forms]![F_売上入力]![fr_2]=3,"得意先","*")) と抽出条件に入力しましたが、全てのみ上手くいきません。単純なミスとは思うのですが、どうしても出来なくて。。。他に全てを表示させる方法等ありましたら、是非、お知恵を貸して下さい。

  • ACCESSでクエリーを使った検索

    VBAを使えば簡単にできるのですが、事情があり、クエリーのみで行わなければいけません。 フォームに入力された情報を元に検索できるクエリを作成しました。 通常でしたらクエリのフィールド名の下の抽出条件に Forms![F_検索]![検索条件1] とすればいいのですが、これが複数の条件を設定した場合はすべての条件を入力しないと、検索結果が出ないことから 以下のように変更しました。 フィールド名の抽出条件には何も書かず、別に式として IIf(IsNull(Forms![F_検索]![検索条件1],True,[フィールド1]=[Forms!]![F_検索]![検索条件1])) と入力しそこの抽出条件に「True」と入力しました。 これで何も入力されてない場合は全件が表示されるようになりました。 通常の検索はこれでいいのですが疑問点が2点あります。 1.期間を抽出する場合はどうしたらいいのか? IIf(IsNull(Forms![F_検索]![検索条件1],True,[フィールド1]=Between [Forms!]![F_検索]![検索条件1] and [Forms!]![F_検索]![検索条件2])) とかしてみましたがダメでした。 2.あいまい検索をするにはどうしたらいいのか? IIf(IsNull(Forms![F_検索]![検索条件1],True,[フィールド1]=Like [Forms!]![F_検索]![検索条件1])) なんてしてみましたがだめでした。 ご回答よろしくお願いします。

  • access2000でのiifを使う条件で

    削除クエリを実施する際にフォームでテキスト16からテキスト18って感じで日付を入力して削除しています。テキスト16に何も入力しない時は2000/01/01からテキスト18までとなるようにしたくてクエリの抽出条件に IIf([Forms]![F_A]![テキスト16]="", Between #2000/01/01# And [Forms]![F_A]![テキスト18],Between [Forms]![F_A]![テキスト16] And [Forms]![F_A]![テキスト18]) って入れたのですが上手く動きません。 何か根本的に間違ってたりした。よろしくお願いします。

  • ACC クエリ 条件にIIf

    宜しくお願いします。 ACCESSのクエリで、抽出条件に画面からの値を使用したいのですが、 その値がNULL(未入力)時には全件抽出としたいのですが、 うまく行きません。下記の「""」には何をセットすれば よいのでしょうか? IIf (NOT ISNULL( [Forms]![F_伝票照会]![伝票NO]), [Forms]![照会]![伝票NO], "")

専門家に質問してみよう