- 締切済み
MS ACCESS 2003 サブレポート機能でメインレコードと関係の
MS ACCESS 2003 サブレポート機能でメインレコードと関係のないレコードも表示される どなたかアクセスに詳しい方、教えて頂けませんでしょうか。 MS ACCESS 2003 にて、帳票印刷システムを構築しております。 ・請求ヘッダテーブル・・・顧客ID、顧客会社名、顧客氏名、住所 等 ・請求明細テーブル・・・顧客ID、請求明細名、単価、数量、小計 等 となっております。 こちらの状態で、顧客ID別(1人ずつ)に、紙面の上部に請求ヘッダテーブルの情報を羅列し、 紙面の下部に表形式で請求明細テーブルを表示するような形式の「レポート」を作成したいと考えております。 そこで、メインレポート/サブレポート機能を使って、上記を実現したいと思い、以下のような手順でトライしているのですが、サブレポート部分(デザインビューで見た場合の「詳細」部分)に、でメインレポート部分の顧客IDの請求明細データではないレコード(違う顧客IDの請求明細)まで表示されてしまいます。 ■リレーションを作成 ・メニュー「ツール」⇒「リレーションシップ」にて、請求ヘッダ-請求明細をひもづけ。 ・参照整合性にチェック。 ・結合の種類は「請求明細の全レコードと請求ヘッダの同じ結合フィールドのレコードだけを含める」。 ■レポートを作成 ・レポート⇒新規作成⇒レポートウィザードでレポートを作成。請求ヘッダのみの情報で作成。 ・デザインビューの詳細部分にて、サブレポートを呼び出し。請求明細テーブルを選択し、顧客ID、請求明細名、単価、数量、小計 等を選択。 上記のようにすると、顧客IDとは関連なく(正しい詳細データもそうでないデータも合わせて)10件の請求明細データが表示されます。 また顧客ID=1の場合も、次のページの顧客ID=2の場合もすべて同じ10件の明細データが現れます。 インプレスのアクセス本を参照しながら作業しているのですが、詳しくない分非常に苦労しております。 どなたか、なにとぞよろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
どうしても気になったので一応最初のフォームでの やり方を説明しておきます。 questionkingさんの回答からレポートのヘッダが わかりましたので、以下のようにラベルの 移動、ヘッダの構成を行ってください 顧客IDのフッタは並べ替え/グループ化を 選択し、顧客IDを選択し、グループフッタを 「はい」にすると表示されます。 ####################################### メインレポート: ーーーーーレポートヘッダーーーーー ーーーーーページヘッダーーーーーー 「ラベル類」 ーーーーーーー詳細ーーーーーーー 「サブレポート」 ーーーーー顧客IDフッターーーーーー ーーーーーページフッターーーーーー ーーーーーレポートフッターーーーー ###################################### サブレポート: ーーーーーレポートヘッダーーーーー 「ラベル類」 ーーーーーーー詳細ーーーーーーーー 「テキストボックス類」 ーーーーーレポートヘッダーーーーー ###################################### サブレポートは最初のもので動けばそれで もいいです。 このように構成をした後に、顧客IDフッタ の上で右クリックしてプロパティを選択し、 改ページの欄の「カレントレコードの後」を 選択します。 レポートフッタの下の部分には余分な余白を 残さずレポートフッタに入れ込んでください。 残っていると余分なページが表示されます。 設定がおなじであれば、これで望みのレポート になるはずです。 ミソは改ページの欄の「カレントレコードの後」 の設定です。これはレポートの構造がわから ないと設定できないプロパティです。 もしうまくいったら何がポイントだったか おぼえておいてください。この レポートをいじくってみてください。 回答者さんが熱心に回答されていたので 回答をひかえたのですが、questionkingさんが 熱心だったので回答を寄せておきます。 また、以下に先で役立つレポートを公開 されています。ヘッダ、書式設定、 改ページコントロールなどの使い方、 ヘッダなどの各コントロールのイベント などを使えるようになるとレポートは自在です。 あとはquestionkingさんが考えておられる ような方向でいいです。 何かあれば書き込んでください。では。 http://www.ynsk.co.jp/ http://www.msactry.com/ http://homepage2.nifty.com/MrUr/katuyo/index.htm
- piroin654
- ベストアンサー率75% (692/917)
questionkingさんへ。 回答者の方が回答を寄せられているので、 私の方はこのまま様子を見ます。 仕事に使われるようなテーブル内容なので いい結果になればいいですね。
- DexMachina
- ベストアンサー率73% (1287/1744)
No.2、3です。 > ・空のマスタのフィルタ・・・はい これが何のことか、しばらくわからず、調べていたのですが・・・(汗) お使いのAccessは、2003ではなく2007ということでよろしいでしょうか? (今回の現象の原因には関係ないかもしれませんが、再現の確認には 少なくともそちらの操作を追える必要があるので・・・) ・・・それはそれとして、今回の現象についてなのですが、結論(?)から 言うと、こちらでは状況を再現できませんでした(汗) こちらで確認した限りでは、リレーションシップが設定されたテーブルを 使用した場合、 1)『レコードソース』が、メイン側に「一対多」の「一」側のテーブル、 サブ側に「多」側のテーブルを設定し、 2)サブ側に適当な連結コントロールを設置 してさえあれば、メインレポート側にサブレポート以外にコントロールを 一切設置しなくても、メインレポートの顧客ID=1に相当する領域には 顧客ID=1のサブレポートのレコードが、顧客ID=2に相当する領域には 同様に顧客ID=2のサブレポートのレコードが、表示されました。 殆どの状況説明を無視してしまい、 「最初は、メインレポートの顧客IDに拘わらずサブレポートには全て 同じレコードが表示され、サブレポートの再設置後はサブレポートの レコードが一切表示されなくなった」 との説明部分のみを再現するなら、 【最初の状況】 メインレポートのレコードソース: 「請求ヘッダテーブル」 サブレポートのレコードソース: 「請求明細テーブル」 リンク親/子フィールド: (ともに未設定) 【変更後の状況】 メインレポートのレコードソース: (空白(設定削除)) サブレポートのレコードソース: 「請求明細テーブル」 リンク親/子フィールド: ともに「顧客ID」 が近い状況(但しレポートを開く時に『顧客ID』を求めるパラメータ ダイアログを表示)にはなりますが、それ以外の状況がかけ離れすぎて いますし・・・(汗) (もうひとつの可能性としては、請求ヘッダテーブルのレコードを、 最初の時にはテスト用のものが入力されていたが、サブレポートの 再設定後は全て削除していた、というのも考えましたが、これも リレーションシップの「参照整合性」を考えると、請求明細テーブルの レコードも存在できなくなるはずで、削除自体ができないか、サブ レポートを単独で開いても何も表示されなくなるか、のはずで・・・) 一応、「メインレポートの顧客IDと一致するレコードのみを表示する サブレポート」を、以下の手順で作成してみて、実際にウィザードで 作成したものの設定と比べてみることをお勧めします。 (というか、もう、これぐらいしかできません(汗)) 1)請求明細テーブルをレコードソースにして新規レポートを作成し、保存 (『詳細』領域に、顧客IDなどのフィールドを追加) 2)請求ヘッダテーブルをレコードソースにして、メインレポートを作成 (『詳細』領域に、顧客IDだけを追加) 3)ナビゲーションウィンドウ(Access2007の画面左端に表示される領域) から、「1」で作成したレポートを追加して、保存 ・・・リレーションが設定済みなら、リンク親フィールド/リンク子フィールドは 自動的に設定されるはずなので、これで「メイン側の顧客IDと一致する レコードのみを表示するサブレポートを持つレポート」が出来上がっている はずです(体裁などは別として)。 お役に立てず、申し訳ありません(汗)
お礼
DexMachinaさん、 環境は2003、ファイルはデフォルトで2000形式での保存となっております。 書籍、ネットなどで調べましても、やはりDexMachinaさんがおっしゃる方法が正しいようですが、 いかんせん私の環境では再現できない(1対多のレポートが顧客IDひもづきされない)状態です。 「明細テーブルを顧客IDごとにつくる」をループさせる等、別の方法を考えます。 大変ご丁寧な回答、どうもありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
混乱中のようですが、確認させてください。 最初に質問されたときの状態の サブレポートには、 サブレポートのヘッダー、フッターは何が いくつ設定されていますか。
お礼
piroin654さん、 最初に質問した際のサブレポートをデザインビューで見ると、以下のような設定となっています。 ■レポートヘッダー ・顧客ID(というラベル) ・分類(というラベル) ・内容(というラベル) ・日付(というラベル) ・単価(というラベル) ・数量(というラベル) ・小計(というラベル) ■ページヘッダー なにもない ■詳細 ・顧客ID(のデータ値) ・分類(のデータ値) ・内容(のデータ値) ・日付(のデータ値) ・単価(のデータ値) ・数量(のデータ値) ・小計(のデータ値) ■ページフッター なにもない ■レポートフッター なにもない レイアウトビューでみると「詳細」の部分は繰り返し表示となっており、すべての顧客IDにひもづくデータが表示されてしまっています。 本来であれば、メインレポートの顧客IDのもののみ表示されて欲しいのですが。 1対多でひもづく2つテーブルからレポートを作成するという、そもそもの手順が間違っているのでしょうか。 お詳しいのであれば教えて頂けると大変助かります。 よろしくお願いします。
- DexMachina
- ベストアンサー率73% (1287/1744)
No.2です。 > レコードソース、フィルタ、フィルタ適用、並べ替え、並べ替え適用の5項目が > 表示されていました。 失礼しました、デザインビューでサブフォームを扱う場合の注意点に触れておくのを 忘れました(汗) 表示内容(ソースオブジェクト)を設定済みのサブフォーム/サブレポートをデザイン ビューで扱う場合、 a)サブフォーム/サブレポートが選択されていない状態からそれをシングルクリック すると、コントロールとしてのサブフォームが選択され、 b)サブフォーム/サブレポートが選択された状態から、更にサブフォームをクリック すると、表示用に設定したフォーム/レポートが選択される 状態になります。 前回の回答で添付した画像は、「a)」の状態のときのプロパティシートで、 questionkingさんが見たのは「b」の状態でのプロパティシートになります。 ですので、上記の点に注意してサブレポートを選択するか、一旦メインレポート 側の適当なもの(レポートでもコントロールでも可)でプロパティシートを表示後、 プロパティシートの一番上にあるコンボボックスから、対象サブレポートの名前を 指定することでも対象サブレポートを選択できますので、もう一度確認してみて ください。 なお、ウィザードを通してサブレポートを設置した場合も、ウィザードの3頁目 「メインフォームとリンクするフィールドを指定する方法を選択してください。」 のところで、 a)「一覧から選択する(C)」を選択して、「なし」にするか、 b)「独自に設定する(D)」を選択しただけで、その下に出るコンボボックスで フィールドを指定しない 場合は、やはり同様に『リンク親フィールド』等は空白になります。 【余談】 質問文中の「■リレーションを作成」の内容ですが、「リレーションシップ」と 「(クエリのデザインビューでの)結合」とを混同されているのかなと思いましたので、 一応以前の回答をあわせて参考までに載せておきます: http://oshiete1.goo.ne.jp/qa5073445.html
お礼
DexMachinaさん、ありがとうございます。 ご指摘いただいたようにサブフォーム/サブレポートの選択の仕方がよくなかったのかと思い、 請求書レポート(便宜上今回のレポートをそう呼びます)の「ページヘッダー」部分に「請求ヘッダ」の情報を残したまま、レポートの「詳細」部分は削除し、新たに左サイドバーから「詳細」に入るべきサブレポートをドラッグアンドドロップしました。 ドラッグアンドドロップしたレポート・・・「T30_請求明細のサブレポート」 こちらはすでに作成されており、単独で表示するとすべての顧客IDにひもづく請求明細が表示されます。 「請求書レポート」のサブレポート部分のプロパティシート ・選択の種類;サブフォーム/サブレポート、値は「T30_請求明細のサブレポート」 ・ソースオブジェクト・・・レポート.T30_請求明細のサブレポート ・リンク親フィールド・・・顧客ID ・リンク子フィールド・・・顧客ID ・空のマスタのフィルタ・・・はい ・使用可能・・・はい となっています。 おそらくDexMachinaさんに教えて頂いたような状態になっているかと思われます。 しかし、これでレポートビュー、印刷プレビューなどで確認すると、 今度は詳細部分にカラム名(顧客ID、分類、内容、単価、数量などの文字列)しか表示されず、 その下に表形式で表示されるべき値は、一つも出てきません。 そもそものレポートの作成の方法やリレーションシップが間違っているのかも知れませんが、何か原因が考えられますでしょうか。 なお、余談にてご指摘いただいたリレーションについてですが、 今回はヘッダ部分は「ヘッダテーブル」、詳細部分は「詳細テーブル」、あるいは「詳細テーブルを基にしたレポート」で作成しようとしており、クエリの結合に起因する重い間違い、設定間違いはないかなと思っております。 ヘッダテーブル、明細テーブルがあるところからやり直して、リレーションシップのつけなおしなども行ってみたいと思っておりますが、正しい方法、手順間違いしやすいところなどありましたら、お手数ですが、ご指摘いただけますと幸いです。 よろしくお願いいたします。
- DexMachina
- ベストアンサー率73% (1287/1744)
> ・デザインビューの詳細部分にて、サブレポートを呼び出し。請求明細テーブルを > 選択し、顧客ID、請求明細名、単価、数量、小計 等を選択。 とありますが、この『サブレポート』コントロールを追加する際には、ウィザードを使用 されたのでしょうか。 もしもウィザードを使用していないなら、『リンク親フィールド』及び『リンク子フィールド』 の設定がされていないために、顧客IDと関連性のないレコードまで表示されてしまって いるものと思います。 【手動での設定方法】 1)当該レポートをデザインビューで開く 2)当該サブレポートをダブルクリック、或いはクリックして選択した後にAlt+Enterキーを 同時押しするなどして、サブレポートのプロパティシートを開く 3)『データ』タブを選択し、『リンク子フィールド』と『リンク親フィールド』に、それぞれリンク させたいフィールド(ご質問の件ではともに「顧客ID」)を指定 4)レポートを保存して閉じる 【サブレポートの新規追加時にウィザードを使用する方法】 ツールボックスの左から2番目(縦長表示にしている場合は上から2番目)に『コントロール ウィザード』ボタンがありますので、これをオンにした状態で、サブフォームなどのコントロール をツールボックスから追加します。 (ウィザードは、サブフォーム以外のコントロール追加時も起動します。・・・それが鬱陶しい ようでしたら、必要時のみオンにするようにしてください(汗)) ・・・以上です。
お礼
DexMachinaさん、さっそくありがとうございます。 親レポートのみでレポートを作成した後、子レポートをウィザードで追加しております。 プロパティでのデータタブを見ましたところ、DexMachinaさんの画面とは少し違い、 レコードソース、フィルタ、フィルタ適用、並べ替え、並べ替え適用の5項目が表示されていました。 値は以下です。(ファイル添付ができない用ですので、テキストで記載いたします。) ■レコードソース SELECT T30_請求明細.顧客ID, T30_請求明細.分類, T30_請求明細.内容, T30_請求明細.日付, T30_請求明細.単価, T30_請求明細.数量, T30_請求明細.[小計(税込)], T30_請求明細.並び順 FROM T30_請求明細; ■フィルタ (値なし) ■フィルタ適用 いいえ ■並べ替え (値なし) ■並べ替え適用 いいえ レコードソースにSQLが入っているのですが、例えば 「WHERE T30_請求明細.顧客ID = T20_請求ヘッダ.顧客ID」のような請求ヘッダ側とのリンクがあるような記述があれば良いのかもしれませんが、分かりません。 そもそも画面項目が違うので、私のアクセス(ver2003、ファイル形式はAccess2000と表示されています。)環境が良くないとかでしょうか。
- iryuza
- ベストアンサー率57% (16/28)
このHPを参考にしてみてはどうでしょうか
お礼
iryuzaさん、 ありがとうございます。 しかし上記のサイト(http://www.mahoutsukaino.com/)にはぴったりの回答が内容でした。
お礼
piroin654さん、 どうもありがとうございました。