<HOME  <お願い事項   <Access2002 TOP   <Access2000 TOP   <サイト内検索
 MS-Access97超入門>基本をマスターしよう
 DBTable1Table2Fom1Form2Form3Query1Query2Query3Query4Query5Query6Report1Report2Report3Macro



■Query6 : 番外編--データの絞込み#2

さて、では、コードを入力する白いウィンドウだけ閉じて、いちおうフォームを保存しましょうかね。
[保存]のツールボタンをクリックしておきましょう。

で、フォームビューに切り替えて、どきどきどきどき・・・テストです。

バンザーイ!!

商学部を選んだら、数名の学生に絞り込まれました!
どうやら、ちゃんと商学部の学生だけの状態になっているようです。

ん???
一番下の空白行はなんだ???・・・なにを言ってるんですか。これは「新規入力行」じゃないですか。
これがないと、このフォームから新しい学生の情報を追加することがデキマセンよ。

え?今回は、この空白行、ない方がいいですか?
んじゃあ、フォームのところで見たプロパティ、もう一度おさらいしてみましょうか。

フォームの「データ」プロパティの中に、このフォームを通じて、レコードソースの中のデータをどの程度操作してよいか調節できるようになってます。

更新の許可:データの書きかえをしてもよいか
削除の許可:レコードの削除をしてもよいか
追加の許可:レコードの追加をしてもよいか
データ入力用:常に新規データ入力状態で開く

「追加の許可」だけ「いいえ」にしましょうかね。


それだけじゃ何なんで、ついでにフォームフッター部分を利用して、人数のカウントとかせぎの合計を出してみましょうか。

テキストボックスをふたつ作って、大きさやラベルを調節してください。

で、それぞれのプロパティを出し、コントロールソース欄に、フォーム上に表示された値から人数とかせぎの合計を出すための式を入力します。

かせぎの合計を出す方のテキストボックス 人数を数えるテキストボックス

あたしはちょっとものぐさして、テキストボックスの名前はテキストxxのまんま使いましたけど、この辺はお任せしますので、変更する練習とか、なさってみてください。


うほほーい。どうでしょう。出ます?出ます?

コンボボックスとクエリーの連携プレーで、こういう仕組みを作ることができるんですね。
それぞれ、どことどこが関連しているのか、ポイントが2つ3つありますから、いざというときのために、ぜひおさらいしてくださいね。

で、あとで、成績に対するごほうびの内容が変ったとしますよね。

成績テーブルの内容が一新されました。

ね、[成績一覧フォーム]開くと、ちゃんと変更内容が反映されてますよね。

これはフォームじゃなくて、クエリーの能力です。
クエリーが、開くとき、一番最新のテーブルのレコード内容を開くので、それを基にしているフォームもこうなるわけですね。


え?学部を何も指定してないときは、全学生のデータを表示したい??

・・・・む、難しいこといいますねぇ。

そのフォームにどんなデータを表示するかは、フォームの「レコードソース」というプロパティによって決定されます。
一目瞭然ですが、クエリーかテーブルの名前がいっこしか入らないんです。
ここを変更してフォームを開きなおせばいいんですけど、めんどうです?

じゃあ、ちょっとやってみますか?
そうですねぇ。いろんなやり方がありますけど・・・。
今日は手っ取り早く、「コマンドボタンをひとつ作って、それをクリックしたら全部表示」という動きを作ってみましょうかね。

データベースウィンドウの中の、クエリーの一覧をみてください。
ずいぶんいろいろクエリー作りましたよね。

さて、今[成績一覧フォーム]が使っている[成績クエリー]と、構造がまったく同じで、抽出条件のないクエリーをもうひとつ作ります。
何のためにって・・・。学部を選んでないとき、全部の学生を表示するためですって。

もう一回クエリーを作るのがめんどうだなーとかいう場合、こんな方法も・・・。オブジェクトのコピーです。
まず、データベースウィンドウの中を見て、[成績クエリー]をクリックします。
ダブルクリックじゃないですよ。クリックして、青く反転表示させるんです。

で、コピーをします。ショートカットメニュー(右クリック)でも出てくると思います。
また、キーボードから[Ctrl]+[C]を押しても、選択しているものをコピーする、という意味になりますので、どっちかやってみてください。

で、その後、間髪入れずに貼り付けをします。コピーしただけじゃ、何にも起こらないんですよ。
ショートカットメニューに張り付けというのがあると思います。あるいは、キーボードから[Ctrl]+[V]でもいいですね。

すると、こんなウィンドウが出てきます。貼り付けるということは、同じオブジェクトをもういっこ作るという意味になります。
名無しはいけません。名前を付けてね、という意味ですね。

わたしはこんな名前にしました。カッコとか@とか記号を使う場合は、半角全角に注意してくださいね。
こういう記号ならどっちでも大丈夫ですけど、どっちだったかわかんなくなっちゃうってのはなしですよ。半角なら半角で入力したことを覚えておいてください。

はっはっ。手抜き手抜き。これでまったく同じクエリーができたわけです。

でも、このまんまじゃだめっすね。だって、(条件なし)とか書いてますけど、まだ条件、残ったままですよね。formsなんとかって・・・。

[成績クエリー(条件なし)]の方を、デザイン画面で開きましょう。
ほら、コピー品だから、[成績クエリー]とまったく同じ内容ですよね。
でも、これを開いたときは、学部に関係なく、[名簿テーブル]の中身を全部出してほしいんで、[学部]のとこの抽出条件を削除しましょう。

中途半端に残さず、思いっきりざくっと削除しちゃってくださいね。で、この[成績クエリー(条件なし)]を保存しながら閉じます。


さて、あわただしいですが、フォームの方に戻ります。[成績一覧フォーム]のプロパティを出しましょう。

フォームを開いたときは、とりあえず全学生のデータを出しましょう。
なので、条件のないほうのクエリーをとりあえずレコードソースにしておきます。

で、コンボボックスから学部を選んだとき、この部分を[成績クエリー]に変更する、という動きを作ります。

と、???
とりあえず、さっき使った「コンボボックスの更新後処理」ですね。
[イベントプロシージャ]とかわけのわかんない単語が入ってますけど、気にせずビルドボタンをクリックしましょう。

で、さっき、

DoCmd.Requery

って書き込みましたけど、これを全部消して、

Me.RecordSource = "成績クエリー"

って書き直します。ピリオドを打つと、Meの後ろに入力することのできる単語がずらずら出てくるので、その中から探してみてください。
クエリー名は、ダブルコーテーションで囲みますよ。いちおう、ルールなんです。

Meというのは、自分自身・・・つまり、このフォーム、ってことです。
ピリオドは、このフォームのプロパティのどれか、と言葉をつなげるための決まり記号です。
で、Recordsourceっていうのは・・・そのものずばり、レコードソース欄のことです。

ここに、成績クエリーって代入しなさい、っていう意味です。
ダブルコーテーションで囲んでいるのは、成績クエリーというのが固有名詞だからです。
だって、パソコンに漢字とかカタカナとか、理解できるわけないじゃないですかー。
ましてやみなさんが作ったクエリーの名前なんか、わかんないんですよ。こいつにはね。
だから、""で囲んでやって、「あんた知らないかもしれないけど、こういうものがあるの。そのまま代入すればいいの」といってやるわけです。

Enterキーを押すなり、カーソルを他の行に動かすと、つづりが間違ってないかどうか、チェックが入ります。で、部分的に大文字になりますよね。なればOKってことです。


さっきもやりましたけど、このDoCmd.RequeryとかMe.RecordSource = "成績クエリー"とか、これはいったいなんなんでしょうね・・・・・・・。

これ、いわゆるVBAってやつです。


さあて、どうかな。フォームを保存しながらいったん閉じて、改めて開きましょう。

最初は全員分表示されてます?今は[成績クエリー(条件なし)]が働いてフォームに情報を表示してるんですよね。

で、学部を選ぶと???[成績クエリー]の方が働いて、コンボの中身と同じ学部の学生だけの表示になるはずです。
ここまで、オッケーですか?


でも、このままだと、いったん学部を選んでしまうと、再び全学生の表示をさせるためにはいったんフォームを閉じて開きなおさないといけないみたいじゃないですか?
どうでしょう。いろいろいじってみてください。

んでは、全学生の表示をするための仕組みを作りましょう。
さっきのMe.RecordSource = "成績クエリー"とおんなじようなことをやればいいんですよね。

これは「どういうタイミングでやるか」という動きをいろいろ考えないといけません。
今回は「コマンドボタンを作って、これをクリックしたら全表示」というふうにしますけど、もちろん他にもいろいろな方法があるはずです。

まず、コマンドボタンと呼ばれるものを適当にひとつ作ります。
詳しくはマクロのところでお話してますのでここではカンタンに素通りしますが、ボタンの表面を強い意志を持ってクリックすると、カーソルが出てきます。
ボタンの標題というか、最初は多分コマンドxxという適当な名前になってると思いますので、これを書き換えてください。

ま、気分気分。コマンドxxのまんまじゃ味気ないですもんね。

ついでに、コマンドボタンのプロパティを出して、名前もつけてあげましょう。あたしは懐かしいところで[全員集合]にしました。

で、このボタンをクリックしたらどうする???という動作を作ります。
イベントのプロパティの中の「クリック時」。これですね。で、右端のビルドボタンをクリックし、コードビルダを使います。

と・・・・。同じフォームの中の動作は、同じとこに書き込まれることになるんで、さっき書いたコンボボックスの更新後処理のプログラムも、上にありますねぇ。

でも今回は下の部分。[全員集合]のクリック時の動作を書きます。書き終わったら、このウィンドウだけ閉じましょう。

Me.RecordSource = "成績クエリー(条件なし)"

Me![学部指定] = Null

2行目のMe![学部指定] = Nullは、なくてもいいんですけど・・・。
意味としては「学部指定という名のコンボボックスの中身を空欄にしてくれ」という意味です。
どっちでもいいことですけど・・・・。
せっかく全学生表示するようになってるのに、コンボボックスの中に前の抽出条件が"商学部"とか、残像のように残ってるのもナニカナーと思って、こんなの入れてみました。
Nullというのは、コンピュータの世界で広く使われている単語なんですが、厳密に言うと空欄という意味ではないんです。
ただ、こういう時、よく使います。空っぽにするというよりは、使ってなかったことにする、っていう意味の方が近いかな・・・。

さて、どうでしょうか。さーっと駆け抜けてきましたが、フォームを保存して、改めて開いてみてください。
で、改めて開いてみて・・・。ここまで形になると、なんだか使えそうなカンジしますよね。

MS-Access使うなら、クエリーやフォームの細かい機能やプロパティをうまく活用して、使い手側の立場にも立っていろいろ作り込んでいってみてください。


うはは〜。クエリーの基本操作のコーナーなのに、ずいぶんいろんなことやっちゃいましたねぇ。一息いれてください。
でも、クエリーだけ単体で使うってことよりも、フォームや、これからお話するレポートと組み合わせて作り込むことをしっかり身につけておいた方が、絶対役に立ちますよ。

難しいこと言う人もいますけど、テーブル−クエリー−フォームがどんな風につながりあっているか、その辺さえしっかりつかんでいれば、絶対大丈夫。
みなさんの身の回りの情報、例えばオトモダチのリストとか、好きな野球チームの選手名鑑とかテーブルにしてみて、クエリーとこういうフォームを組み合わせて、ピッチャーだけ表示するとか、打率3割以上だけ表示するとか・・・そんなフォーム作りながら、おさらいしてみてくださいね。