<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--2段階の絞込み
  1 → 2 → 3



少々ややこしい操作が続きますので、いちおう、今までのところ、整頓しておいてください。
今までのとこ特に問題なく進むことができてれば、たいして難しくないと思いますよ。
ではまいりましょう。


んじゃ、フォームはどっか隅っこに置いといて、クエリAのデザイン画面を見ましょう。
で、せっかく入力したんですけど・・・Forms!フォーム名!コンボ名っていう抽出条件、両方とも削除してください。

クエリの中でも、「条件判断する関数」っていうのが使えるので、これを使ってとりあえず「フォームのコンボ14が空っぽか否か」を判断させてみましょう。

IIF関数といいます。チラッと後でヘルプ見ておいてください。

それと、空っぽかどうか・・・ってとこなんですけど、IsNull関数というのを使ってみましょう。

Nullかどうかを調べる関数です。
Nullっていうのは、コンピュータの世界では「値のない、未使用の状態」を表わしてまして、厳密には「空っぽの」という意味じゃないんですけど、まあ、今回は何とかなると思います。

んで・・・もし、コンボになんか値が入ってたら、「グループ」の列の値をそのまま表示させて、そうじゃなかったら・・・そうですねぇ。「ない」とでも言わせましょうか。「まめ」とか「いも」っていうのは、「グループ」の列の値に存在してますから、この列におそらく絶対入力されないような単語が出てくるようにすれば、コンボ14が空かそうじゃないか、はっきりわかりますよね。

コンボが空かどうか、は、

isnull(forms!フォームA!コンボ14)

っていう関数で調べます。これがオッケーなら、1列ぜんぶ「ない」って表示させて、ある場合はそのままいもとかまめとか表示してもらうとすると、

iif(isnull(forms!フォームA!コンボ14),"ない",グループ)

多分、カギカッコは自動的についてくれると思うのでその辺は甘えるとして、ダブルコーテーションとカッコとカンマとびっくりマークだけは間違えないように入力してください。↑こんな感じかな。

んでは、ちょっとデータシートビューに切り替えてみましょうか。
わたしの場合、今、コンボ14の中が空っぽなんですけど、その場合だと・・・。

式1っていう列ができてて、「ない」って、出ます?

んで、コンボに何か選んでるときは、
いもとかまめとか、出ます?

これ、グループっていう列そのものを表示してるわけじゃないんで、「式1」っていう列名になってますよね。
これはAccessが適当に付けてくれた名前ですので、多分みなさんのクエリもそうなってるんじゃないかと思います。

つまり・・・「式1が、Forms!フォーム1!コンボ14の中の値(いもかまめ)か、または、”ない”ってなってるレコードを取ってこい」っていうクエリにすればよい、と、思いません?
コンボ14が空のときは”ない”って全行に表示されますから抽出条件に”ない”って指定しておけば絶対全件とってきますよね。

で、「式1」っていう列名じゃ、なんだなー・・・という場合は・・・「グループ」っていうフィールド、改めてもう1個選んでおいて、列1は非表示にしちゃえばいいんじゃないかな。

で、同じことを、今度は「素材」の列に対して、そしてコンボ16に対してやります。
これで、どっちかが空っぽでも、あるいはどっちも空っぽでも、全件、あるいは片方のコンボの値を網羅したレコードがすべて表示されることになります。

こっちも、「素材」っていうフィールドは別個に追加しておいた方がいいかもしれないですね。
なぜなら、「グループ」も「素材」も、フォームのテキストボックスと名前でつながりを持ってますよね。だから、このクエリ上から「グループ」「素材」って言う名前の列がなくなっちゃうのはあまり芳しくないんです。

で、抽出条件の方なんですけど、コンボがふたつだと、少々ややこしいことになりそうですね。

コンボ14が空で、コンボ16が選択されてるとき
コンボ14が空で、コンボ16も空のとき
コンボ14を選択してて、コンボ16が空のとき
コンボ14を選択してて、コンボ16も選択してるとき

この4パターンを考えないといけません。

こ、こうかな・・・。

なんかもうやめた方がいいような気もしてきましたけど(笑)もうちょっとがんばりましょう。


忘れちゃいけないのが再クエリです。
前に「コンボ14の更新後処理」に、コンボ16の中身を再クエリするような指示は書きましたけど、このタイミングではフォーム全体の表示は変わらないですよね。
ここで「いも」を選んだら、いもレコードだけの状態にしてほしいんですから、ここでもフォーム全体にかかわる再クエリが必要です。

フォームは保存しながら一旦閉じて、再度開いてみましょう。


さて、最初の状態ですけど・・・。これはいわゆる「コンボ14が空で、コンボ16も空のとき」ですよね。両方とも(式1も式2も)"ない"って出てる状態なんだと思います。で、"ない"のレコードを撮ってくるようにしてますから、全件出てきてるんじゃないかと思います。

「いも」を選ぶと・・・。いもだけの状態になりますよね。

で、さつまいもを選べば、さつまいもの料理に絞り込めるはずです。
ここまでオッケーでしょうか??ややっこしいですねぇ。ほんとに、コンピュータって融通がきかないですよね。
こんなに気を使ってやらないといけないなんて・・・なんであたしがこんな苦労しなくちゃいけないのよまったく(ぷんぷん)


さて、ここで、現状、残された問題がひとつあります・・・。

「コンボ14が空で、コンボ16が選択されてるとき」・・・これって今、できないですよね。
基本的に「コンボ16」の中身って、「コンボ14」の中身によって左右されます。今はそういう状態にしてますよね。
つまり、「コンボ14を選ばずして、コンボ16はありえない」のです。今の状態だと。
なんで?なんて言わないでくださいよ。前のページでそういう風に作ったじゃないですカー。

この仕組みは、「いもでえんどうまめ」っていうレコードは存在し得ないので、そうした「抽出の矛盾」が生じないようにと思って作った配慮なんですけど・・・。
やめてみて、試してみましょうか。

コンボ16の方のプロパティをもう一度開いて、値集合ソース欄のビルドボタン、でしたよね。ピリオド3つの。

2列目に非表示の「グループ」列があると思いますんで、これを削除しちゃいましょう。
1列選んで削除すれば消えますよね。
1列の選び方は・・・そんなくどくど書かなくてもよいです???でもいちおう・・・。
「グループ」っていうフィールド名のすぐ上の、グレーの部分をクリックすれば1列全部黒く反転します。その状態でDeleteキーを押せば、1列消えますよ。

で、このウィンドウは閉じましょう。メッセージが出てきますけど、これはいいですよね。

じゃ、フォームを保存して、そっとフォームビューに切り替えましょうか。あるいは・・・一度閉じて改めて開いた方がいいかもしれませんね。

どうでしょう。とりあえずコンボ14を選ばなくても、コンボ16から直接素材を選ぶことができるようになったと思います。
これで、いもかまめかわかんない場合でも、とりあえず探し当てることができそうですね。



しかし!
人間にうっかりまちがいはつきものです。

「えんどうまめ」を選んだ後、うっかりグループのコンボボックスの方で「いも」を選んでしまったとしたら・・・。

なんか、あたしのフォームでは、何にもでなくなっちゃいましたけど・・・みなさんのはどうですか?

結局のところ、「えんどうまめ」で「いも」なレコードなんて1件もないですから、1件もない状態で再クエリされて、このざま、って感じみたいですね。
うう〜ん、どうしよう!!なんかもうこれ以上労力をつぎ込むのもあほらしい気がしてきましたけど、皆さんどう思いますか???

もっときめ細かく仕組みを考えていけばいいのかもしれないですけど、それはフォームのデザインなどケースバイケースって感じにもなりますんで、ココから先は皆さん個々に研究なさってみてください。んで、こうなっちゃったときの打開策をひとつご紹介しますね。
多分、万能というか、どういう場合でも使えると思いますんで。

一旦全部表示して、抽出をやり直す、って仕組みをひとつ追加しようと思います。
そのためには・・・「コンボ14」と「コンボ16」を空っぽにして再クエリすればいいんですよね。

じゃ、そういう動作を実現するためのボタンを作りましょうか。
コマンドボタンを作って、クリック時のイベントを作りましょう。マクロでもいいですけど、こういうのはコードで書いたほうが絶対楽です。

こんな感じかな。



もし、わけのわかんないことになって1件も出てこなくなっちゃったら、「全表示」のボタンをクリックして再度仕切りなおしをすればよい、って感じです。

根本的な解決ではないですけど、「これ以上時間をかけていられないよな・・・」ってときは、こんな感じの仕組みをひとつ作る、というのも方法だと思いますよ。
ただでさえ、こういう仕組みを作っていくのは面倒で手間がかかります。なるべくなら、あまりややこしくならないように作っていってください。
あとで手直しするのも一苦労になっちゃいますもんね。



ふい〜お疲れ様でした。
もしかしたら満足のいく内容ではなかったかもわかりませんが・・・でも、けっこういろいろやらないといけないんだな、ってとこくらいは、お話が伝わったんじゃないかなぁって思ってます。運用でカバーするのもひとつの方法ですから、結果にこだわらず、使いやすい&作りやすいシステム作りを目指してくださいね。