• ベストアンサー

リレーションシップの作り方について教えて頂きたいです。(アクセス)

私はアクセス初心者です。(アクセス2000です) 今現在、市販のソフトで手の届かない分を必要な分だけデータを抜き出してきて使用しています。 そこには、必要なテーブルが3つのテーブルが存在します。 (例) 【T伝票】   {個人ID} {ペットID} {} {} {} 【T個人mst】 {個人ID} {個人名前} 【Tペットmst】{個人ID} {ペットID} {ペット名前} (【】はテーブル、{}はフィールドです。) 【T伝票】の内容を名前入りで表示し、伝票内容を編集していきたいと思っていたのですが、うまくできません。まず、クエリを作ってみているのですが、リレーションシップの作り方がおかしくデータ変更できなくなってしまいます。始めは、IDの数字だけ見て編集していましたが、データが多くなり、時間がかかって仕方ありません。長い間困っています。どうすれば良いのか、良い解決方法をお待ちしております。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.5

念のためWindows2000 SP4 & Access2000 SP3 で試しましたが問題なかったですよ? 前回と一部ダブりますが(少し例に間違いがありました) T個人Mst ☆個人ID,個人名前 1,いち 2,に 3,さん TペットMst 個人ID,ペットID,ペット名前 1,1,いちペット1 1,2,いちペット2 2,1,にペット1 T伝票 ☆伝票No,個人ID,ペットID,その他 1,2,1 2,1,1 ☆印が主キーです。 SELECT T伝票.伝票No, T伝票.個人ID, T伝票.ペットID, T伝票.その他, T個人Mst.個人名前, DLookUp("ペット名前","TペットMst","個人ID =" & nz(T伝票.個人ID,0) & " And ペットID = " & nz(T伝票.ペットID,0)) AS ペット名前 FROM T伝票 LEFT JOIN T個人Mst ON T伝票.個人ID=T個人Mst.個人ID; サポートされていません? クエリ → 新規作成 → デザインビュー を選択 テーブルの表示 が現れますので ESC で閉じます(テーブルを加えない) クエリの窓の上の枠を右クリックして現れるメニューからSQLビューを選択 すると窓の中に、SELECT; ←これだけが有りますので消します。 前述のSQL文を貼り付けます。 もう一度右クリックしてデータシートビューかクエリデザインに切り替えられませんか? これでも同じく「サポートされていません」だと私も分かりません Dlookup自体は分かりますよね?ヘルプでも詳しい説明があります。 nz(T伝票.個人ID,0) → T伝票.個人ID nz(T伝票.ペットID,0) → T伝票.ペットID にすると分かりますが、上記クエリで入力中に、個人ID・ペットID が 空白だと、個人名前・ペット名前にエラーが出ますので、その回避のためです。 nz 関数で括って空白の場合には0(ゼロ)を返しています。 書籍に関しては人によって好みが分かれますが 1・テーブル設計40% クエリ40% その他20%。 2・フォーム・レポートをVBAを主体に解説したもの 3・一つのテーマに絞ってテーブル設計からアプリ完成まで。 の3冊位は読んどいたほうが良いと思います。 No1は読んでいても退屈なのですがテーブル設計はAccessに限らず データベースの肝(キモ)ですので我慢してください。 偉そうに言ってますが私もテーブル設計を疎かにして・・・ WEB上で強力なところ http://www.moug.net/boards/index.htm http://www.accessclub.jp/index.html http://www.mahoutsukaino.com/

bull33
質問者

お礼

ありがとうございました。 懇切、丁寧に指導いただいて、何とか出来ました!! これからもアドバイスを元に勉強してゆきたいとおもいます。 お助け頂いて心より感謝、申し上げます。

その他の回答 (4)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.4

多分現状では T個人Mst 個人ID,個人名前 1,いち 2,に 3,さん TペットMst 個人ID,ペットID,ペット名前 1,1,いちペット1 1,1,いちペット2 2,2,にペット1 とかになっているのでは? 下記を新規クエリのSQLビューに貼り付けて試してみてください。 当方Access2002 SELECT T伝票.伝票No, T伝票.個人ID, T伝票.ペットID, T伝票.その他, T個人Mst.個人名前, DLookUp("ペット名前","TペットMst","個人ID =" & nz(T伝票.個人ID,0) & " And ペットID = " & nz(T伝票.ペットID,0)) AS ペット名前 FROM T伝票 LEFT JOIN T個人Mst ON T伝票.個人ID=T個人Mst.個人ID;

bull33
質問者

お礼

ありがとうございます! 御察しのとおりです。 何分にもかじったばかりで、SQLを使ったことがなかったのですが、入力してみました。どこか入力がおかしいのか、サポートされていませんと出ました。  DLookup関数の条件式のところが、本を見てもわかりませんでした。具体的には、nz式と&と”の使い方がわかりません。よろしかったら、勉強方もあわせて、教えていただけませんでしょうか。

noname#192382
noname#192382
回答No.3

No2です。 No2のようにリレーションができているものとしてクエリーを設定します。クエリー伝票Qの作成に当たって三つのテーブルT伝票、T個人mst,Tペットmstを追加します。 クエリーに載せるフィールドは T伝票からはぺっとID,フィールド1、フィールド2、 T個人mstからは個人IDと個人名前、 Tペットmstからは個人ID,ペットID,ペット名前です。 これでクエリーを実行します。これでうまくいくはずですが・・・ ただ気にかかることはTペットのテーブルの中にぺっとIDの同じものがたくさんあるような記載がありますが、これは許されないことです。このテーブルのなかではペットIDはひとつしかでてこないはずです。 

bull33
質問者

お礼

ありがとうございます。 前述の通り、データを抜き出して使用しており、ペットIDは複数存在します。 そのソフトは、データ保存用として、アクセスを使用しているだけだそうです。すみません。

noname#192382
noname#192382
回答No.2

No1の修正、補足をいたします。 テーブルT伝票の フィールド 個人ID,ペットID,フィールド1、ふぃーるど2 テーブルT個人mstのフィールド個人ID,個人名前 テーブルTペットmstのフィールド 個人ID,ペットID、ペット名前 という条件の下で リレーションはT伝票のペットIDとTペットmstのペットIDの間にもうひとつのリレーションはTペットmstの個人IDとT個人mstの個人IDの間だけに結ぶようにするとうまくいくようです。だからT伝票の個人IDはリレーションづけからはずしてあります。 うまくいくという意味はクエリーにおいてたとえばぺっとIDだけの入力でペット名前が引き出せるし個人IDの入力により個人名前を引き出すことができます。

bull33
質問者

お礼

お助けいただいてありがとうございます。 クエリ [伝票Q]を{個人ID}{個人名前}{ペットID}{ペット名前}{1}{2}でしたのですが、{個人名前}に{個人ID}とは無関係な人の羅列が表れ、入力できません。【Tペットmst】の{ペットID}は同じ番号がいっぱい入っています。

noname#192382
noname#192382
回答No.1

リレーションが成功しないのはT伝票とTペットmstの二つのテーブルで個人IDとペットIDの関係を二重に規定しているためだと思います。 Tペットmstのテーブルから個人IDを削除するとよいと思います。わたしのテストランではうまくいきました。

bull33
質問者

お礼

迅速な回答ありがとうございます。 実は、実務では、イメージのわきにくい例だったので、あえてペットにしたのですが、 【Tペットmst】には、テーブルがまだあり、さらに、そのデータ内で、IDといえども{ペットID}が重複して存在しているのですが、どう考えればよいでしょうか? {個人ID内}では{ペットID}は唯一(ユニーク?)です。 カジリたてで質問の仕方が悪く申し訳ございません。

bull33
質問者

補足

>【Tペットmst】には、テーブルがまだあり、 →【Tペットmst】には、フィールドがまだあり、 です。失礼いたしました。

関連するQ&A

  • Access2013のリレーションシップについて

    Access2013を勉強しています。 リレーションシップについて参考書(2冊)を見ていて疑問を持ったのですが、 二つのテーブルでリレーションシップを定義したいそれぞれのフィールド名は同じ名前だとうまくいかないのでしょうか?参考書では、値は同じ(例えば1、2、3・・・)は同じなのにフィールド名は微妙に違う名前をつけているのですが(例えばテーブルAでは顧客IDでテーブルBでは取引先ID)・・・ 宜しくお願いします。

  • access2002のリレーションシップについて

    accessで作ったデータベースで新たにリレーションシップを設定しようとすると、まだ自分では何も設定していないにも関わらず勝手にリレーションシップが設定されていることがあります。 内容としては「MSysAccessStora」というフィールドリスト名で内容はDateCreate/DateUpdate/Id/Name/ParentId/Type とフィールド名が並んでいます。 これは何でしょうか? このデータはFOM出版のMOS対策テキストのデータなのですが、こんな名前のテーブルなどは存在しないのですが・・・ わかる方いらっしゃったらよろしくお願い致します。

  • Accessリレーションシップ

    Accessにて、 テーブルA(個人情報) ●個人コード ●名前 ●住所  ・  ・ テーブルB(個人ごとの数量管理) ●個人コード ●数量 上記のようなテーブルがあるとします。 これは、1:1のリレーションシップにしたいのですが、 クエリAを作成して ●個人コード(テーブルB) ●名前(テーブルA) ●数量(テーブルB) 個人コードを入力すると、名前を参照するというふうに したいのですが、1:1のリレーションシップだと個人コードの入力時に 参照はできないのでしょうか? 一旦閉じて、開くと参照していますが・・・。 良いご意見がありましたら、よろしくお願いします。

  • ACCESSのリレーションシップについての疑問

    ACCESS初心者です。 ACCESS2002 OSはWindowsXP SP2です。 基本が分かっていないせいなのかもしれませんが、私には理解できない現象が起こっています。対応方法があれば教えていただくようお願いします。 ACCESSでデータ更新のフォームを作っています。 そのフォームは2・3日前に作ったもので、たとえばテーブルAを更新するためにマスターテーブルのBとCを参照しているような形になっています。このリレーションはクエリで指定してあります。 このフォームではクエリに対して更新する形になっています。 このフォームのデザインを編集しているときに「ツール」の「リレーションシップ」をクリックすると画面にはBとCだけが表示されます。 なぜメインのテーブルのAが表示されないのか?と思いながら、しょうがないので右クリックして「すべてのリレーションシップの表示」を押すと、驚いたことにDのテーブルが表示されました。 実はこのDというテーブルは以前に作ったAを作る前に使っていたAによく似たテーブルなのです。 当然、以前にはDとB・Cのリレーションも作っていましたが、今編集中のフォームではDは関係ありません。 リレーションシップの画面は不必要に広大なもので横に3スクロール分と縦にも5スクロール分くらいあって、その右下の端っこにD・B・Cのリレーションだけが表示されていて、それ以外はただただスペースがあるだけです。 なぜ肝心のA・B・Cのリレーションが表示されずD・B・Cのリレーションが表示されるのでしょう? 試しに今では不要であるDのテーブルを削除してみましたがリレーションシップではさすがにDは消えたもののB・Cが表示されるだけで、Aは出てきません。 そもそもACCESSにおけるリレーションシップというのは個々のフォーム内で定義されるものではないのですね?(根本的なことで申し訳ないのですが、買った2冊の本を見てもインターネットで探してもその辺の説明が見当たりませんでした) SQLであれば個々のSQL文で都度JOIN等の記述をすると思うのですが、ACCESSではデータベース全体の共通事項(?)としての定義になるのでしょうか? ACCESSは初心者で見当はずれな質問かもしれませんがどうかよろしくお願いします。

  • access2007 リレーションシップについて

    アクセス初心者です。 テーブルを複数作成しました。 これをリレーションシップをしたいと思うのですが、「主キー」の扱いに悩んでいます。 参考書などは主キーともう1つのテーブルの同じ項目名でかつ主キーでないものを結んでいますが、主キー同志は結んではいけないですか? メインで使うテーブルのIDを支点に、他の複数のテーブルのIDを放射状に結びつけて関連付けたいと考えています。 どのようにして作成していけばできますか? そのようなことができないのでしたら、どのようにしたらできますか?

  • アクセスのリレーションシップについて

    ACCESS のリレーションシップについて教えてください! 今、 ★基本情報(会社情報)   L★会社毎案件情報     L★案件毎履歴 を 3つのテーブルで  1対多 のリレーションシップを組んでいます。 ここまではいいのですが、  企業毎の案件が無い場合で 企業毎に アプローチ履歴を つけるとしたらどのようにリレーション組んだらよろしいでしょうか? ↓このようにテーブルを組みたいと考えてます。 ★基本情報(会社情報)(主キー企業ID) | L★会社毎案件情報(主キー案件ID) |   L★案件毎履歴 L★会社毎履歴 ★会社毎履歴 の には 企業ID と 履歴IDの数値型を  おいてますが、1つのテーブルから 2箇所のテーブルへ  1対多  はいくらやってもできなかったのでこのような  形で運用できる 方法があれば教えてください。 アクセスははじめたばかりで、なるべくクエリや、 なるべくシンプルで簡単な方法があればご伝授いただければと 思いますなにとぞよろしくお願いいたします。 

  • アクセスのリレーションシップに関して

    アクセスでDBを構築して業務で使用しているのですが、容量がかなり大きくなってきたのでデータと、フォーム等による入力・検索を別DBで実施したいと思っています。そこで、元DBをコピーしてコピー先のテーブルを全て元DBからのリンクにしようとしたのですが、リンクを貼った後にテーブル名を置き換えしようとするとリレーションシップを削除しろというメッセージがでてしまいます。下手くそなシステムで、後でリレーションシップを貼りまくっているので、いちいちリレーションシップ削除・再構築をしようとすると膨大な作業になってしまいます。どなかか、リレーションシップを削除せずにテーブルを置き換える方法をご存知ないでしょうか。

  • アクセスで、リレーションシップをかけると更新出来ない?

    すみません。以下の事項を教えて下さい。 テーブル名:T_メール本体 (フィールド項目は) ID(主キー) 宛先名 件名 本文 テーブル名:T_宛先リスト (フィールド項目は) 名前 アドレス この2つのテーブルに、宛先名と名前のフィールドをリレーションシップをかけると未定義と出ます。このクエリー:SELECT T_メール本体.宛先名, T_メール本体.件名, T_メール本体.本文 T_宛先リスト.アドレス FROM T_メール本体 LEFT JOIN T_宛先リスト ON T_メール本体.宛先名 = T_宛先リスト.名前; は、ただ表示が出来るだけで、内容の変更更新、追加が出来ないんです。どこかがおかしいんでしょうか? よろしくお願いします。

  • 正規化・リレーションシップについて

    テーブル(表)というのは、売り上げ伝票とうをデータに起こしたものだと思っております。 その中で、起票したテーブルを 部分的・推移的関数を排除すれば第三正規化までが出来ると考えております。 「質問1」 つまり正規化で対象となる表は、起票したデータ(表=伝票等)が対象になる? で間違い無いでしょうか? 「質問2」 1つのデータ(表=伝票等)を、正規化したため、 その関連付けるために、リレーションシップというのがあるのでしょうか?

  • アクセス2000のルックアップ設定後のリレーションシップ

    アクセス2000のルックアップを設定後のリレーションシップが自動で作成されることは理解しています。テーブル4つの内1つ(データの流れ的に最後に相当)に設定しました。リレーションシップ線が4つできてしまい、テーブル名がテーブル名に1、2、3と増えてしまいました。邪魔なのでリレーションシップから「テーブルを表示しない」を押し消しても作業してからリレーションシップを確認すると再度表示されてしまいます。また解除(テーブルをデザインモードにして、標準横のルックアップタブを押し、表示コントロールをテキストにする)をしてもリレーションシップの線が消えません。なにか操作方法がおかしいのでしょうか?機会の誤動作でしょうか?

専門家に質問してみよう