<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97超入門>絞込みの仕組みを作る
 基本のクエリー サブフォームで 表形式のフォームで コンボボックスで 全件表示 コンボボックスが片方空っぽでも 2段階の絞り込み



■全件表示

これも、いろんな方法があるんですけど・・・。
今まで作ってきた仕組みをうまく活かすには、レコードソースを入れ替えるって方法がいけるんじゃないかなと思うんです。

マクロの「値の代入」っていうアクションを使えば、フォームのプロパティの値を変更することができるんですよ。
この仕組みを利用して、今[クエリー]ってなってるフォームのレコードソース欄に[商品マスター]を代入すれば、抽出条件のない状態で商品の一覧が表示されるってわけです。

で、やっぱ絞り込んで一覧表示したい・・・という場合は、逆をやればいいんですよね。

後は、こういう動きをできるだけ分かりやすく利用できるように工夫すればいいと思います。
今絞り込んで表示してるのか、全件表示してるのか一目でわからんようでは、返って使いにくいですもんね。

これが完成品のイメージです。
[全件表示]のボタンがへっこんでる時は、コンボボックスからの絞り込みができなくて、フォームのレコードソースは[商品マスター]になってます。
[絞り込み]のボタンがへっこんでる時は、コンボボックスからの絞り込みができるようになって、フォームのレコードソースは[クエリー]になります。

と、いう動きを作ってみようと思います。
[全件表示][絞り込み]のボタン(トグルボタンというのを使います)の仕組みのところがちょっぴりややこしいですが、後は対して難しいこともないんで、ゆっくり挑戦してみてください。


まず、[フォーム]内のどこかに、フレームと呼ばれるコントロールをひとつ作ります。
ちょっとした枠ですね。
線はへこんだような立体表示になってますけど、ツールバーの線の種類や色などのボタンを使えば、ちょっと雰囲気を変えることもできると思います。
わたしのは[フレーム6]っていう適当な名前がついてます。
テキストボックスやコンボボックスと同じで、これが呼び名になりますので、わかりにくいようなら変更しましょう。

で、ついでに「フレーム6」っていうラベルが右上にくっついてますよね。
これはいくらなんでもこのままじゃわかりにくいでしょう。
ラベルだけ削除するか、「表示内容」とか「表示状態」とかわかりやすい内容に書き換えておきますかね。

で、ツールボックスのボタンをよくご覧いただくと・・・。
今のフレームのボタンのとなりに、トグルというボタンがあります。
トグルボタンってやつですね。あります?

これを[フレーム6]の中にふたつ、作ります。作るとき[フレーム6]が一瞬ぱっと黒くなるので、なんとなくフレームの中にボタンを作ってるような感じになると思います。その辺意識しながら作ってみてください。

で、ボタンの標題やら大きさやら、調節しましょう。
ついでに、各トグルボタンのデータプロパティを確認しておいてください。わたしのは左のオプション値が1、右のオプション値が2でした。
みなさんのはどうでしょう。

ちょっとややこしいんですが、フレームの中にトグルボタンを作った場合、トグルボタンを単独で使わず、フレームを中心に考えます。

[全体表示]がへこんでる場合、[フレーム6]は1
[絞り込み]がへこんでる場合、[フレーム6]は2

という数字が入ってくるという仕組みになってます。これをうまく利用して、フレームの中のどれかのボタンがひとつだけへっこむ、という動きを作ります。

ちょこっとだけフォームビューに切り替えてテスト・・・・。どっちかクリックすると、かたっぽが出っ張ると思うんですけど、どうです?
ならないという方は、多分トグルボタンがフレームに重なってるだけで、フレームの中に入ってないんだと思いますよ。
もう一度作りなおしてみてください。


で、いちおう下準備ができました。

次に、この[フレーム6]の更新後処理のイベントを作ります。
イベントプロパティからマクロビルダを起動して・・・と、この辺はもうみなさんオッケーですよね。
では、マクロを作りましょう。

マクロの中で、条件をつけることができるようにします。すなわち、

フレーム6が1だったら、サブフォームのレコードソースは[商品マスター]

フレーム6が2だったら、サブフォームのレコードソースは[クエリー]

となるようにするわけです。
で、ついでに、[種類][ランク]のふたつのコンボを、使えるようにしたり使えなくしたり切り替えもしてみましょう。

まず、1行目。上の図でいくところのピンクのツールボタンをクリックすると「条件」という欄が登場しますので、ここに

Forms![フォーム]![フレーム6]=1

と入力します。あ、実際のみなさんのフォーム名とフレーム名を入力してくださいね。
わたしは、フォームという名前のフォームなんで、こうなりました。

で、その条件を満たしたときやるのは、サブフォームのレコードソース欄に"商品マスター"という単語を代入するって仕事。
「値の代入」アクションを選びます。

さあて、サブフォームのプロパティをいじるのって、記述が結構面倒なんですけど、決まった書き方なんで覚えてしまわれるとよいと思いますよ。

Forms![フォーム]![サブフォーム].Form.RecordSource

これで、「メインのフォームから見た際の、[サブフォーム]という名前のコントロールは実はフォームのことで、
そのフォームのレコードソースというプロパティを操作したいのだ」という意味合いになります。

これを踏まえて、1行目の「値の代入」アクションは

アクション:値の代入
 アイテム:Forms![フォーム]![サブフォーム].Form.RecordSource
 式:
"商品マスター"

と、こうなりますね。


で、後はオマケなんですけど・・・あと2回、「値の代入」アクションを使って、ふたつのコンボボックスを使用不能にしようと思います。
サブフォームの中身が「商品マスター」の間は、このコンボ操作しても何も変わりませんもんね。

「条件」のところに、ピリオドを半角で3回入力します。
これで、「上の条件はまだ継承されている」という意味になります。半角で3つですよ。



で、「値の代入」アクションをやります。

アクション:値の代入
 アイテム:Forms![フォーム]![種類].Enabled
 式:
False

アクション:値の代入
 アイテム:Forms![フォーム]![ランク].Enabled
 式:
False

これで、ついでにコンボボックスの「使用可能」プロパティに「いいえ」が代入され、このコンボは使えなくなります。


で、[フレーム6]が2のとき、サブフォームのレコードソースを"クエリー"にして、
コンボボックスふたつを使用可能にすればいいんですよね。逆をやればよいわけです。



条件:Forms![フォーム]![フレーム6]=2

アクション:値の代入
 アイテム:Forms![フォーム]![サブフォーム].Form.RecordSource
 式:
"クエリー

アクション:値の代入
 アイテム:Forms![フォーム]![種類].Enabled
 式:
True

アクション:値の代入
 アイテム:Forms![フォーム]![ランク].Enabled
 式:
True

条件欄のピリオド3つをお忘れないように。

完成したら、マクロを保存しながら閉じて、フォームに戻りましょう。


さてー・・・いかがでしょう。マクロの記述が間違ってなければ、トグルボタンをクリックすることで切り替わるはずなんですけどね。
エラーが出る場合は、多分、フォームとかコントロールとかの名前が間違ってるか、ピリオドとかビックリマークとか記号が抜けてる可能性大です。
もう一度よく確認してみてください。

[絞り込み]の方をクリックすると、コンボが使えるようになって、絞り込みができるようになると思います。


フォームを開いたとき、[絞り込み]の方のトグルがへっこんでた方が、今回の場合スマートだと思うんですけどね。
最初はサブフォーム内は、絞り込みするための[クエリー]の内容が表示されてますし・・・。

チョットしたことですけど、[フレーム6]のデータプロパティの「既定値」を2にしておくとよいと思います。