<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--印刷するときにレポートのレコードソースを入れ替える



レポートって、基本的に「レコードソース」になってるテーブルやクエリの内容を印刷するためのものですよね。
なので、レポートを作るときに、どのクエリ、どのテーブルの内容を印刷するのか、指定して作ります。

でも・・・仮に、テーブル(クエリでも)がふたつあって、でも、同じレイアウトのレポートを使って出したいんだけど・・・。

↑と、いう場合の方法のうちのひとつだと思ってください。

こういうのは、いろんな考え方、やり方がありますんで、そのうちのひとつってことで、参考にしていただければと思います。



まず・・・。
「ひとつのレポートで、印刷するときに条件を指定して絞り込んで印刷したい」っていう場合は、マクロの「レポートを開く」アクションの「Where条件」が役にたちます。この欄を使えば、印刷するレコードを絞ることができるのです。
このやり方は、他のコーナーでお話させていただいてますので、良かったら参考にしてください。

今回は、いろいろ事情があって、データが複数のテーブルに分かれている場合、って感じのお話です。

例えば、外部のデータベースからテーブルをリンクしているとか、普段は拠点ごとにテーブルを分けて使っているとか・・・。
本来なら、テーブルはひとつにまとめて、必要に応じてクエリを上手く使い分けていくのが、リレーショナル・データベースの本筋だと思いますけどモ、いろいろあってテーブルをまとめることができないとか、そういう場合を想像してください。

ふたつテーブルがあったとして、それぞれ構造が全く同じ(フィールド名、データ型が同じ)だったとします。
データ型は、まあ、とりあえず今回はそんなに問題にはならないと思いますが、フィールド名が全然違う、となると、ちょっと面倒になるかもしれませんね。

なぜ面倒なのか・・・。
レポートと、レコードソース(テーブルやクエリなど)の関係について、おさらいしておきましょう。

レポートは、「レコードソース」というプロパティに指定したもの(テーブルやクエリ名)の内容を印刷しようとします。
レコードソースプロパティは↑ここですね。

レコードソースの中の各フィールドと、レポート上の各コントロール(テキストボックスなど)とが結びついて、印刷が成功します。

結びつきの基準になるのは「名前」です。
Access2000は、後からオブジェクト名などを変更しても、上手いこと変更を反映させてくれる機能がありますけど、やっぱり、作り手であるわたしたちが全然わけわかってないのはイケナイです。皆さんは、レポートのデザインと、レコードソースとなっているテーブルやクエリ名や列名(フィールド名)とのつながり、理解を深めてらっしゃいますか?

レコードソースプロパティが決定されると、そのレコードソース内に存在しているフィールド名をすべて扱うことができます。
基準になるのは「フィールド名」で、各コントロールのコントロールソースプロパティ欄にひとつひとつ指定されます。

ウィザードでレポートを作ると、この辺Accessにお任せなのであまり意識なさらない方も多いですけど、いろいろ細かい処理を作っていこうとなったら、やっぱり基本をしっかり押さえておかないとならないですよね。

で、もし、このレポートのレコードソース欄を変更したとしたら・・・。

[会員テーブル_八王子]に、[会員番号][名前][所属][売上][くさや]という名前のフィールドが存在していれば(中身は関係ありません。問題になるのはフィールド名のみです)、このレコードソース欄を書き換えるだけで、レポートは[会員テーブル_八王子]の中のレコードを印刷するようになります。

フィールド名が一文字でも違っていたら、エラーが出て正しく印刷されません。あたりまえですよね。
なので、各コントロールのコントロールソース欄も、[会員テーブル_八王子]の中のフィールド名と結びつくよう、変更してやらなければなりません。

でも、フィールド名が同じなら(同じテーブルの構造でなくても、同じ名前のフィールドがあれば問題はないです)、単にレコードソースプロパティを変更してやるだけで、ひとつのレポートで複数のテーブルやクエリを入れ替えながら使うことができるわけです。



この点を理解なさっている方なら、具体的な操作もそんなに難しくはないと思います。
また、今回はレポートでお話しますが、フォームでも同じことが可能なはずです。

どういう感じで作りましょうかねぇ。。。
どういうとき「練馬」でどういうとき「八王子」にするか、どういうきっかけで判断させましょうか・・・。

今日はカンタンな無地フォームを作って、フレームを使ってみましょうか。
で、必ずこのフォームを通じて、練馬か八王子か指定をしてから印刷するものと考えていきます。
フレームの作り方については、オプショングループに関する解説のところでもお話していますので、細かい操作についてはそちらもご覧になってください。

フレームをひとつ作り、その中にトグルボタンをふたつ配置しました。
各トグルボタンの「オプション値」プロパティは、練馬が1、八王子が2という数値になっています。
フレームの名前は[フレーム0]でした。皆さん必ずしも同じじゃなくてよいですから、皆さんのフォームの中で、それぞれどういう設定、どういう名前になっているか、確認してくださいね。

で、コマンドボタンをひとつ作り、クリック時のイベントを作ります。
マクロでもコードでもどっちでもいいので、問題のレポートを開くアクションを作りましょう。
マクロなら「レポートを開く」、コードならDoCmd.OpenReport...ですよね。どっちでもいいですよ。おなじことです。

マクロだと、今、画面でご覧いただきにくいので、わたしはコードを書きました。
いきなり印刷が出ちゃわないように、一旦「印刷プレビュー」状態で出力するようにしました。



で、このボタンをクリックしたとき、フレーム上の「練馬」のボタンが凹んでれば練馬のテーブルを、「八王子」が凹んでれば「八王子」のテーブルを印刷するように、レコードソースを書き換えるような処理を作ってみます。



単純に、このレポートの「レコードソースプロパティ」に、テーブル名を「値の代入」してやればいいんです。
問題はそのタイミングですね。
レポートを開いてしまってからでは、このプロパティにテーブル名を代入することはできません。あたりまえですよね。もう開いちゃってるんですから・・・。
この辺が、フォームとレポートの違いかもしれません。レポートって、紙に印刷するものですから、例え印刷プレビューであったとしても、開いてしまってから設定とかを書き換える操作は受け付けてくれないんです。あたりまえといえばあたりまえなんですが。。。

そこで、こういう場合は手っ取り早く、「レポートのイベント」を使うようにするといいでしょう。
レポートの「開くとき」イベントで、自分自身の「レコードソースプロパティ」を書き換えさせるのです。

Meというのはこの場合は、レポートの中の処理ですから、このレポート自身のことになります。
半角のドットを打つと、「ドットの後ろにMeの各プロパティを指定するよ」という意味になるんですよね。

レコードソースプロパティは、上のように指定します。

Select Caseっていうのは、3択4択など、いくつかの条件分岐を行うときに使う方法でしたよね。
Case 1の「1」は、トグルボタンのオプション値プロパティの値を指します。
今回は2択ですけど、いちおう、「その他の場合」を想定して、例外を「CaseElse」っていうことで書いてみました。

もし、テーブルやクエリが4種類5種類あるなら、フレーム内のトグルボタンの数を増やして、Case xxという部分を増やしていってください。


例外、といえば、もし、フォームのトグルボタンがどっちも押されてない場合、どうするか?ってとこを考えれば、オッケーのはず。
フォームを開いてすぐは、トグルボタンはどっちも押されてないと思います。
この場合、今の状況だと、とりあえず練馬分が印刷されますね。

まあ、これでも妙なエラーにならないのでよいかもしれません。

考え方のひとつに、フォームを開いたときの、フレーム0の既定値を、1か2かどっちかに決めておく、という方法があります。

フォーム開くと、「練馬」の方が凹んでますよね。



他にも、こんな方法があります。

おそらく、「フレーム0の中のトグルボタンがどっちも押されてない」ということは、フレーム0が「Null(値がない)」の状態であると思われます。
なので、「フレーム0がNullだったら、メッセージボックスを出して操作を促し、Nullじゃなかったら印刷を開始する」という具合にしてもいいかもしれないですね。