Page 56 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼クエリでの抽出条件 平 02/9/24(火) 19:33 ┗一案。 yu-ji 02/9/25(水) 9:45 ┣補足 yu-ji 02/9/25(水) 9:47 ┗できました。が、新たな問題が・・・ 平 02/9/25(水) 16:05 ┗あ・・・ 平 02/9/25(水) 16:49 ┗Nz関数でできる? yu-ji 02/9/26(木) 9:40 ┗Re:Nz関数でできる? 平 02/9/26(木) 17:09 ┗Re:Nz関数でできる。 yu-ji 02/9/26(木) 18:07 ┗嘘でした。 yu-ji 02/9/27(金) 10:45 ┗Re:嘘でした。 yu-ji 02/9/27(金) 16:56 ┗追記 yu-ji 02/10/3(木) 9:17 ┗Re:追記 平 02/10/3(木) 10:44 ┗Re:追記 yu-ji 02/10/3(木) 17:25 ┗Re:追記 こうちゃん 02/10/3(木) 21:20 ┗Re:追記 yu-ji 02/10/4(金) 11:47 ┗Re:追記 平 02/10/7(月) 10:05 ─────────────────────────────────────── ■題名 : クエリでの抽出条件 ■名前 : 平 ■日付 : 02/9/24(火) 19:33 -------------------------------------------------------------------------
VBAではないので恐縮ですが・・・ 検索用に作った「フォーム1」にテキストボックスが2つ (「CMIN」および「CMAX」)があります。 やりたい事は単純で、クエリのフィールドに「COS」というのがあり フォーム上に数字を入力して CMIN <= COS <= CMAX が当てはまる条件のデータを抜き出したいと思っています。 現在は「COS」の抽出条件として >=[Forms]![フォーム1]![CMIN] And <=[Forms]![フォーム1]![CMAX] と設定してあります。この状態で「CMIN」及び「CMAX」に数字を入力して 実行すると条件通りに抽出してくれるのですが、どちらかを空欄にした状態 つまり「6以下を抽出する」なら「CMAX」のみ6と入力するだけですと 何も表示しなくなってしまいます。 (True Or >=[Forms]![フォーム1]![CMIN]) And _ (True Or <=[Forms]![フォーム1]![CMAX]) にすると、上記と同じ入力方法だと全て表示されます(Trueがあるからでしょう)。 と、言う訳でテキストボックス2つに入力した場合はそれらの間を 片方しか入力していない場合はそれ以上(それ以下)と抽出するには どうすればよいのでしょうか? 今は暫定的にテキストボックスに既定値をセットするようにはしていますが 片方が空欄でも検索できるようにすれば使いやすいかと思いましたので。 |
▼平 さん: >>=[Forms]![フォーム1]![CMIN] And <=[Forms]![フォーム1]![CMAX] > >と設定してあります。この状態で「CMIN」及び「CMAX」に数字を入力して >実行すると条件通りに抽出してくれるのですが、どちらかを空欄にした状態 >つまり「6以下を抽出する」なら「CMAX」のみ6と入力するだけですと >何も表示しなくなってしまいます。 > >と、言う訳でテキストボックス2つに入力した場合はそれらの間を >片方しか入力していない場合はそれ以上(それ以下)と抽出するには >どうすればよいのでしょうか? 自分の場合、簡単な条件であれば、IsNullを付けてクエリのフィールド に入れちゃって、条件を以下のような感じでやってます。 CMIN CMAX COS False,Flase,Like "*" Flase,True ,<=[Forms]![フォーム1]![CMAX]) True ,Flase,>=[Forms]![フォーム1]![CMIN]) True ,True ,>=[Forms]![フォーム1]![CMIN]) and <=[Forms]![フォーム1]![CMAX]) というような感じ。 あと、もっと抽出する為の項目が多い時は、抽出ボタンのクリックイベント で、コードで条件に合わせてSQLを作成して、レコードソースに書いちゃいます。 果たしてこれがいい策なのかどうかは、かなり疑問ですが、とりあえずこういう 方法もあるよってことで。 他にもっといい方法があるなら、ぜひ教えてもらいたいです(笑)。 |
>自分の場合、簡単な条件であれば、IsNullを付けてクエリのフィールド >に入れちゃって、条件を以下のような感じでやってます。 > > CMIN CMAX COS CMINとCMAXはそのままの値じゃなくて、IsNull(CMIN)、IsNull(CMAX)です。 勘違いしそうな書き方だったので、補足しました。 |
yu-jiさん、毎度ありがとうございます、やりたい事は無事にできました。 しかし別の問題が発生してしまいました。 このフォームには他にトグルボタンや他のテキストボックスによっても 抽出条件を設定しています。例えば・・・ NO NAME Like "*" & [Forms]![フォーム1]![BANGO] & "*" ,Like "*" & [Forms]![フォーム1]![NAMAE] & "*" という具合です(本来はトグルボタンの設定のを含め、100個近い抽出条件があります)。 そこに教えて頂いた条件設定をそのままクエリの抽出条件の欄に下記のように書き込むと CMIN及びCMAXがTrue(=値がない場合)は他の条件(BANGOやNAMAEなど)を設定しても それらを全てを踏まえて抽出してくれますが、CMINやCMAXに値がある場合は 他の抽出条件を設定すると、うまく抽出してくれません(全て表示されます)。 NO NAME CMIN CMAX COS Like〜,Like〜,True ,True ,Like "*" True ,False,<=・・・[CMAX]) False,True ,>=・・・[CMIN]) False,False,>=・・・[CMAX]) この状態を回避するにはCMINなどの条件式の段の分、他の抽出条件を設定する(下記)以外に もう少し簡単な方法はあるのでしょうか? NO NAME CMIN CMAX COS Like〜,Like〜,True ,True ,Like "*" Like〜,Like〜,True ,False,<=・・・[CMAX]) Like〜,Like〜,False,True ,>=・・・[CMIN]) Like〜,Like〜,False,False,>=・・・[CMAX]) |
IsNull(CMIN) IsNull(CMAX) COS True ,True ,Like "*" True ,False ,<=・・・[CMAX] False ,True ,>=・・・[CMIN] False ,False ,>=・・・[CMAX] この部分、前回他の方に教えて頂いたNz関数を使うと >=Nz(CMIN,0) And <= Nz(CMAX,0) と一行で書く事ができるんですよね。 yu-jiさん、お手数をお掛けして申し訳ありませんでした。 |
▼平 さん: >IsNull(CMIN) IsNull(CMAX) COS >True ,True ,Like "*" >True ,False ,<=・・・[CMAX] >False ,True ,>=・・・[CMIN] >False ,False ,>=・・・[CMAX] > >この部分、前回他の方に教えて頂いたNz関数を使うと > >>=Nz(CMIN,0) And <= Nz(CMAX,0) > >と一行で書く事ができるんですよね。 >yu-jiさん、お手数をお掛けして申し訳ありませんでした。 ん? CMIN,CMAXにどのようなデータが入っているか分かりませんが、 NzでNullの場合0になるので、たとえばCMINに5、CMAXがNULLの 場合、>=5 And <= 0 という条件で、何も抽出されないと 思うのですが。 問題なく動いてます? >>この状態を回避するにはCMINなどの条件式の段の分、他の抽出条件を設定する >>(下記)以外にもう少し簡単な方法はあるのでしょうか? そもそも、条件を横に書くのがAND、縦に書くのがOrという意味なので、 ちゃんとNOとNAMEにもそれぞれ、Like文を書かないとダメですよ。 ちなみに、もっと簡潔にしたいということであれば、最初に書いた通り コードで条件文を書いてレコードソースを作成すれば簡潔にはなります。 |
▼yu-ji さん: > >=Nz(CMIN,0) And <= Nz(CMAX,0) >NzでNullの場合0になるので、たとえばCMINに5、CMAXがNULLの >場合、>=5 And <= 0 という条件で、何も抽出されないと >思うのですが。 > >問題なく動いてます? 問題なく動きませんでした(笑)。動作テストする時に両方とも 空欄にしてませんでした。 Nz関数を使う時に何でもかんでも0に変えてしまうから ダメなんですよね。なので最低値と最高値を代入するように 書き換えました。 >=Nz(CMIN,1) And <= Nz(CMAX,30) 度々、ありがとうございました。 |
▼平 さん: >Nz関数を使う時に何でもかんでも0に変えてしまうから >ダメなんですよね。なので最低値と最高値を代入するように >書き換えました。 > >>=Nz(CMIN,1) And <= Nz(CMAX,30) あ。 そういう方法がありましたね。 Nzを使うやり方は考えたことがあったのに、そこから先を考えてなかった(^^; ちなみに、最低値と最高値が予想つかない場合には、 >=Nz(CMIN,Like "*") And <= Nz(CMAX,Like "*") とする方法がありますね。 こちらこそ、勉強になりました。 ありがとうございます。 |
>ちなみに、最低値と最高値が予想つかない場合には、 > > >=Nz(CMIN,Like "*") And <= Nz(CMAX,Like "*") > >とする方法がありますね。 上手くいかないやん。。。。 NzとLike、比較記号、型で上手く行く場合と上手くいかない場合がある? とりあえず、上記のやつでは上手く動かないです(多分)。 もうちょい調べてみます。。。。 P.S 種別に”詫び”が欲しい、今日この頃。。。 |
自己レスです。 >>ちなみに、最低値と最高値が予想つかない場合には、 >> >> >=Nz(CMIN,Like "*") And <= Nz(CMAX,Like "*") >> >>とする方法がありますね。 > >上手くいかないやん。。。。 >NzとLike、比較記号、型で上手く行く場合と上手くいかない場合がある? 比較記号と一緒に使ったら、思うような動作はしないようです。 間違った情報、すみませんでした。 |
いちおう、追記です。 >>NzとLike、比較記号、型で上手く行く場合と上手くいかない場合がある? 文字型の場合は、 Like Nz(・・・・,"*") という形でないとダメなようです。 |
yu-jiさん、わざわざすいません。 ちなみに新規にテーブルを作って試そうとしたのですが >=(Like Nz([Forms]![フォーム1]![MIN],"*")) And _ <=(Like NZ([FORMS]![フォーム1]![MAX],"*")) とクエリの条件式を設定して閉じた後、もう一度開くと >=(([テーブル1].[AA]) Like Nz([Forms]![フォーム1]![MIN],"*")) And _ <=(([テーブル1].[AA]) Like NZ([FORMS]![フォーム1]![MAX],"*")) と勝手に書き換えられてしまうのはなぜなんでしょう?上記のLike関数の 使い方がおかしいのでしょうか。 テーブル1はクエリの元データのあるテーブル名 AAは抽出条件を設定しているフィールドです |
▼平 さん: >>=(Like Nz([Forms]![フォーム1]![MIN],"*")) And _ ><=(Like NZ([FORMS]![フォーム1]![MAX],"*")) > >とクエリの条件式を設定して閉じた後、もう一度開くと > >>=(([テーブル1].[AA]) Like Nz([Forms]![フォーム1]![MIN],"*")) And _ ><=(([テーブル1].[AA]) Like NZ([FORMS]![フォーム1]![MAX],"*")) > >と勝手に書き換えられてしまうのはなぜなんでしょう?上記のLike関数の >使い方がおかしいのでしょうか。 <なぜ書き換わるのか? Like演算子は、”対象 Like 文字列”なので、そちらの方が正しい記述に なるのではないでしょうか? 意味的には同じはずです。 勝手に書き換わるのは、Accessの仕様? (Access2000では同様の現象は起きませんでしたが) <上記のLike関数の使い方がおかしいのか? というか、二つ前の書き込みにも書きましたが、 比較記号(正式名称では、比較演算子らしいです。>や<など)と Likeは一緒に使えない(というか思うように動かない)ようです。 ただ自分が使い方を知らない為かもしれませんが。 どなたかご存知の方がいらっしゃれば、ヘルプお願いします。 |
yu-ji さん、平 さん、こんばんは >というか、二つ前の書き込みにも書きましたが、 >比較記号(正式名称では、比較演算子らしいです。>や<など)と >Likeは一緒に使えない(というか思うように動かない)ようです。 >ただ自分が使い方を知らない為かもしれませんが。 > >どなたかご存知の方がいらっしゃれば、ヘルプお願いします。 Likeはワイルドカードを使いますが、比較演算子ではワイルドカードはつかえません。 ですからいっしょにはつかえません。 Likeは比較演算子と同格と思ったほうがいいですね。 例えていえば、 「x= <> "A"」 の演算しているのとおなじようなことになります。 また「= x Like "A*"」 がなりたつとすれば「x Like "A*"」と等価ですし、「<> x Like "A*"」 がなりたつとすれば「x NOT Like "A*"」と等価です。 しかし「=< x Like "A*"」はどうなりますか? 「x Like "A*"」がTrueだとすると「=< True」?・・・判定しようがなくなっちゃいますよね^^; (あんまり回答になっていないような気が・・・~~;) #クエリの条件をフォームのコントロールの値でおこなう場合、空白の判定で煩雑になるケースが多いようです。 私もyujiさんの最初の回答にあるように、複数のテキストボックスの条件でレコードソースを取得するような場合は、SQL文を組み立てて、直接レコードソース設定しちゃいます。 |
▼こうちゃん さん: >Likeはワイルドカードを使いますが、比較演算子ではワイルドカードはつかえません。 >ですからいっしょにはつかえません。 フォロー、ありがとうございます。 いつもお世話になってます(^^; >「x Like "A*"」がTrueだとすると「=< True」?・・・判定しようがなくなっ >ちゃいますよね^^; ! 謎は全て解けた(笑) どうやら、ちゃんとTrueと比較しているようです(笑)<Access >= Nz([test],Like "*") で、[test]をNullにすると、意味的には >= Trueとなり、 True=-1 で-1との比較をしてくれてます(笑)。 #要は、>=Nz([test],-1)と等価です。 これで、妙な結果の意味が分かりました(^^ ******** ということで、結局、ちゃんと計算はしてくれるけど、意図する動作は しないので、使えないということで。 |
yu-ji さん、こうちゃん さん、こんにちは >謎は全て解けた(笑) >どうやら、ちゃんとTrueと比較しているようです(笑)<Access > > >= Nz([test],Like "*") > >で、[test]をNullにすると、意味的には > > >= Trueとなり、 > >True=-1 で-1との比較をしてくれてます(笑)。 >#要は、>=Nz([test],-1)と等価です。 なるほど、True=-1って律儀に考えてくれてるんですね、Accessさんは(笑) まぁ、こう言う状況の時はワイルドカードを使うな、って事ですね。 どうもありがとうございました。 |