- ベストアンサー
Accessのレポート作成について教えてください。
Access2003を使用しています。 「T取引先マスタ」と「T取引先の契約内容」があります。 それをT取引先マスタを親とし、T取引先の契約内容を子サブフォームとした「F取引先と契約内容」を作りました。 連結フィールドは取引先IDです。 次に「F取引先と契約内容」の項目全てをレポートにしました。(T取引先マスタとT取引先の契約内容をクエリで連結させました。) レポートは3種類必要です。 契約状況がキーになります。 1.契約の有無に関わらず取引先マスタ詳細すべて。 2.契約締結している取引先マスタ詳細すべて。 3.契約締結していない取引先マスタ詳細すべて。 契約締結日のところに「Null」値で条件付けしました。 1.は問題なく作成できました。 2.3.がうまく出来ません。 取引先IDが2件出てしまうのです。 取引先ID 取引先のもろもろの情報 契約種類 101 ・・・ 基本 101 ・・・ 業務委託 101 ・・・ 基本 101 ・・・ 業務委託 契約種類は「基本」と「業務委託」の2種類があります。 クエリのデータシートでは次のようになっています。 取引先ID-契約種類 101 - 基本 101 - 業務委託 取引先IDはひとつとして、サブフォームの2種類の契約内容を契約締結日をキーとした条件抽出のレポートを作成するには、どのようにしたらいいのでしょうか? 取引先ID-契約種類 101 - 基本 101 - 業務委託 102 - 基本 102 - 業務委託 どなたか教えてください! 宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>T取引先マスタとT取引先の契約内容 名前だけで中身の情報無しでは推理のしようがありません >契約締結日のところに「Null」値で条件付けしました。 これもそうですね、いきなり契約締結日といわれたって >2.契約締結している取引先マスタ詳細すべて。 取引策マスタの主キー(取引先ID)の抽出条件欄に In (select 取引先ID from T取引先の契約内容) >3.契約締結していない取引先マスタ詳細すべて 同じく Not In (select 取引先ID from T取引先の契約内容)
その他の回答 (3)
- CHRONOS_0
- ベストアンサー率54% (457/838)
>「クエリ式'(((取引先マスタ.取引先ID)In(select 取引先ID from T取引先_契約内容)) AND ((取引先_契約内容>.契約締結日) Is Not Null) AND ((T取引先_契約内容.契約解決日) Is Null))'の構文エラー」 これはエラーメッセージそのままですか? だったらINの前後のスペースが向けていますね >In関数というものがあるのでしょうか? 関数ではありません。演算子です 後ろにレコードセットとかリストを書きその中のどれかに合致するものと言う意味になります
補足: クエリ1: SELECT 取引先.ID, 取引先.名称, 取引先契約履歴.契約区分, 取引先契約履歴.契約締結日 FROM 取引先 INNER JOIN 取引先契約履歴 ON 取引先.ID = 取引先契約履歴.取引先_ID; これだけでも事足りるでしょう。 ※つまり、テーブル設計次第です。
どうも質問内容がよく理解できません。 取引先: ID__名称 1___A社 2___B社 取引先契約履歴: ID__取引先_ID__契約区分__契約締結日 1___________1_________1__2007/11/01 2___________1_________2__2007/11/01 クエリ1: ID__名称__契約区分__契約締結 1___A社___基本______2007/11/01 1___A社___業務委託__2007/11/01 SELECT 取引先.ID, 取引先.名称, 取引先契約履歴.契約区分, 取引先契約履歴.契約締結日 FROM 取引先 INNER JOIN 取引先契約履歴 ON 取引先.ID = 取引先契約履歴.取引先_ID WHERE (((取引先契約履歴.契約締結日) Is Not Null)); どうも質問内容がという理由は、こういう結果もありえて当然ということです。 3.契約締結していない取引先マスタ詳細すべて。 これは、INNER JOIN か LEFT JOIN の問題ではないかと・・・。 クエリ2: ID__名称__契約区分__契約締結日 _______________________________ SELECT 取引先.ID, 取引先.名称, 取引先契約履歴.契約区分, 取引先契約履歴.契約締結日 FROM 取引先 INNER JOIN 取引先契約履歴 ON 取引先.ID = 取引先契約履歴.取引先_ID WHERE (((取引先契約履歴.契約締結日) Is Null)); クエリ3: ID__名称__契約区分__契約締結日 2___B社________________________ SELECT 取引先.ID, 取引先.名称, 取引先契約履歴.契約区分, 取引先契約履歴.契約締結日 FROM 取引先 LEFT JOIN 取引先契約履歴 ON 取引先.ID = 取引先契約履歴.取引先_ID WHERE (((取引先契約履歴.契約締結日) Is Null)); しかし、ここに書いている程度のテーブル設計とSQL文を示せば一発解決じゃないですか?
補足
ご回答ありがとうございます。 教えていただいたとおりにやってみたのですが、構文エラーが出てしまいました。 「クエリ式'(((取引先マスタ.取引先ID)In(select 取引先ID from T取引先_契約内容)) AND ((取引先_契約内容.契約締結日) Is Not Null) AND ((T取引先_契約内容.契約解決日) Is Null))'の構文エラー」 別の行にNULLの抽出値を入れているからでしょうか? 行を入れ替えてみると、構文エラーの配列は変わりますが、内容的には同じ物が表示されます。 In とは、In関数というものがあるのでしょうか? ご負担をかけて申し訳ないのですが、よろしかったら教えてください。