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



「2段階の絞込み」をさらに発展させて、「3段階の絞込み」について考えてみましょう。

たとえばこんなテーブルがあったとします↓。
各学年に3クラスずつクラスがあり、その中で「カレー」「コロッケ」「キャベツ」係に分かれていつも仕事をしています。
「1年1組のカレー当番は誰と誰?」と、すぐにわかるようなフォームを作りたいと思います。
とりあえずこのテーブルの名前は[テーブル1]にしときます。↓

まずは、上のテーブルを基にして適当なデザインの表形式フォームを作ります。

ウィザードで作ってもいいし、オートフォーム表形式機能を用いてもよいです。
で、非連結のコンボボックスを3つ並べます。テキストボックスでもよいですけれど、「1年」とか入力するより一覧から選んだ方が楽ですよね。
わたしのは、このフォームの名前が[フォーム]、コンボボックスの名前が左から[コンボ10][コンボ12][コンボ14]になってます。

プロパティの「その他 名前」の欄を見て確認しておいてくださいね。こういう「名前」って、いろんなところで関係してきますのでとっても大切です。



さて、それでは左側のコンボボックスからいきましょうか。

1)コンボのプロパティの「値集合ソース」欄に、[テーブル1]を選んで、右端のビルドボタンをクリックします。

テーブル名選ばないでビルドボタンクリックしてもどっちでもオッケーなんですが、まあ、この辺は適当にやってみてください。

2)もし、テーブル名を選んでからビルドボタンをクリックした場合は、こんなメッセージが出ます。

気にせず「はい」のボタンをクリックしましょう。
なんかクエリのデザイン画面みたいなのが出てきますね。

3)[学年]を選びます。

で、薄いグレーのとこをどっか適当にダブルクリックすると、クエリのプロパティが出てきますんで、「固有の値」「はい」にして、ダブって出てこないようにしてやります。で、思わず保存したくなっちゃうとこですが保存せずに、このSQLステートメント:クエリビルダっていうウィンドウだけ閉じます。

4)閉じるとき物々しいメッセージが出ますが、「はい」のボタンをクリックして、

するとまたコンボボックスのプロパティに戻ってきてこんな感じになりますね。
こうすることで、特別何か値リストとか作らなくても、手持ちのテーブルを使うことでコンボの中身を表示させることができるんでしたよね。

上記1)〜4)の作業を、[コンボ12]に対しても行います。

あ、ただし、[コンボ12]は「クラス」を表示させるのですから、選ぶフィールドは「クラス」ですよ。挑戦してみましょう。

[コンボ14]も同じですね。こちらは「係」です。

とりあえず3つのコンボに、必要な情報が表示されるかどうか確認してみましょう。フォームビューに切り替えて・・・。

たまに、この3つのコンボボックスのコントロールソースに、[学年]とか[クラス]とかフィールドを指定しちゃう人がいますけど、これって大変な間違いですよ。混乱しがちなところですけれど、この3つのコンボは、「抽出条件の指定をするためだけに使用」するのであって、テーブル内にデータを入力/変更するためのものではありません。したがって3つとも「非連結」です。単に、コンボボックスの中に、[テーブル1]に存在している学年やクラスを表示させたいだけ。。。今の操作はそのための操作です。これがこんがらがっちゃう人、いませんか?こうした単純なフォーム作りのときにしっかり把握しておいてくださいね。



でもって、3つのコンボで「学年、組、係」を指定して、結果を出すクエリを作りましょう。

フィルタでもいいのかもしれないですけど・・・さすがに3つもあると複雑になりそう。慣れてらっしゃらない方はクエリをうまく使いこなすようになさった方が間違いも見つけやすいと思いますよ。

これならわかりやすいですよね。例えばコンボが4つ、5つあった場合でも、どんどん増やしていけばいいわけです。

ここまではみなさんオッケーですよね。[担当者]とか[所持金]とか、[フォーム]で表示する予定のフィールドはもらさず選んでくださいよ。[テーブル1]の代わりに使うんですからね。
わたしは[クエリ]にしました。
クエリはいったん閉じて、フォームの方の修正をします。



[フォーム]をデザイン画面で開いて、レコードソースを今さっき作ったクエリに変更します。

で、開いてみても・・・これじゃまだ出てこないですよね。そう、再クエリです。再クエリ。

どのタイミングで再クエリが必要か、ってお話になるんですが・・・。
とりあえず「コンボ14」の「更新後処理」イベントで再クエリしますかね。

マクロでもコードでもよいですが、まあ、1行だけだしコードビルダ使って書きましょうか。



で、今度はどうかな・・・「学年」「クラス」「係」・・・3つ目のコンボボックスを選んだとき、初めて絞り込まれますよね。

後から「学年」を2年に変えたり、「クラス」を3組に変えたりする可能性があるなら、残りのふたつのコンボの「更新後処理」イベントでも再クエリさせる必要があります。まあ・・・これは、そのフォーム上でどういう絞込みをさせるのかによって、3つ目のコンボでだけ再クエリすればいいのか、その辺変わってくると思います。

3つのコンボそれぞれの「更新後処理」に、再クエリのアクションを追加しておけば、自在に絞り込まれて表示されると思います。



さて・・・これも、このフォームでどういう絞込みをさせるかによるんですが・・・。
3段階の絞込みではなくて、単に「3つの抽出条件」と考える場合は、コンボがどれかひとつ、あるいはふたつ、あるいは3つとも「空っぽ」の可能性がありますかねぇ。これは「2段階の絞込み」のコーナーでもお話してますが・・・。

「クラス」が空欄のままだと、1件も出ませんよね。↑

あたりまえですよね・・・・・。コンピュータは、「空っぽ」というのもひとつのデータのあり方と捉えます。
したがって、「学年が1年で、クラスが空っぽで、係がカレーの人」を探しますが、「クラスが空っぽ」っていう人、このテーブルの中にはいません。
「空っぽ」というのは、「無指定」というのとは違うのです。まずはそこを正しく理解しないといけませんね。
もし、この絞込みのフォームで、「クラスは関係なく、とにかく全校のカレー担当者を全員ピックアップしたい」とか、「1年でキャベツ係は誰と誰?」とか、条件が3つそろわない状態でも絞込みをする場合があるなら、そういう配慮をクエリの中にしてやらないといけません。



これは「2段階の絞込み」の時の説明と同じです。IIF関数とIsnull関数を組み合わせた式を作ります。

で、それぞれの抽出条件に、空っぽの場合(下の例だとAAという文字を表示するようにしてます)と、空っぽじゃない場合の組み合わせを入力してやるわけです。
コンボが3つだと、8パターンできるかな・・・。

目がチカチカしますけども・・・。がんばって挑戦してください。3つのコンボがそれぞれ、「空っぽのとき(AAと表示されてるとき)」と、「何かしら値が選択されているとき」と、全パターンの抽出条件を作ってやるのです。

で、[学年][クラス][係]は、別途右端の方にでも選んでおいてあげるといいでしょう。

抽出条件がかなり複雑になりますね・・・。

ひとつのフォームでいろいろな絞込みができるよう、ついつい欲張っちゃいますけれど、段階を経てたくさんのデータから特定のデータへ絞込みをするか、ランダムに検索するか・・・絞込みの仕方をある程度限定しないと、仕組みばかり複雑になって返って使いにくいフォームになっちゃうかもしれませんね。
コンボを4つとか5つとかにして、さらに絞込みの仕組みを作って、さらにそれぞれが空っぽでもよいように上のような配慮をするとなると、もっともっと抽出条件が複雑になっちゃいますよね・・・。
この辺は、お手持ちのデータベースと、システム化している業務内容とを照らし合わせながら検討していってください。

クエリは保存しながら閉じましょう。



今度はどうでしょう?
フォームを開くと・・・・・。

何もコンボに選んでないときは、全レコード出てますね。全部のコンボが空っぽ、つまりAAと表示されてる状態、を抽出しているパターンです。

でもって、どれか選んだり、選ばなかったりしても、抽出されますか?
ちょっと難しいですけれど・・・挑戦してみてください。