Part3
●
リレーションシップの設定
・
・
・
・
3−1
請求明細の入力を自動化する
品番を入力すると品名や単価などが自動入力されるような機能は、表計算ソフトExselではVLOOKUP関数を使って実現します。Accesでは、リレーションシップを設定して同様の機能が実現できます。
Part3では、Part2で作成した請求明細サブフォームに品番を入力し、品名・単価・単位を自動表示させる方法を解説します。
? データ参照のしくみ
品番を入力すると品名や単価などが自動的に入力される、つまり、あるデータを入力するとそのデータにかかわる別のデータを自動的に表示するというデータ参照処理について、簡単に解説しておきましょう。
データ参照を行うには、外部キーというフィールドが必要になります。
1◆処理の概要
商品テーブル(図3.1)には、商品名を一覧表形式で入力してあります。請求明細(マスター)テーブルに品番を入力すると(図3.2ア)、品番に対応する商品名を商品テーブルから探し(図3.1イ)、請求明細(マスター)テーブルの品名フィールドに表示します(図3.1ウ)。
このようなテーブルとテーブルのつながり、すなわち、商品番号を入力し(問い合わせ)、商品名が戻ってくる(回答)という関係を、リレーションシップといいます。
以上の解説は、実際のAccessの動作と少し異なりますが、このように考えればわかりやすいでしょう。
この動作を実現するには、問い合わせ側のテーブル(ここでは請求明細(マスター)テーブル)と、回答を送る側のテーブル(商品テーブル)にリレーションシップを設定し、問い合わせ側に回答を受け取る窓口を作ることが必要です。
これまでに作成したデータベースでは、結果を受け取る側の請求明細(マスター)テーブルに、商品テーブルの主キー(フィールド[商品ID])と同じフィールドを作成することになります。この同じフィールドのことを外部キーといいます。主キーと外部キーについては、15ページの「A現在の業務からデータベースを考える」でも解説してあります。
ac7h303z
ウ
AC7H304Z
2◆外部キーのフィールドを作る
請求明細(マスター)テーブルに外部キーに使うフィールドを作成します。テーブルにフィールドを追加する方法は、94ページの「Cフィールドを追加・削除する」で解説してあります。
外部キーとなるフィールドは、主キー(商品テーブルのフィールド[商品ID])と同じデータ型にしなければなりません。商品テーブルのフィールド[商品ID]にはオートナンバー型を設定しましたが、オートナンバー型は番号を自動入力するという意味で、入力されるデータは数値型です。したがって、外部キーとなるフィールドは数値型に設定します。両方のテーブルでオートナンバー型を設定すると、テーブルごとに番号が自動入力されて2つのテーブルに矛盾が発生します。
フィールドサイズも商品フィールドに合わせて、オートナンバー型の既定値である長整数型とします。表3.1に、請求明細(マスター)テーブルに追加するフィールドの仕様を示します。
評3.1 請求明細(マスター)テーブルに追加するフィールド
作成するフィールド 設定内容
フィールド名 商品ID
データ型 数値型
フィールドサイズ 長整数型
インデックス いいえ
r>操作
図3.3 ◆[テーブル]をクリックしたデータベースウィンドウ
@フィールドを追加するテーブル名を選択して[デザイン]をクリックする
図3.4 ◆テーブルが開く
Aフィールドを作成する
プロパティが、図3.4と異なる場合は修正します。説明欄の内容(同図ア)は覚書なので、入力しなくてもかまいません。操作後はテーブルを閉じます。
フィールドプロパティは自動的に設定された値をそのまま採用するみとにします。
AC7H305Z
AC7H306Z
3◆リレーションシップの設定手順
外部キーとして使うフィールド[商品ID]によって、リレーションシップを利用したデータ参照を行う準備ができました。次項から具体的にデータ参照の処理を作成しますが、操作工程が長くなるので操作手順の概要を示しておきます。
リレーションシップを設定する……222ページ「Aリレーションシップを設定する」
クエリを作る ……230ページ「Bクエリで複数のテーブルを連結する」
サブフォームの設定を変更する……245ページ「Cサブフォームの設定を変更する」
図3.5
キーワード
■リレーションシップ 2つのテーブル間に存在する同じフィールド(主キーと外部キー)間のつながりのこと
■主キー リレーションシップを設定する一方(実際のデータが記録されているテーブル側)のフィールド
■外部キー リレーションシップを設定する一方(データを受け取るテーブル側)のフィールド
Aリレーションシップを設定する
商品テーブルと請求明細(マスター)テーブルの、2つのテーブルのフィールド[商品ID]にリレーションシップを設定します。
1◆テーブルを登録する
リレーションシップの設定や確認は、リレーションシップウィンドウで行います。リレーションシップウィンドウにテーブルを表示することを、「リレーションシップウィンドウに登録する」と呼ぶことにします。
商品テーブルと請求明細(マスター)テーブルにリレーションシップを設定するので、この2つのテーブルを登録します。フォームなどが開いている状態ではリレーションシップを表示することはできないので、閉じておきます。
>操作
図3.6 [テーブル]をクリックしたデータベースウィンドウ
@[リレーションシップ]ボタンをクリックする
図3.7 リレーションシップウィンドウが開く
ア[テーブルの表示]ダイアログボックスが開く
A[テーブル]をクリックしてテーブル一覧を表示する
B目的のテーブル名を選択する(ここでは「商品テーブル」)
C[追加]をクリックする
図3.8イウィンドウにテーブルが表示される
D2つ目のテーブル名を選択する(ここでは「請求明細(マスター)」)
E[追加]をクリックする
図3.9ウウィンドウにテーブルが表示される
F[閉じる]をクリックする
図3.10 リレーションシップのウィンドウ
エ テーブルの表示枠をマウスのドラッグアンドドロップ操作で広げておくと操作しやすい
図3.10のように、1つのテーブルが1つの枠で表示されます。すべてのフィールド名が表示されるように、各テーブルの枠をドラッグしてサイズを大きくしておきます。
●[テーブルの表示]ダイアログボックスを開く
リレーションシップを設定するテーブル名やクエリ名を選択するダイアログボックスが表示されないとき、あるいは閉じたあとでもう一度表示させたいときは、次の操作でダイアログボックスを開きます。
>操作
図3.11 リレーションシップのウィンドウ
Gウィンドウ内で右クリックしてショートカットメニューを表示する
H[テーブルの表示]をクリックする
図3.12オ[テーブルの表示]ダイアログボックスが開く
I [×]または[閉じる]をクリックして閉じる
AC7H307Z
AC7H308Z
AC7H309Z
AC7H310Z
AC7H311Z
AC7H313Z
AC7H314Z
2◆リレーションシップを設定する
テーブルの表示ウィンドウを閉じて操作します。
リレーションシップウィンドウに表示したテーブルのフィールド名をドラッグして、リレーションシップを設定します。
>操作
図3.13 リレーションシップウィンドウ
@主キーのフィールドを外部キーのフィールドへドラッグアンドドロップする
アドラッグ中のマウスポインタはラベルボックス(四角形)になる
図3.14 リレーションシップのダイアログボックスが表示される
A[作成]をクリックする
図3.15イリレーションシップの接続線が表示される
AC7H315Z AC7H316Z
AC7H317Z
リレーションシップが設定されたことを示す接続線(図3.15イ)が表示されます。ここではまだ、接続線だけが表示されただけで、方向を示す矢印は表示されません。
●連鎖更新と参照整合性
上記で設定したリレーションシップは、すでに入力されているデータを参照する機能をもちます。しかし、ここで設定しようとしているリレーションシップは、請求明細(マスター)テーブルに入力した品番によって、商品テーブルから品名を取り出すという機能です。
新しいレコードに入力したデータをもとに、別のデータを取り出す、つまり、フィールド[品番]に入力したデータによって、別のフィールド[品名]を更新するということです。ここでは、参照することが目的なのではなく、参照したデータをフィールドに入力することが目的です。この更新のことを「連鎖更新」といいます。また、データを参照してデータを一致させるということから「参照整合性」といいます。ここでの目的の機能を実現するためには、リレーションシップの設定を参照整合性にして、連鎖更新を許可するようにすることが必要です。
次に、リレーションシップを編集して、参照整合性を設定します。
3 リレーションシップを編集する
リレーションシップの設定を変更します。このことを、「リレーションシップを編集する」といいます。接続線のショートカットメニューで操作します。
>操作
図3.16@リレーションシップの接続線にマウスポインタを合わせて右クリックする
A[リレーションシップの編集]を選択する
図3.17 リレーションシップのダイアログボックスが表示される
B[参照整合性]欄をクリックしてチェックマークを付ける
C[フィールドの連鎖更新]欄をクリックしてチェックマークを付ける
D[OK]をクリックする
図3.18アリレーションシップの設定が表示される
AC7H318Z AC7H319Z
AC7H320Z
接続線の商品テーブル側に「1」、請求明細(マスター)テーブル側に「∞」記号が表示されました。「1」と「∞」は、レコードの数を表します。問い合わせ側(請求明細(マスター)側)と回答側(商品テーブル側)のつながりは、問い合わせ側の[商品ID]の値は複数、回答側では値は1つということです。図3.19にこの関係を図示します。
商品テーブル 請求明細(マスター)テーブル
商品ID 商品ID
1 2
2 1
3 1 2
4 ∞ 3
↑ ↑
データは重複しない データは重複する
必ず1つ (複数のレコードで同じ値が存在する)
(一覧表に1つだけ) 1つの商品が何回も登場する
(同じ商品を複数販売)
図3.19 1対∞の関係
●結合プロパティ
品番からの品名を取り出すので、1つの品番に対しては品名が1つでなければなりません。問い合わせに対して回答は1つ、つまり、「1対1」の関係があるということです。このことも設定しておくことが必要です。
図3.16〜図3.18と同じように操作します。1対1の関係を設定するには、[両方のテーブルの結合フィールドが同じ行だけを含める。]に◎印を付けます。
>操作
図3.20 [リレーションシップ]ダイアログボックス
@[結合の種類]をクリックする
図3.21 [結合プロパティ]ダイアログボックスが表示される
A[両方のテーブルの結合フィールドが同じ行だけを含める。]に◎を付ける
B[OK]をクリックしてダイアログボックスを閉じる
図3.20[リレーションシップ]ダイアログボックスの[OK]をクリックして閉じる
AC7H321Z AC7H322Z
4◆設定の保存
設定操作が済んだら、リレーションシップのウィンドウを閉じます。メッセージが表示されるので保存します。データベース全体の設定として、すべてのリレーションシップが保存されます。
>操作
図3.22 リレーションシップのウィンドウ
@[×]ボタンをクリックする
図3.23ア保存確認のダイアログボックスが表示される
A[はい]をクリックする
ウィンドウが閉じて、データベースウィンドウに戻ります。
AC7H323Z AC7H324Z
●リレーションシップが設定されたテーブルの確認
リレーションシップが設定されたテーブルを開くと、レコードの先頭に[+]のフィールド列が追加表示されます。この[+]をクリックすると、結合先の請求明細(マスター)テーブルには、リレーションシップを設定した[商品ID]フィールドは表示されません。
>操作
図3.24 リレーションシップを設定した商品テーブルを開く
ア[+]のフィールド列が追加されている
@[+]をクリックする
図3.25イ結合先の請求明細(マスター)テーブルが開く
ウ[−]をクリックすれば連絡先のテーブルが閉じる
Aテーブルの[×]ボタンをクリックして閉じる
AC7H325Z
AC7H326Z
キーワード
■連鎖更新 問い合わせの結果をテーブルに記録することを許可する
■参照整合性 リレーションシップの整合性を常に保つように参照内容を自動更新する
■1対∞ 問い合わせ回数が複数(∞)で回答は常に1つ(1)という意味
■1対1 問い合わせに対して回答が1つであるという意味
Bクエリで複数のテーブルを連結する
請求書フォームに組み込んだサブフォーム(191ページ「Aサブフォームコントロールを使う」参照)に品番を入力して、商品テーブルから品名を取り出して表示するようにします。サブフォームのレコードソースは請求明細(マスター)テーブルですが、さらに、問い合わせの回答をもつ商品テーブルが必要になります。しかし、1つのフォームが2つのテーブルを1つの仮想テーブルに見立て、その結果をフォームのレコードソースに設定します。
1◆選択クエリを作成する
クエリは、複数のテーブルを1つに見立てる機能のほか、検索や集計のための機能ももちます。ここでは、複数のテーブルを1つのテーブルに見立てる機能を解説します。この機能のことを選択クエリといいます。ここでは、商品テーブルと請求明細(マスター)テーブルを1つの仮想テーブルにすることがクエリの目的となります。
●クエリを開く
ウィザードを使ってクエリを作成することもできますが、ここではデザインビューで作成することにします。まず、新規クエリをデザインビューで開きます。
>操作
図3.26 データベースウィンドウ
@[クエリ]をクリックする
A[新規作成]をクリックする
図3.27 [クエリの新規作成]ダイアログボックスが表示される
Bデザインビューを選択する
C[OK]をクリックする
選択クエリがデザインビューで開いて、テーブルの表示ウィンドウ(図3.28)が表示されます。
AC7H327Z AC7H328Z
●テーブルを選択する
商品テーブルと請求明細(マスター)テーブルを選択して、デザインビューの上側のウィンドウに表示させます。次の操作では、商品テーブルだけを選択し、あとで解説するテーブルの追加の操作で請求明細(マスター)テーブルを選択します。
r>操作
図3.28 デザインビューで開いたクエリ
@[テーブル]タブをクリックする
Aクエリに追加するテーブル名を選択する(ここでは「商品テーブル」を選択)
B[追加]をクリックする
図3.29アテーブルが追加(表示)される
C[閉じる]をクリックして[テーブルの表示]ダイアログボックスを閉じる
図3.30 デザインビューで開いたクエリに戻る
図3.28のように[テーブルの表示]ダイアログボックスが自動的に開くのは、新規作成のクエリの場合、またはテーブルが1つも表示されていないクエリを開いた場合だけです。
AC7H329Z
AC7H330Z
AC7H331Z
●テーブルを追加する
クエリにテーブルを追加します。
>操作
図3.31@テーブルの表示されていない部分で右クリックしてショートカットメニューを表示する
A[テーブルの表示]をクリックする
図3.32ア[テーブルの表示]ダイアログボックスが表示される
B追加するテーブルを選択する(ここでは請求明細(マスター)テーブルを選択)
図__C[追加]をクリックする
イテーブルが表示される
ウリレーションシップの接続線が表示される
D[閉じる]をクリックする
なお、テーブル間のリレーションシップが設定されていると、接続線も自動的に表示されます。
これでクエリを作成する準備ができました。次に、フィールドを登録します。
AC7H332Z
AC7H333Z
AC7H334Z
2◆フィールドリストに登録する
追加したテーブルから必要なフィールドを選んで、クエリのフィールドリストに登録します。クエリのウィンドウの下部分の一覧表示形式の部分がフィールドリストです。請求書フォームのサブフォームに品名を自動表示することが目的ですから、必要なフィールドというのはサブフォームに表示するフィールドということになります。サブフォームに表示するのは、請求明細(マスター)テーブルのすべてのフィールドと商品テーブルのフィールド[品名]です。登録するフィールドは、図3.33のようになります。
請求明細(マスター)テーブルのすべてのフィールドをクエリに登録するには、3つの操作方法があります。1つずつ紹介します。
請求明細(マスター)テーブル
行番
請求書番号
品番
品名
数量 請求明細(マスター)テーブルのフィールド
単価
金額
商品ID (外部キー) 選択クエリ
商品テーブル 商品テーブルのフィールド
品名
図3.33クエリに登録するフィールド
●ドラッグアンドドロップで登録する方法
テーブルに表示されているフィールド名をドラッグして、フィールドリストのフィールド欄にドロップする方法です。フィールド名が隠れているときは、スクロールして表示させます。ドラッグ中は、マウスポインタはラベルボックスの形になります。
>操作
図3.34@登録するフィールドをフィールドリストの登録位置へドラッグアンドドロップする
図3.35アフィールドが登録される
AC7H335Z
AC7H336Z
●一覧表で選択して登録する方法
フィールドリストの[フィールド]欄と、[テーブル]欄に表示される[▼]ボタンをクリックすると一覧が表示されます。その一覧からテーブル名やフィールド名を選択して登録することができます。テーブル名を先に選択しておくと、そのテーブルのフィールドだけが一覧になるので操作しやすくなります。
>操作
図3.36@フィールドリスト[テーブル]欄をクリックすると[▼]ボタンが表示される
A[▼]ボタンをクリックしてテーブル一覧を表示する
図3.37B目的のテーブル(ここでは請求明細(マスター)テーブル)をクリックする
図3.38アテーブル名が登録される
C[フィールド]欄をクリックすると[▼]ボタンが表示される
D[▼]ボタンをクリックしてフィールド一覧を表示する
図3.39E目的のフィールド(ここでは[請求書番号])をクリックする
図3.40イフィールドが登録される
テーブル名を指定せずに[フィールド]欄をクリックすると、図3.41ウのようにテーブル名を含めたフィールド名が表示されて、操作しにくくなることがあります。
AC7H337Z AC7H338Z
AC7H339Z AC7H340Z
AC7H341Z AC7H342Z
●まとめて登録する方法
テーブルに登録されているフィールドを、まとめてクエリのフィールドリストに登録することができます。クエリのウィンドウのテーブルに表示されているフィールドを複数選択し、ドラッグアンドドロップでフィールドリストに登録します。
>操作
図3.42 @範囲の先頭をクリックして反転表示にする
A([Shift]キーを押しながら[↓]キーを押して範囲を反転表示にする)
図3.43 B反転表示の部分をフィールドリストにドラッグアンドドロップする
図3.44 アドロップした位置から右に続くフィールドに登録される
ac7h343z AC7H344Z
AC7H345Z/AC7H346Z
AC7H347Z
以上の操作で請求明細(マスター)テーブルのフィールドが、すべてフィールドリストに登録されました。
●商品テーブルのフィールド[品名]を登録する
次に商品テーブルのフィールド[品名]をフィールドリストに登録して、フィールド登録の操作は完了します。
>操作
図3.45@スクロールバーを操作して空いているフィールドを表示する
A商品テーブルの[品名]をドラッグアンドドロップでフィールドリストに登録する
図3.46ア必要なフィールドをすべて登録したクエリ
AC7H348Z
AC7H349Z
●フィールドの削除
フィールドをまちがって登録した場合は、削除します。
>操作
図3.47 @ 削除するフィールド名をクリック
A [Delete](または[BackSpace])キーを押してフィールド名を消し、[Enter]キーを押す
図3.48 ア フィールド名とテーブル名が削除されて、列が空き状態になる
AC7H350Z AC7H351Z AC7H352Z
●列の削除
フィールドを列ごと削除するには、フィールドリストの上部に表示されている列バーのショートカットメニューを使います。列バーにマウスポインタを合わせると、マウスポインタの形が下向きの矢印に変わります。
>操作
図3.49@列バーを右クリックする
図3.50ア列が反転表示になり、ショートカットメニューが表示される
A[切り取り]を選択する
図3.51イ列が削除される
この操作で列を削除すると、右に続くフィールドが左に移動します。図3.49〜図3.51の操作例では、削除した列の右にフィールドが登録されていないので、移動のようすがわかりませんが、実際は右のフィールドが1つ左に移動しています。
AC7H353Z
AC7H355Z AC7H356Z
●作成するフィールド一覧
図3.52にここで作成するクエリのフィールド一覧を示します。本書の解説や図と同じ結果を得るには、同じフィールドを同じ順序で登録しておくことが必要です。
AC7H359Z
請求明細(マスター)
AC7H360Z
請求明細(マスター) 商品テーブル
3◆クエリの結果を確認する
表示をデータシートビューに切り替えると、クエリの結果が表示されます。
>操作
図3.53 @[ビュー]ボタンをクリックする
図3.54 ア データシートビューに切り替わる
図3.55 ア 表示が途切れているときスクロールバーを操作して右に続くフィールドを表示する
AC7H361Z/AC7H362Z
図3.54、図3.55のようにフィールドが並びましたが、品番によって品名を自動表示させるという結果になっていませんし、品名だけではなくて請求明細(マスター)テーブルに入力した品番も表示されていません。これは、操作や設定がまちがっているのではなく、入力してあるデータに問題があるのです。
ここまでの操作では、リレーションシップはフィールド[商品ID]に設定してあります。しかし、まだ請求明細(マスター)テーブルのフィールド[商品ID]にデータを入力していないので、このような結果になっているのです。
4◆クエリを保存する
新規作成したクエリを、いったん閉じましょう。保存の確認メッセージが表示されたら、適切な名前を入力して保存します。ここでは、「請求明細クエリ」とします。
>操作
図3.56@[×]ボタンをクリックする
ア保存確認のダイアログボックスが表示される
A[はい]をクリックする
図3.57 クエリ名の入力ダイアログボックスが表示される
B適切な名前を入力する(ここでは「請求明細クエリ」)
C[OK]をクリックする
図3.58 データベースウィンドウに戻る
イクエリ名が表示される
AC7H364Z
AC7H365Z
AC7H366Z
5◆データを入力したクエリの機能
問い合わせを行う側の請求明細(マスター)テーブルのフィールド[商品ID]に適当なデータを入力して、品名の自動表示が正しく行われることを確かめます。入力するデータは品番ではなく、商品IDの番号であることに注意しましょう。
>操作
図3.59 データシートビューで開いた請求明細(マスター)テーブル
アまだ何も入力されていない
フィールドがウィンドウからはみ出している場合、スクロールバーを操作してフィールド[商品ID]を表示する
AC7H367Z
フィールド[商品ID]の新規レコード(最下行)に「0」が表示されているのは、データ型が数値型だからです。すでにデータが入力されているレコードが空白なのは、データを入力した時点でフィールド[商品ID]が存在しなかったからです。この現象は、動作に影響しないので詳しい解説は省きます。
●商品IDを入力する
フィールド[商品ID]に適当な値(商品テーブルに登録されている値)を入力します。フィールド[品番]には値を入力してあるので、その値をフィールド[商品ID]に入力してもよいのですが、あとで結果を確認しやすくするために商品IDには品番と一致しない値を入力します。抽出で求めた値と比較するために、あえて異なる値を入力しておくということです。
>操作
図3.61 商品テーブル(データシートビュー)
ア商品IDの値を入力する
図3.62@請求明細(マスター)テーブルを開く
図3.63A適当な値を各レコードに入力する(品番に対応する商品IDを入力する)
B データ入力後は[×]をクリックして閉じる
データを入力したら、テーブルを閉じてクエリを表示して結果を確かめます。参考図(商品テーブル)の商品IDの値を入力します。
AC7H368Z AC7H370Z
AC7H369Z
参考図 商品IDの値
AC7H646Z
●クエリの結果を見る
データベースウィンドウの[クエリ]タブの[請求明細クエリ]を選択して、[開く]をクリックするとクエリの結果が表示されます。
図3.54、図3.55では何も表示されませんでしたが、上記の操作で商品IDを入力したので、商品IDに対応する品名が表示されます。
>操作
図3.64@[請求明細クエリ]を開く
図3.65 データシートビューにする
図3.66Aスクロールバーを操作して品名を表示する
ア品名が表示されている
AC7H372Z
AC7H373Z
AC7H374Z
●更新を確認する
入力した商品IDを変更すると、品名も同時に更新されることを確かめましょう。すでに入力している商品IDのどれかを書き換えてみます。確認後は、クエリを閉じます。
>操作
図3.67@商品IDの入力内容を書き換える(図では1行目の1を4に書き換える)
ア入力を決定([↓]キーを押すなど)すると商品IDに合った品名に変わる
AC7H377Z
AC7H378Z
クエリを開くと、リレーションシップを設定したデータが自動的に並べ替えられることがあります(テーブルやクエリを閉じて、もう一度開いたときなど)。これにより、本書の画面例とは異なることがあります。
キーワード
■選択クエリ 複数のテーブル、あるいは1つのテーブルからデータを選択して抽出するはたらきをもつクエリ
■フィールドリスト クエリやテーブルに登録したフィールドを一覧表示させたリストのこと