ACCESSでの別のテーブルのデータの参照方法

このQ&Aのポイント
  • ACCESS初心者のため、別のテーブルのデータを参照する方法について教えてください。
  • 「支払」テーブルと「担当表」テーブルがあり、これらを「サービス名」で連結しています。
  • 「支払」テーブルの入力フォームでサービス名を選択する際に、選択したサービス名に対応する担当者名を自動的に表示したいのですが、うまくいきません。助けてください。
回答を見る
  • ベストアンサー

ACCESSでの別のテーブルのデータの参照方法

ACCESS初心者です。 教えてください。 「支払」テーブル、「担当表」テーブルがあります。 「支払」テーブルには、 ID(主キー)、サービス名、金額、支払日 「担当表」テーブルには、 ID(主キー)、サービス名、担当者 という項目があります。 この二つのテーブルは「サービス名」で連結してます。 今「支払」テーブルの入力フォームを作っていて、サービス名をプルダウンで選択出来るようにしたのですが、出来れば選択したら自動的に該当する担当者の名前を表示したいと思っています。 担当者名を表示するためのテキストボックスを作成し、プロパティでいろいろいじってみましたがどうもうまく行きません。 すごく基本的な質問で恐縮ですが、どうか助けてください。 宜しくお願いいたします。

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

  • ベストアンサー
  • you-m
  • ベストアンサー率58% (190/327)
回答No.4

せっかく日付のデータがあるのに、わざわざ月別の集計が必要だからといって月だけのフィールドを追加するのも、あんまりスマートなやり方ではありません。 データベースの目的の一つは、同じ種類の情報を二重管理しない事もあります。 日付から、月だけを抽出するのが自然な方法でしょう。 ですが、SQL云々を悩むよりも、まずウィザードをぐりぐりいじって見てください。比較的単純な月ごとの合計値を出すクエリは10秒で出来ますよ。 クロス集計のクエリ自体は、非常に簡単にできますし、見てみればイメージもわきやすいでしょう。 それでデータが壊れるわけではないし、クエリなんて作っては消しての繰り返しで問題ないです。 もちろん、テーブルを消してしまってはまずいですけど(笑) いろいろ試しているうちに、逆にこういうまとめ方もできるのかといった発見もあるかもしれませんよ。

miku0004
質問者

お礼

いつも丁寧なご回答ありがとうございます。 おっしゃる通り、ウィザードで簡単に集計できましたし、イメージも沸きました。 あとクエリのSQLも見てみましたが「これがSQLか!」って感じでした(以前シスアドの勉強をしていた時に出てまして、その時は全くピンと来なかったんですが…(苦笑))。 まだまだ先は長そうですが、これで何とかなりそうです。 初めてACCESSに触れ、データベース構築方法のとっかかりもなく、途方にくれていたところを助けていただいて感謝しております。 お忙しいところ、初心者にお付き合いいただいて有難うございました。 またつまづいてしまったら、お助けくださいませ。 有難うございました。

その他の回答 (3)

  • you-m
  • ベストアンサー率58% (190/327)
回答No.3

月次の集計自体は、クエリを使えば、都度支払台帳から出せるので、テーブルを作るよりも、いいと思います。 案件別のものであれば、抽出条件として日付とサービスIDに条件を付加すれば、その部分だけ取り出す事は可能です。 SQLで、WHEREを使う部分ですね。 集計が欲しい場合は、クロス集計のクエリを作成します。 SQL的には、GROUP BY句やPIVOTを使うような内容になります。 ある値の月次の集計等が、簡単に出せますし、やはり抽出条件を指定する事で、サービスと月の指定もできます。 いずれも、ウィザードで比較的簡単にたたき台が作れますし、作った後で細かくSQLを修正する事もできます。 ウィザードは、あんまり融通が利きませんので(笑) ただ、担当者については月中で交代とか、サービス毎に1人という状態が、必ず成り立つのでなければ、入れない方がいいでしょう。 ここでテーブルを分けてしまうと、リレーショナルデータベースの一番便利なところを使わずにいる事になりますよ。

miku0004
質問者

お礼

何度もご丁寧にご回答ありがとうございます! まだ「SQL」がどのようなものであるかはちょっとわかりませんが(EXCELは使えるのでPIVOT等は何となく想像がつきますが)、とりあえずテーブルを分けてしまうことが大きな間違いであることは、よくわかりました。 とすると、確認ですが、テーブルを分けずに月毎の集計を出すには、「何月の」サービスなのかという項目が追加で必要になりますよね? 例えば、今まで支払台帳を ID、サービスID、担当者ID、請求額、支払日 としていましたが、 ID、サービスID、サービス提供月、担当者ID、請求額、支払日 として、基本テーブルを組み直せばいい、ということです? そこでSQL(これから勉強します)を使って、サービス提供月を抽出条件に、サービス名を縦軸、担当者名、請求額、支払日を横軸に置きなおして表示をすると、サービス提供月毎の支払状況を一覧で確認できるクエリが完成!ってことですよね。 何度も初心者質問ですみません。。。

  • you-m
  • ベストアンサー率58% (190/327)
回答No.2

基本的にデータベースのマスタと呼ばれるようなテーブルは、ID等のデータを一意に指定出来るようなコードを持って表現するのが、望ましいです。 今回の場合も、担当者とサービスが同じテーブルで無ければ、IDで表現する事に何も問題は無いのです。 先の回答は、データ構造をあまり大きく変更しないように回答したのですが、多分以下のようなデータ構造が本来望ましいのではと思います。 支払台帳 ID、サービスID、担当者ID、請求額、支払日 サービスマスタ ID、サービス名、基本料金、サービス内容、備考 担当者マスタ ID、氏名、備考 まあ、細かいフィールドについては、まだまだ足りない部分もあるでしょうが、私ならこのようなデータ構造にすると思います。 どことどこがリレーションするかは分かりますよね? これなら、過去のデータが矛盾する事無く、担当者やサービス内容についても、独立して管理出来ます。

miku0004
質問者

お礼

たびたびご回答ありがとうございます。 自分で頭をひねったところ、ご回答のようなテーブルを作成するに至りました(「備考」は入れてなかったですけど、これいただきです(笑))。 リレーションはもちろん「支払台帳_サービスID」と「サービスマスタ_ID」、「支払台帳_担当者ID」と「担当者マスタ_ID」ですよね? これをもとに、 サービス名、サービス内容、氏名(担当者名)、請求額、支払日でクエリを作成し、フォームを作ったところ、思い通りの表を作成することができました。 ありがとうございました。 ちなみに質問の内容が変わり、かつ何度も質問して申しわけありませんが、再度質問させてください。 最終的にこの支払管理を月次締めにしていこうと考えています。 例えば4月が役務提供月のサービスの支払状況一覧、5月が役務提供月のサービスの支払状況一覧、という形です。 私の考えとしては、支払台帳をベースにして、4月支払台帳、5月支払台帳、といったものを用意してやっていこうと思い、テーブルを作成しております。 しかし、考え方として、サービスID毎をベースにしてテーブルをつくる方法もあると思います。 例) Aサービス 4月、(4月の)料金、(4月の)担当者、(4月分の)支払日 5月、(5月の)料金、(5月の)担当者、(5月分の)支払日 ・・・ Bサービス 4月、(4月の)料金、(4月の)担当者、(4月分の)支払日 5月、(5月の)料金、(5月の)担当者、(5月分の)支払日 ・・・ 提供されるサービスのラインナップは、月ごとに大きな変化はありません。 もしかすると後者の組み方のほうが賢い、ということはありますでしょうか? やや頭がこんがらがってます。 何卒ご教授ください。 宜しくお願い致します。

  • you-m
  • ベストアンサー率58% (190/327)
回答No.1

恐らく今は入力フォームに対して支払いテーブルを渡しているのでは無いかと思いますが、これを自分で結合クエリを作成して、そのクエリを渡せば良いかと思います。 ウィザードで作れますので、すでにリレーションの設定がされているのであれば、簡単に作成できます。 作成したクエリは、あたかもテーブルであるかのように扱えますので(もちろん全く同じではありませんけど)このような事ができます。 どのような仕様が欲しいのか、具体的には分からないので断言はさけますが、このような使い方をするならば担当表テーブルにはIDは不要かと思います。 私であれば支払いテーブルにサービス名の変わりにサービスIDというフィールドを作成して、それとリレーションさせます。 なぜなら、サービス名は変わるかもしれないからです。 また、担当者名というフィールドも別途支払テーブルに追加します。 そして、入力フォームから支払の記録を入れる際に、サービスIDから担当者名を引っ張ってきて、担当者名を直接そこにいれます。 これは、同じサービスに対して永遠に担当者が変わらないとは限らないからです。 支払は、一度支払ったらその事実が変わる事は無く、また担当者はその時点の担当者の名前が入っていなければなりません。 途中で担当者が変わって、その後に見てみたら、自分では心当たりの無い案件に、担当者として自分の名前が入っているような事態は、避けた方が良いでしょう。

miku0004
質問者

お礼

ご回答ありがとうございます。 出したい要素が別のテーブルに存在する場合は、結合してクエリを作成し、そのクエリを元に入力フォームを作成する、という理解でよろしいでしょうか? 結合クエリは何となくできましたが、なかなか思う通りの形になりません。 しかし地道に勉強して頑張っていこうと思います。 あと薄々気づいていたのですが、ご指摘の通り、そもそもテーブルの組み方に問題がありました。アドバイス通りに作り直してみようと思います。 尚、「担当者名というフィールドも別途支払テーブルに追加します」とありますが、「担当者ID」より「担当者名」のほうがよろしいのでしょうか? 担当者表というテーブルも別途作成し、基本このテーブルは削除なしというルールで担当者もIDで表現した方がより管理しやすいのかな?なんて思いました。意味ないですかね…?

関連するQ&A

  • Access2000:Excelにエクスポート→コンボボックスの値が別フィールドになる

    Access初心者です。お願いします。 コンボボックス参照元テーブルがあり、そこに「ID」、「商品名」のフィールドがあります。 「ID」はオートナンバー型の主キーとなっています。 「商品名」はテキスト型です。 他に「購入一覧」というテーブルがあり、「店コード」、「商品名」、「購入年月日」のフィールドがあります。 こちらは「店コード」が主キーです。 「商品名」フィールドにコンボボックス設定がしてあります。 また、これらと連結したフォームがあり、そこからデータを入力していく方法となっています。 そこで「購入一覧」テーブルをExcelへエクスポートすると、「商品名」の値が「商品名」の名称ではなく「ID」になってしまいます。 <コンボボックス参照元テーブル>   ID  商品名   1   りんご   2   帽子   3   バナナ <Excelへエクスポート後の結果>   店コード  商品名  購入年月日    YY-01    1    2003/6/15    ON-12    3    2003/7/20    SK-13    2    2004/1/22 これをどうにか「ID」の方でなく、きちんと「商品名」にならないものでしょうか。 初めは「ID」が主キーのせいかと思い、「商品名」にし直したり、「ID」フィールドを削除したりしましたが、それだとテーブルにもフォームにも値が表示されなくなったり、選択のプルダウン上では表示出来ても、いざ選択したらレコード上には表示されず空白になったりとメチャクチャになりました。 ちなみに、エクスポート途中にある、「書式を保存」にすると「商品名」がちゃんと表示されます。 でもそれだと同じブック中の別ワークシートとしてはエクスポート出来なくなります。 これではあとでExcel上でまとめる作業が増えてしまいます。 何とか「商品名」の値が表示されるように出来ないものでしょうか。 Win2000/Access2000/Excel2000

  • Access マスターテーブル

    Accessについて。 テーブル1がID(主キー)、注文日、商品番号、納期など入力欄の項目で、テーブル2が商品番号(主キー)、商品名で商品のマスターテーブルになっています。 商品番号を入力すれば商品名が表示されるようにクエリを作成し、そのクエリからフォームを作っています。 ここまでは良いのですが、新しい商品番号を入力したときに限りフォームから商品名も入力する事でマスターテーブルに登録されるようにしたいのですが、どうすれば良いでしょうか?

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

    Access初心者です。教えてください。 Access2003で、 テーブル"部" = 部ID、部名 テーブル"課" = 課ID、部ID、課名 テーブル"班" = 班ID、課ID、班名 テーブル"メンバー" = メンバーID、班ID、メンバー名 もちろん、"部ID"、"課ID"、"班ID"、"メンバーID"は全く重複していません。 上記の4つのテーブルがあり、 テーブル"総合"には、リレーションを作って、"部"、"課"、"班"、"メンバー"をプルダウンで入力したいと思います。 まず、"部"を選択して、 次に"課"を入力するときに、先に入力した"部"に所属する"課"のみをプルダウンで表示させ、 次に"班"を入力するときに、先に入力した"課"に所属する"班"のみをプルダウンで表示させ、 次に"メンバー"を入力するときに、先に入力した"班"に所属する"メンバー"のみをプルダウンで表示させて、入力したいのですが、上手く行きません。 "部"をプルダウンで入力して、次に"課"を入力する時に全ての"課"が表示されてしまいます。(フィルターが掛かっていないのです) リレーションシップで出来ると思うのですが、どのようにすれば良いのでしょうか??

  • Access2000のテーブルのフィールドについて

    Accessのテーブル設計で困っています。 担当者マスターテーブルに担当者CD(主キー)と担当者名のフィールドが入っています。取引先マスターテーブルには取引先CD、取引先名、担当者を2名いれたいのですが、どのようにしたらいいかわかりません。ひとつの取引先に2名の担当者がいる場合どのように管理をしたらいいでしょうか。1つの取引先に対し、1名の担当者だったら、担当者CDをいれクエリで出すことが出来るのですが、2名となるとどうなのでしょう? どなたかご教示ください!よろしくお願いいたします。

  • フォームから2つのテーブルにデータを書き込みたい

    Accessで T_aテーブルとT_bテーブルがありそれぞれのフィールドが以下のようになっているとします。 T_a:フィールド名 データ型    ID  オートナンバー型    商品番号 テキスト型 主キー T_b:フィールド名 データ型    ID  オートナンバー型 主キー    商品番号 テキスト型 このときフォームから入力したデータをそれぞれのテーブルの商品番号に追加したいのですがどのようにすればよいのでしょうか。  よろしくお願いいたします。

  • クエリで同一テーブルの複数回参照について

    顧客情報の入ったテーブルにメイン担当者IDとサブ担当者IDがあり、別テーブルの社員情報から 社員名などを引っ張ってくるクエリを組んでいます。 現在は、メイン担当者名とサブ担当者名を持ってくる為に社員情報を2回追加して、それぞれで 両方にある担当者IDをキーにして結合させているのですが、テーブル1回の追加でメインとサブ両担当者の社員名を持ってくる方法はあるのでしょうか? まだ、ACCESSを勉強中のため色々と調べてみましたが知識不足のためか出来る出来ないの判断も出来ませんでした。 出来ないなら諦めがつくのですが、もし1回の追加で済むならその方がシンプルで良いと思うのでもし方法があるようでしたら教えていただければと思います。

  • Accessのフィルターの実行について【長文です】

    Access初心者です。 教えてください。 テーブル部 = 部ID、部名 テーブル課 = 課ID、部ID、課名 テーブル班 = 班ID、課ID、班名 テーブル"メンバー" = メンバーID、班ID、メンバー名 もちろん、"部ID"、"課ID"、"班ID"、"メンバーID"は全く重複していません。 上記の4つのテーブルがあり、 テーブル総合には、"部"、"課"、"班"、"メンバー"を表形式の入力フォームでプルダウンで選択入力したいと思います。 まず、"部"を選択して、 次に"課"を入力するときに、先に入力した"部"に所属する"課"のみをプルダウンで表示させ、 次に"班""メンバー"も同様に、フィルターを掛けてプルダウンで入力表示させてさせたいのですが、うまくフィルターが掛かりません。 現在トライしている方法は、"部"を入力した後の"課"の入力ですが、 フォームデザイン⇒コンボボックス:部のプロパティ⇒更新後処理でフィルター実行マクロ実施でフィルターを掛けています。 フィルターマクロは、 [Forms]![入力フォーム]![部]=[テーブル課]![部-ID] で、マクロ名は、"課選択"です。 これで、プルダウンで"部"を選択すると、<<オブジェクト'課選択'が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください>>と、エラーメッセージが出ます。 なお、リレーションは取っています。(あまり関係ないと思いますが・・) この方法で間違っているのは何処なのでしょうか?? また、別の方法でプルダウンでフィルターを掛けながら部⇒課⇒班⇒メンバーを入力する方法は有りますか?? ちなみに、使用者は、Access2000、Access2003両方のユーザーが存在しますので、両方での操作が可能で有る事が必要です。私は、会社では2000、自宅では2003で編集しています。 ご教授、よろしくお願いします。

  • Accessのテーブルの作り方について

    Access初心者です。学校のデータベースをAccessで作ろうと思っていますが、テーブルの設計で躓いています。 テーブルの種類 T生徒名簿 ・生徒CD(主キー) ・入会日 ・生徒名 ・フリガナ ・郵便番号 ・住所1 ・住所2 ・TEL ・コースCD ・担任CD ・DM T担任 ・担任CD(主キー) ・担任名 Tコース名 ・コースCD(主キー) ・コース名 ・料金 T教材一覧 ・教材CD(主キー) ・教材名 ・定価 リレーショナルは「T生徒名簿」と「T担任」の担任CD 「T生徒名簿」と「Tコース名」のコースCD にしてあります。 もうひとつ「T必要教材」をつくりたいのですが、どう作ってよいのかわかりません。T必要教材には項目としては「コース名」「教材CD」を入れてコースごとに必要な教材を「T教材一覧」から引っ張ってきたいのですが、コース毎に複数の教材が必要なんです。 例 Aコースは教材1と教材2と教材3が必要。 Bコースは教材1と教材3が必要 Cコースは教材2と教材4が必要 「T必要教材」の作り方ともっと効率的なテーブルの作り方があれば教えていただけませんでしょうか。よろしくお願いいたします。

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

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

  • Accessで別テーブルの値をフォームに表示したい

    初めてのAccessで分からない事があり質問させてください。 <会社テーブル> 会社ID 会社名 住所 <社員テーブル> 会社ID 社員名 ソート番号 *1社に対し複数の社員レコードが存在 以上のようなテーブルがあるとします 現在「会社テーブル」を表形式で一覧表示しています 会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません) 色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません リレーション等でひっぱってくる事ができるのでしょうか? どなたか教えて頂けませんでしょうか 何卒よろしくお願い致します PS.Access2013で作成中です

専門家に質問してみよう