• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセス2007 クエリの作り方)

Access 2007のクエリ作成方法とダイナセットのリレーション

このQ&Aのポイント
  • Access 2007のクエリの作り方について、テーブルAとテーブルBをリレーションさせる方法を教えてください。
  • クエリ1では、「年齢」を計算してテーブルAに追加しました。クエリ2では、テーブルBの年齢とクエリ1の年齢をリレーションさせています。
  • アクセスはまだ理解が不足しているため、ダイナセットでレコードの更新を行いたいと思っています。どのようなリレーションを行えば良いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.5

> 更に、「テーブルB」の年齢と「クエリ1」の年齢をリレーション(多対1?)して > 「クエリ2」としました。 使用されているのがAccessなのでしたら、テーブルBとクエリ1を結合させるのではなく、 クエリ1の『年齢』をコンボボックス表示にされてはいかがでしょうか。 添付画像のようなクエリを作成したら、「項目: 年齢」のフィールドのプロパティシートで 『ルックアップ』タブを選択し、『表示コントロール』に「コンボボックス」を指定します。 そうすると、その下に新たに項目が表示されるので、以下のように設定してください: 値集合タイプ: テーブル/クエリ 値集合ソース: テーブルB 連結列:     1 列数:      2 列幅:      0cm;3cm ([「3cm」の方は適当でOkです) これなら、クエリ1(テーブルとしてはテーブルA)だけが元になっているので、演算を行って いない氏名や生まれ年のフィールドの編集に制限は掛かりません。

situmonnsya
質問者

お礼

すごい!! 出来てしまいました。こんな方法があったのですね。 私の質問のように、計算結果に他のテーブルフィールドを結合させたい場合って、結構あるのではないでしょうか? これで「矛盾を許す」から解放でスッキリです。 フォームで使うので、このコンボボックスにはフォーカスが入らないようにし、又ドロップダウンの矢印も隣のフィールドで隠すと、見た目も良くなりました。 ありがとうございました。 感謝致します。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.4

「矛盾を許す」でできるようですが、 基本原則は「できない」としたものです。 今後のDB設計で1:nのn側は更新できないことを 忘れないようにしてください。他のDBシステムと Access以外の組合せでは「矛盾を許す」という 選択肢はありませんから・・・

situmonnsya
質問者

お礼

>他のDBシステムとAccess以外の組合せでは・・・ そうですよね。やっぱり・・ ありがとうございました。

すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.3

試してみました。基本的には「ダイナセット (矛盾を許す)」で良いようです。いくつか留意点ももあります。 フォームに利用したSQL文は SELECT テーブルA.ID, テーブルA.氏名, テーブルA.生れ年, IIf(Year(Date())-[生れ年]>59,60,IIf(Year(Date())-[生れ年]>19,20,10)) AS 年齢, テーブルB.項目 FROM テーブルA, テーブルB WHERE (((IIf(Year(Date())-[生れ年]>59,60,IIf(Year(Date())-[生れ年]>19,20,10)))=[テーブルB].[年齢])) ORDER BY テーブルA.ID; テーブルAのID順に表示するようになっているのは、これなしだと順番が変わって試験がやりにくかったためです。また生まれ年が切りの良い数字でなくても、三分類のどれかに入るようにしています。 生まれ年を変更した際に「少年/成人/還暦」が直ちに変わるためには、当該テキストボックスの、変更後イベントに「再クエリ」を指定します。

situmonnsya
質問者

お礼

試して頂き、ありがとうございます。 実際のデータでは「項目」が3つだけでなく、IIf文の多用もつらいと感じています。 >基本的には「ダイナセット (矛盾を許す)」で良いようです 「矛盾を許す」という文言になんとなく矛盾を感じますが、このままでいいかなぁ、と。 ありがとう、ございました。

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.2

>フォームにて「氏名」「年齢」の訂正、修正 「年齢」は計算した結果であって、これを格納した フィールドの反映ではありませんよね。 「入れ物」となるフィールドやテーブルが無いのに 更新した値を何処に記録すると言うのでしょう? クエリ1か2と同じフィールド構成を持つテーブルを 定義し、これをレコードソースとしたフォームにする 必要があります。尚、クエリ1と同じレイアウトの テーブルを作っても、テーブルBと結合すると、1:nの n側になってしまうので更新できなくなります。 こういう条件を理解したうえで、テーブル設計を やり直した方がよいと思いますよ。

situmonnsya
質問者

お礼

間違いました。「年齢」の修正ではなく「生まれ年」でした。 >テーブル設計をやり直した方がよいと思いますよ はい、そうしたいのですが、いまいちアクセスの理解が浅くて。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.1

>リレーション クエリの結合条件のことでは? >更新ができません どのテーブルのどのフィールドを更新したい のでしょう? クエリは結果なので、更新を記録する実体が ありません。更新(または挿入/削除)は 対象となるテーブル(クエリではない)がある はずです。 また、テーブルを結合した場合、1:1か1:nの1側しか 更新できません。

situmonnsya
質問者

補足

>クエリの結合条件のことでは? クエリのデザインビューで、クエリ1の「年齢」とテーブルBの「年齢」を結合しています。 >更新ができません 正しくは、フォームにて「氏名」「年齢」の訂正、修正、新規レコードの追加ができません。 >クエリは結果なので >1:1か1:nの1側しか更新できません。 了解しました。 すると質問のような場合、どのようなデーター構造にしたらよろしいのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A